IP0_Verilog实现基于双线性插值算法的图像放大IP设计
Verilog實現基于雙線性插值算法的圖像放大IP設計
本文主要介紹一下verilog實現基于雙線性插值算法的圖像放大IP的實現思路,最終利用該方法實現了實時的圖像放大處理。關于雙線性插值的原理,網上有很多講解的特別好的帖子,本文就不再贅述原理部分,而是重點根據該原理設計硬件實現方案。
背景
隨著各種處理平臺的計算能力的逐步提升,人們在各個領域對于視頻圖像的清晰度以及分辨率要求越來越高,然而有時在數據源端并不能直接獲得高分辨率的視頻或圖像,這時候往往希望可以將獲取的視頻或者圖像進行放大后在輸出給后端或者直接用于顯示,(1) 比如在紅外領域,由于目前的紅外傳感器的分辨率都比較低,為了得到高分辨率圖像經常會使用圖像放大方法進行處理;(2) 在某些視頻圖像處理應用中,希望可以將原始圖像的中的部分區域放大到全幅面輸出,這也需要用到圖像放大處理。
目前在圖像放大算法方面,較為常用的傳統方法包括最鄰近插值、雙線性插值、雙三次插值、多項插值等等,近年來基于深度學習/神經網絡的圖像放大方法取得了更好的效果,這些方法在基于PC的平臺都比較容易實現。然而對于硬件應用領域(FPGA或IC),仍然是傳統方法所占比重較大,傳統方法中最鄰近插值算法計算量最小,但是這種方法得到放大圖像中經常會存在很嚴重的鋸齒,而雙線性插值方法的計算量稍大一些,但是圖像放大效果也較最鄰近插值提升很多,而對于雙三次插值、多項插值等算法,效果比較好但是計算很復雜,因此本文的重點是基于雙線性插值算法設計圖像放大IP,可以應用于IC或者FPGA實現實時的視頻放大處理,在文章的最后,介紹了本IP消耗的資源以及功能仿真結果。
本文設計的圖像放大IP的規格
clk :源數據像素時鐘信號
clk_proc:處理時鐘信號
rst_n :復位,低電平有效
vsync_i :視頻數據流場(幀)同步信號
de_i :視頻數據流數據有效信號
data_i :視頻數據流輸入數據信號
src_width_i :輸入視頻的寬度
src_height_i:輸入視頻的高度
valid_o :插值放大后視頻的數據有效信號
data_o :插值放大后視頻的數據信號
硬件方案架構圖
為了更加清晰的表示本IP的整體架構,利用vivado軟件將本ip的源代碼進行了綜合,IP頂層架構圖如下所示:
子模塊功能介紹
input_buffer模塊:
接收前端輸入的原始視頻數據(clk是源數據像素時鐘信號),然后完成跨時鐘域處理,以clk_proc(時鐘頻率高于clk信號)高速處理時鐘信號輸出數據到buffer_ctrl模塊中。該模塊的主要功能就是實現跨時鐘域處理,當buffer_ctrl模塊準備好(ready信號拉高)接收數據時,將數據以clk_proc時鐘發送到buffer_ctrl模塊。
buffer_ctrl模塊:
實現源數據的緩存,以便于后續進行雙線性插值計算過程使用。該模塊主要是實現數據緩存,以及實現數據緩存的控制。當該模塊準備好接收數據時,接收前端input_buffer模塊發送過來的數據并將數據進行緩存,同時根據緩存的數據情況,控制后端的scaler_ip模塊開始工作,當后端的scaler_ip模塊開始工作時,從本模塊中讀取緩存的數據用于計算放大圖像。
scaler_ip模塊:
該模塊的功能就是利用雙線性插值方法實現圖像插值放大,當前端buffer_ctrl模塊使能scaler_en_o信號后,本模塊開始工作,從前端buffer_ctrl模塊中讀取緩存的數據,然后計算每個數據對應的權重系數,最終利用四個像素點的原始灰度值以及每個像素點對應的權重系數,利用雙線性插值算法計算得到最終的插值放大圖像,并將插值結果輸出。
功能仿真結果
功能仿真波形:
下面貼幾張功能仿真的結果圖像(將功能仿真結果存到txt文本中,然后利用matlab轉成圖像,最終結果如下所示,因為csdn無法上傳過大的圖像,因此是將放大結果壓縮后上傳的,所以上傳的圖像質量降低了很多)
輸入圖像分辨率:960x540
通過本IP經過功能仿真放大到1920x1080結果:
輸入圖像分辨率:600x600
通過本IP經過功能仿真放大到1920x1080結果:
總結
以上是生活随笔為你收集整理的IP0_Verilog实现基于双线性插值算法的图像放大IP设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BetterAndBetter--Mac
- 下一篇: 探讨下一步的网游(三)一个玩弄朋友关系的