粘貼不了新的東西(粘貼突然不能用了)
1288
2025-03-31
基于FPGA的雙線性插值算法設計與分析
前言
1、幾種常見插值類型
1.1 最鄰近插值
1.2 雙線性插值
1.3 雙三次插值
2、FPGA實現雙線性插值
2.1 準備工作
2.2 實現的難點
2.3 整體的RTL圖
2.3.1 坐標轉換模塊
2.3.1.1 雙線性插值代填充坐標公式:
2.3.1.2 小數部分的處理
2.3.1.3 小數部分的表示
2.3.1.4 系數的表示
2.3.2 內存管理模塊
2.3.3雙線性插值模塊
3、仿真波形簡單分析
前言
在視頻圖像幾何校正或圖像配準坐標系轉換中,往往需要進行縮放、旋轉、透視變換等幾何變換操作。要想進行縮放旋轉操作,就要得到輸入輸出圖像之間的映射關系,也可稱之為幾何變換關系。
幾何變換的基本結構,包括兩種如下左圖的前向映射和右圖的逆向映射
-
向前映射適合于處理流輸入,例如 來自一個攝像機的輸入,其每個輸入像素 能被映射到 指定輸出圖像中的位置。
逆向映射更適合于產生數據流輸出,例如圖像數據流輸出到顯示器,因為對于每個輸出像素,逆向映射指定了 像素值來自于 輸入圖像的什么位置
地址的話,一般由行列計數器提供,通過行列計數器獲得某點坐標,從而根據二維坐標到一維地址的轉換地址計算得到。
但是按照這種映射關系,輸出圖像的像素可能被映射到輸入圖像的非整數坐標上,因此需要采用插值技術。
1、幾種常見插值類型
1.1 最鄰近插值
網上有很多解釋,可自己查閱
最簡單但鋸齒嚴重
1.2 雙線性插值
核心思想:分別在xy兩個方向上進行一次插值。
比如下圖所示,已知四個紅色點的像素值且為整數,求最終落在非整數位置的P的像素值。我們可以先在x方向上進行插值,得到插值結果R1和R2,然后在y方向上繼續進行插值,即可得到插值點P。
1.3 雙三次插值
效果更平滑,和雙線性插值類似,只不過用相鄰16個點,復雜且消耗資源多。
一般來說,雙線性插值是一個折中選擇。
2、FPGA實現雙線性插值
2.1 準備工作
100*100的mif文件,為提前將圖像數據存儲在RAM中
用雙線性插值來實現100100圖像到256256圖像的放大操作。
雙線性插值公式
2.2 實現的難點
算法中小數部分到底該如何處理
如果求出插值公式中的系數,以及周圍四個點的坐標
求出四個點之后,為加快速度,如何將四個點的像素值同時讀出
2.3 整體的RTL圖
上圖可看到,包含五個模塊:坐標轉換模塊,內存管理模塊,雙線性插值計算模塊,分頻模塊,VGA顯示模塊。重點看前三個模塊。
2.3.1 坐標轉換模塊
為了解決小數部分的問題。
2.3.1.1 雙線性插值代填充坐標公式:
首先如下是采用最近鄰實現縮放的公式:
為達到更好的效果,進行了如下優化
由此可以計算出目標像素點,對應原圖像像素點的坐標。
2.3.1.2 小數部分的處理
我們采用擴大倍數的方式來處理小數部分,因為要100100擴大到256256,因此需要擴大512倍,才能沒有小數部分,所以公式改變:
2.3.1.3 小數部分的表示
由于擴大到了256*256,256用9位寬表示,因此直接用20位位寬來表示srcX,Y
所以高10位表示整數,低10位表示小數部分。
//高10位為整數部分 assign coordinate_x = src_x[19:10]; assign coordinate_y = src_y[19:10];
//低10位為小數部分 assign coordinate_xx = src_x[9:0]; assign coordinate_yy = src_y[9:0];
2.3.1.4 系數的表示
系數包含,u,1-u,v,1-v。因為擴大了512倍數,所以1-u,變成了512-擴大后的小數部分的u
assign coefficient2 = {1'b0,src_x[8:0]}; //u assign coefficient1 = 'd512 - coefficient2; // 1-u assign coefficient4 = {1'b0,src_y[8:0]}; //v assign coefficient3 = 'd512 - coefficient4; //1-v
2.3.2 內存管理模塊
采用4個RAM來解決同時讀取四個點對應像素的問題
調用IP核的方法,將之前的mif文件存儲進去即可
2.3.3雙線性插值模塊
將系數和四個坐標代入公式
assign data_1 = coefficient1*coefficient3*doutbx; //(1-u)*(1-v)*f(i,j) assign data_2 = coefficient2*coefficient3*doutbx1;//u*(1-v)*f(i+1,j) assign data_3 = coefficient1*coefficient4*doutby;//(1-u)*v*f(i,j+1) assign data_4 = coefficient2*coefficient4*doutby1;//u*1-v*f(i+1,j+1)
因為擴大了512倍數,因此還要將結果縮小512倍。所以取高8位
3、仿真波形簡單分析
設計計數器,看插值圖像是否完成
-可看到,最后接收65536個數據。(從0開始)
插值結果的正確性,可以用matlab或者python驗證
例如,如下是我們采用matlab或者python生成的圖像數據(相當于mif文件)
截取部分數據進行查看,能看到是相對應的。
依次驗證也能得到該設計正確,觀察波形圖正確后,即可上板驗證。
還可采用之前文章的方法,將數據從波形中導出,便于查看數據。
- always @ (posedge clk) begin if (!start) j <=0; else if (j<65535) j <= j+1; else j<= 65535; end //如下想要將256*256圖像的65536個數據導出 integer w_file; initial w_file = $fopen("data_out.txt"); always @(j) begin $fdisplay(w_file,"%h",doutb); //十進制的輸出 if(j == 21'd65535) ; //共寫入65536個數據 end
也能生成對應的文檔,其中數據與matlab或者python生成的圖像數據一樣,說明插值成功。
波形成功后,加入了VGA顯示模塊,想要直接屏幕顯示效果,但目前打不開modelsim,下次再試
參考:
https://blog.csdn.net/weixin_43070186/article/details/86601714
CSDN:H19981118的博客_Fighting_XH_CSDN博客-FPGA基礎,modelsim仿真測試,FPGA圖像處理領域博主
FPGA
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。