FPGA圖像處理開源項(xiàng)目 – 圖像旋轉(zhuǎn) & 雙線性插值
本文開源一個FPGA圖像處理相關(guān)的項(xiàng)目:圖像旋轉(zhuǎn)。圖像旋轉(zhuǎn)算法本身非常簡單,但是如果想讓旋轉(zhuǎn)之后的圖像更加完整、平滑,還需要進(jìn)行雙線性插值處理,因此整個算法FPGA實(shí)現(xiàn)起來還是有一定難度的。文章末尾有該項(xiàng)目源碼獲取方式,有需要的小伙伴可以收藏、分享、支持一下~
算法流程
圖像旋轉(zhuǎn)算法可以有兩種思路:一種是前向映射,就是由原始圖像出發(fā),將像素點(diǎn)傳遞給旋轉(zhuǎn)后的圖像;另一種是反向映射,就是從旋轉(zhuǎn)后的圖像出發(fā),找到原始圖像對應(yīng)像素點(diǎn),然后通過雙線性插值算法使旋轉(zhuǎn)后圖像更清晰完整。由于前者會丟失很多圖像信息,因此在本項(xiàng)目中采用后者。算法流程圖如下。

原理簡介
輸入圖像分辨率默認(rèn)為256*256,算法處理的是以128為半徑內(nèi)切圓區(qū)域。

輸出圖像一維坐標(biāo)為i[0,65535],假設(shè)圖像逆時針旋轉(zhuǎn)θ得到輸出圖像,對應(yīng)的輸入圖像旋轉(zhuǎn)坐標(biāo)(X,Y)則可以表示成:
X=(i%256-128)*cos(θ)+(128-i/256)*sin(θ)
Y=-(i%256-128)*sin(θ)+(128-i/256)*cos(θ)首先,對(X,Y)向下取整得到(xx,yy),小數(shù)部分表示為(dx,dy),將(xx,yy)轉(zhuǎn)換到輸出圖像坐標(biāo)系下為:
xx=xx+128;
yy=128-yy;
進(jìn)行雙線性插值處理:
I(xx,yy)=(1-dx)(1-dy)I(xx,yy)+ (1-dx)dyI(xx,yy-1)+dx(1-dy)I(xx+1,yy)+dxdyI(xx+1,y-1)
浮點(diǎn)數(shù)定點(diǎn)化處理:
sin(θ)和cos(θ)值為乘以8192取整后的結(jié)果;
將上式中dx,dy項(xiàng)定義為8位整數(shù),1改為255參與運(yùn)算,最后將計(jì)算結(jié)果向右平移16位。
IP核配置
該Vivado工程用到的IP主要是?Multiplier,用于乘法運(yùn)算。
Signed_16bit * Signed_16bit


Unsigned_9bit * Unsigned_9bit

Unsigned_18bit?*?Unsigned_16bit

測試結(jié)果
下方左側(cè)圖像為256*256大小的原始測試圖像,右側(cè)為順時針旋轉(zhuǎn)30°后的結(jié)果。其中只處理了內(nèi)切圓區(qū)域內(nèi)的圖像,其余部分像素賦值為零。

Verilog代碼的Vivado仿真結(jié)果如下所示。


源碼獲取方式
需要本工程源碼的小伙伴,請關(guān)注微信公眾號?FPGA Zone?,后臺發(fā)送?像旋?,即可獲取下載鏈接。