本發(fā)明涉及一種紅外圖像線性插值膨脹硬件處理方法,屬于專(zhuān)用算法硬件電路設(shè)計(jì)領(lǐng)域。
背景技術(shù):
基于圖像匹配的信息處理技術(shù)在新一代航天型號(hào)中已經(jīng)開(kāi)始大量應(yīng)用,圖像處理的實(shí)時(shí)性直接影響著制導(dǎo)精度。以往基于通用處理器(如DSP)采用軟件實(shí)現(xiàn)圖像處理算法越來(lái)越難以滿(mǎn)足航天型號(hào)的實(shí)時(shí)性要求。目前,經(jīng)常采用簡(jiǎn)化算法犧牲算法精度的方式來(lái)減小算法運(yùn)算時(shí)間。通過(guò)算法硬件化實(shí)現(xiàn)算法加速是減小算法運(yùn)算時(shí)間的最有效手段。
目前圖像處理采用的是基于灰度信息的匹配方法,這種方法匹配精度高但是運(yùn)算量比較大。通過(guò)對(duì)捕獲、跟蹤等末制導(dǎo)導(dǎo)引頭信息處理過(guò)程進(jìn)行分析,將其中耗費(fèi)時(shí)間長(zhǎng)、處理結(jié)構(gòu)復(fù)雜、占用空間大的圖像算法進(jìn)行硬件化設(shè)計(jì),圖像膨脹算法是其中需要加速處理的算法之一。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明的技術(shù)解決問(wèn)題是:克服現(xiàn)有技術(shù)的不足,提供了一種紅外圖像線性插值膨脹硬件處理方法,通過(guò)流水線設(shè)計(jì),無(wú)精度損失快速取址、灰度快速讀取等設(shè)計(jì),極大提高了算法運(yùn)算速度,提高了計(jì)算精度,合理控制硬件資源代價(jià),并在Xilinx virtex5-XC5VFX100T下實(shí)現(xiàn),工作運(yùn)行在100M。
本發(fā)明的技術(shù)解決方案是:一種紅外圖像線性插值膨脹硬件處理方法,該方法采用硬件實(shí)現(xiàn),加快圖像膨脹處理速度,首先將原圖進(jìn)行膨脹放大得到膨脹后的圖像,然后對(duì)膨脹后圖像中每個(gè)像素點(diǎn)p'執(zhí)行如下步驟:
(1)、坐標(biāo)計(jì)算,根據(jù)p'在膨脹后圖像坐標(biāo)系中的坐標(biāo)p'(m,n)反推該點(diǎn)在原圖坐標(biāo)系的坐標(biāo)p(i0,j0),對(duì)p(i0,j0)的坐標(biāo)值進(jìn)行取整運(yùn)算,得到原圖中距離p點(diǎn)最近的左上點(diǎn)坐標(biāo)(im,jn);所述膨脹后圖像坐標(biāo)系的坐標(biāo)原點(diǎn)為膨脹后的圖像左上角,左上角向右為膨脹后圖像坐標(biāo)系橫軸X軸正方向,左上角向下為膨脹后圖像坐標(biāo)系縱軸Y正方向,所述原圖坐標(biāo)系的坐標(biāo)原點(diǎn)為原圖的左上角,左上角向右為原圖坐標(biāo)系橫軸X軸正方向,左上角向下為原圖坐標(biāo)系縱軸Y軸正方向。
(2)、灰度讀取,從原圖存儲(chǔ)器中獲取原圖中p(i0,j0)點(diǎn)周?chē)膫€(gè)點(diǎn)的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),將存儲(chǔ)連續(xù)的兩組灰度數(shù)據(jù)分別存入兩個(gè)內(nèi)部FIFO中,所述f(x,y)為原始圖像中坐標(biāo)(x,y)處的灰度數(shù)據(jù);
(3)、膨脹計(jì)算,從兩個(gè)FIFO中讀取出p(i0,j0)點(diǎn)周?chē)膫€(gè)點(diǎn)的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),采用雙線性插值算法計(jì)算膨脹后的圖像中p'(i,j)的圖像灰度值;
(4)、灰度存儲(chǔ),將步驟(3)計(jì)算出來(lái)的圖像灰度值保存到膨脹后圖像對(duì)應(yīng)的存儲(chǔ)器中,更新膨脹后圖像中p'(i,j)的圖像灰度值。
所述方法在FPGA中實(shí)現(xiàn)。
所述步驟(1)~步驟(4)的坐標(biāo)計(jì)算、灰度讀取、膨脹計(jì)算、灰度存儲(chǔ)采用四級(jí)流水線并行實(shí)現(xiàn)。
所述步驟(1)中當(dāng)原圖的尺寸為width_src×height_src,膨脹后圖像的尺寸為width_exp×height_exp時(shí),根據(jù)膨脹后圖像中坐標(biāo)p'(m,n)反推該點(diǎn)在原圖中的對(duì)應(yīng)的位置p(i0,j0),得到原圖中距離p點(diǎn)最近的左上像素點(diǎn)坐標(biāo)(im,jn)采用迭代遞推的方法為:
當(dāng)m=0,n=0時(shí),令i0=0,j0=0,令中間變量R0=0,T0=0;
當(dāng)m≥1時(shí),計(jì)算中間變量Rm=Rm-1+width_src,m∈{1,…,width_exp-1},如果Rm<width_exp,則im=im-1;如果Rm≥width_exp,則im=im-1+1,Rm=Rm-1-width_exp;
當(dāng)n≥1時(shí),計(jì)算中間變量Tn=Tn-1+height_src,n∈{1,…,height_exp-1},如果Tn<height_exp,則jn=j(luò)n-1;如果Tn≥height_exp,則jn=j(luò)n-1+1,Tn=Tn-1-height_exp。
原圖存儲(chǔ)器位寬為像素點(diǎn)灰度值寬度的4倍,每四個(gè)像素點(diǎn)灰度值對(duì)應(yīng)一個(gè)地址存儲(chǔ)空間,其存儲(chǔ)地址為:(縱坐標(biāo)x×原始圖像寬度width_src+橫坐標(biāo)y)>>2,兩個(gè)FIFO的寬度均為像素點(diǎn)灰度值的寬度,深度大于等于16。
灰度讀取的具體實(shí)現(xiàn)過(guò)程為:
在每行的第一個(gè)流水線周期內(nèi),執(zhí)行如下步驟:
(2.1a)、計(jì)算灰度值f(im,jn)在存儲(chǔ)器中的絕對(duì)地址,記為上行地址addr上;計(jì)算f(im+1,jn)在存儲(chǔ)器中的絕對(duì)地址,記為下行地址addr下:
addr上=im×width_src+jm
addr下=(im+1)×width_src+jm
(2.2a)、將上行地址addr上和下行地址addr下轉(zhuǎn)換成二進(jìn)制形式,并將二進(jìn)制形式的上行地址addr上和二進(jìn)制形式的下行地址addr下進(jìn)行低兩位截短得到存儲(chǔ)器上行讀地址addr_read上和下行讀地址addr_read下;
(2.3a)、根據(jù)上行讀指針addr_read上提取存儲(chǔ)器中連續(xù)4個(gè)灰度數(shù)據(jù)存入到FIFO_0中,上行讀地址addr_read上加1,F(xiàn)IFO_0寫(xiě)地址加4;根據(jù)下行讀指針addr_read下提取存儲(chǔ)器中連續(xù)4個(gè)灰度數(shù)據(jù)存入到FIFO_1中,下行讀地址addr_read下加1,F(xiàn)IFO_1寫(xiě)地址加4;
(2.4a)、當(dāng)addr上的低2位為2’b11時(shí),將addr_read上往后遞推一個(gè)地址,得到新的addr_read上,重新執(zhí)行步驟(2.3a),然后,進(jìn)入下一級(jí)流水線膨脹計(jì)算步驟;否則,直接進(jìn)入下一級(jí)流水線膨脹計(jì)算步驟;
在每行的后續(xù)流水線周期,執(zhí)行如下步驟:
(2.1b)、判斷FIFO_0中是否存在至少4個(gè)空閑空間,如果存在,則上行讀地址addr_read上加1,從存儲(chǔ)器中讀取連續(xù)4個(gè)灰度數(shù)據(jù)依次存入到FIFO_0中;FIFO_0寫(xiě)地址加4;否則,等待;
(2.2b)、判斷FIFO_1中是否存在至少4個(gè)空閑空間,如果存在,則下行讀地址addr_read下加1,從存儲(chǔ)器中讀取連續(xù)4個(gè)灰度數(shù)據(jù),依次存入到FIFO_1中;FIFO_1寫(xiě)地址加4;否則,等待;
所述FIFO_0和FIFO_1均為循環(huán)緩沖區(qū),當(dāng)FIFO_0和FIFO_1已滿(mǎn)時(shí),循環(huán)存儲(chǔ)。
膨脹計(jì)算的具體實(shí)現(xiàn)為:
在每行的第一個(gè)流水線周期內(nèi),執(zhí)行如下步驟:
(3.1a)、根據(jù)二進(jìn)制形式上行地址addr上和二進(jìn)制形式下行地址addr下的低兩位作為FIFO_0和FIFO_1中的初始讀地址;
(3.2a)、從FIFO_0中讀地址開(kāi)始取出f(im,jn)、f(im,jn+1);從FIFO_1中讀地址開(kāi)始取出f(im+1,jn)、f(im+1,jn+1);
(3.3a)、將步驟(3.2a)中讀取的四個(gè)灰度值進(jìn)行相加后右移2位得到膨脹后的圖像中p'(i,j)的圖像灰度值:
f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;
在每行的后續(xù)流水線周期內(nèi),執(zhí)行如下步驟:
(3.1b)、根據(jù)步驟(2)中坐標(biāo)變換中計(jì)算結(jié)果,當(dāng)Rm<width_exp,即im=im-1,且Tn<height_exp,即jn=j(luò)n-1時(shí),F(xiàn)IFO_0和FIFO_1讀地址不變;當(dāng)Tn≥height_exp時(shí),jn=j(luò)n-1+1,F(xiàn)IFO_0和FIFO_1讀地址加1;
(3.2b)、從FIFO_0中讀地址開(kāi)始取出f(im,jn)、f(im,jn+1);從FIFO_1中讀地址開(kāi)始取出f(im+1,jn)、f(im+1,jn+1);
(3.3b)、將步驟(3.2b)中讀取的四個(gè)灰度值進(jìn)行相加后右移2位得到膨脹后的圖像中p'(i,j)的圖像灰度值:
f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2。
本發(fā)明與現(xiàn)有技術(shù)相比的有益效果是:
(1)、本發(fā)明采用了4級(jí)流水線設(shè)計(jì),通過(guò)高效并行計(jì)算提高運(yùn)算速度。
(2)、本發(fā)明采用了無(wú)精度損失快速取址方法,該方法可以單周期得到灰度取址地址,并且計(jì)算過(guò)程只采用了簡(jiǎn)單的加法和比較操作,無(wú)精度損失。
(3)、本發(fā)明采用了兩個(gè)內(nèi)部FIFO控制器來(lái)實(shí)現(xiàn)灰度的快速讀取。由于每次膨脹計(jì)算所需讀取灰度地址不連續(xù),采用了兩個(gè)獨(dú)立的小FIFO保存存儲(chǔ)器讀取數(shù)據(jù),并通過(guò)FIFO讀寫(xiě)控制保證單周期提供4個(gè)灰度數(shù)據(jù)參與膨脹計(jì)算,維持了流水線的效率。
(4)、本發(fā)明通過(guò)對(duì)圖像雙線性插值膨脹算法進(jìn)行分析,算法需要先對(duì)原始輸入圖像進(jìn)行線性插值膨脹,然后再在膨脹的圖像上居中截取需要的尺寸圖像。通過(guò)流水線,快速取址、灰度快速讀取等設(shè)計(jì),進(jìn)行優(yōu)化硬件化設(shè)計(jì),極大的提高算法速度。而且整個(gè)設(shè)計(jì)過(guò)程中巧妙地采用比較操作和平移操作替代乘法和除法運(yùn)算,減小耗用資源和精度損失。
(5)、本算法在Xilinx virtex5-XC5VFX100T下實(shí)現(xiàn),運(yùn)行在100M,這種條件下對(duì)原始圖像160*128,膨脹1.2倍,即192*153,再在膨脹圖像上截取原模板圖1.1倍大小即176*140的圖像,完成算法運(yùn)算只需0.25ms。
附圖說(shuō)明
圖1為本發(fā)明圖像膨脹前后示意圖;
圖2為雙線性插值膨脹算法灰度計(jì)算原理圖;
圖3為本發(fā)明紅外圖像線性插值膨脹硬件加速總體架構(gòu);
圖4為根據(jù)截取大小計(jì)算原始圖像參與計(jì)算坐標(biāo)范圍的方法示意圖;
圖5為流水線設(shè)計(jì)示意圖;
圖6為圖像膨脹坐標(biāo)計(jì)算過(guò)程示意圖;
圖7為圖像膨脹算法FIFO示意圖。
具體實(shí)施方式
本發(fā)明說(shuō)明書(shū)中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員的公知技術(shù)。下面結(jié)合附圖對(duì)本發(fā)明的具體實(shí)施方式進(jìn)行進(jìn)一步的詳細(xì)描述。
圖像雙線性插值膨脹算法是最常用的圖像膨脹算法,用于將預(yù)處理圖像分辨率調(diào)整至與實(shí)時(shí)圖分辨率相同。
圖1為圖像膨脹前后示意圖,左圖為原圖,右圖為膨脹后圖像。p′點(diǎn)為膨脹后圖像數(shù)據(jù)中的一個(gè)像素點(diǎn),在a′×b′膨脹后圖像坐標(biāo)系中位置為p'(m,n),p為對(duì)應(yīng)點(diǎn)在原圖中的點(diǎn),在原圖坐標(biāo)系中的位置為p(i0,j0)。所述膨脹后圖像坐標(biāo)系的坐標(biāo)原點(diǎn)為膨脹后的圖像左上角,左上角向右為膨脹后圖像坐標(biāo)系X軸正方向,左上角向下為膨脹后圖像坐標(biāo)系Y軸正方向,所述原圖坐標(biāo)系的坐標(biāo)原點(diǎn)為原圖的左上角,左上角向右為原圖坐標(biāo)系X軸正方向,左上角向下為原圖坐標(biāo)系Y軸正方向。
雙線性插值膨脹算法的基本原理為:
根據(jù)p'在膨脹后圖像坐標(biāo)系中的坐標(biāo)p'(m,n)反推該點(diǎn)在原圖坐標(biāo)系的坐標(biāo)p(i0,j0)。根據(jù)圖1中p點(diǎn)與p′點(diǎn)的關(guān)系可知,令r為膨脹系數(shù),則在得到p點(diǎn)的坐標(biāo)后,顯然p點(diǎn)的坐標(biāo)不一定是整數(shù),為了準(zhǔn)確地描述p'點(diǎn)的灰度值,對(duì)(i0,j0)進(jìn)行取整運(yùn)算,得到原圖中距離p點(diǎn)最近的左上點(diǎn)坐標(biāo)(im,jn),(im,jn)、(im,jn+1)、(im+1,jn)、(im+1,jn+1)為(i0,j0)周?chē)乃膫€(gè)像素點(diǎn)坐標(biāo)。設(shè)f(x,y)為原始圖像灰度數(shù)據(jù),f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1)為p0點(diǎn)周?chē)膫€(gè)點(diǎn)的灰度值,如圖2所示。采用雙線性插值算法計(jì)算膨脹后的圖像中p'(m,n)的圖像灰度值,則p′點(diǎn)的灰度值可表示為:f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))/4。
圖3為本發(fā)明提出的紅外圖像線性插值膨脹硬件加速總體架構(gòu)。算法輸入有原始圖像尺寸:width_src×height_src,width_src為原始圖像寬,height_src為原始圖像高,膨脹后圖像尺寸width_exp×height_exp以及截取圖像尺寸width_icpt×height_icpt,width_exp為膨脹后圖像寬,height_exp為膨脹后圖像高,width_icpt為截取后圖像寬,height_icpt為截取后圖像高。
首先根據(jù)這些參數(shù)可計(jì)算出截取圖像即輸出圖像在膨脹后圖像的位置范圍,只需計(jì)算此范圍內(nèi)的像素點(diǎn)進(jìn)行坐標(biāo)轉(zhuǎn)換和計(jì)算灰度值即可。
圖4為根據(jù)截取大小計(jì)算原始圖像參與計(jì)算坐標(biāo)范圍的方法示意圖。如圖4所示,圖像輸出在膨脹后圖像中從中央截取,截取范圍為:
矩陣寬范圍:(width_exp-width_icpt)/2,(width_exp+width_icpt)/2
矩陣高范圍:(height_exp-height_icpt)/2,(height_exp+height_icpt)/2
得到輸出圖像范圍后,進(jìn)行坐標(biāo)轉(zhuǎn)換反向計(jì)算輸出圖像膨脹計(jì)算需要原始圖像灰度坐標(biāo),根據(jù)原始圖像灰度坐標(biāo)計(jì)算得到灰度值在存儲(chǔ)器中的地址,從存儲(chǔ)器1中讀取數(shù)據(jù),然后進(jìn)行灰度插值膨脹計(jì)算,計(jì)算完成后寫(xiě)入存儲(chǔ)器2。
為提高數(shù)據(jù)吞吐量和處理效率,根據(jù)紅外圖像膨脹運(yùn)算IP核實(shí)現(xiàn)過(guò)程將算法采用硬件實(shí)現(xiàn),加快膨脹處理速度。首先,將原圖進(jìn)行膨脹放大得到膨脹后的圖像,然后,逐行依次對(duì)膨脹后圖像中每個(gè)像素點(diǎn)p'進(jìn)行處理,每個(gè)像素點(diǎn)p'實(shí)現(xiàn)過(guò)程分解為坐標(biāo)計(jì)算、灰度讀取、膨脹計(jì)算、灰度存儲(chǔ)四級(jí)流水線。如圖5所示。分析各階段運(yùn)算時(shí)間,合理均勻分布在各級(jí)流水線中,每級(jí)流水線任務(wù)均能單周期完成,實(shí)現(xiàn)四級(jí)流水線并行工作。
以下介紹具體實(shí)現(xiàn)過(guò)程:
1、坐標(biāo)計(jì)算
四級(jí)流水線中第一級(jí)坐標(biāo)計(jì)算是計(jì)算預(yù)處理圖像在存儲(chǔ)器中的位置。膨脹系數(shù)r為width_exp/width_src,i*(1/r)=i*(width_src/width_exp)取整即為預(yù)處理圖像中寬度取址坐標(biāo),其中i順序增加。硬件除法器耗費(fèi)資源大,運(yùn)算時(shí)間長(zhǎng)(需要多個(gè)周期)。每次取址都進(jìn)行i*(width_src/width_exp)計(jì)算將極大降低了流水線效率;而且每次取址若采用width_src/width_exp累加取整將會(huì)帶來(lái)取址誤差,這是由于除法器位寬有限,多次累加造成誤差積累,很可能造成取址錯(cuò)誤。本算法采用坐標(biāo)比較法實(shí)現(xiàn)無(wú)精度損失快速取址計(jì)算,只需要簡(jiǎn)單的加減比較操作就可以了,耗用資源少,速度快,而且完全沒(méi)有精度損失。
坐標(biāo)計(jì)算計(jì)算過(guò)程示意圖如圖6所示,即需要得到截取圖像灰度計(jì)算需要的原始圖像灰度坐標(biāo),下一個(gè)灰度膨脹將根據(jù)坐標(biāo)轉(zhuǎn)換結(jié)果決定在原始圖像中取址坐標(biāo)是否右移/下移。
圖像膨脹系數(shù)r為width_exp/width_src(或height_exp/height_src,橫向和縱向圖像膨脹系數(shù)可不一致),i·(1/r)取整即為膨脹后坐標(biāo)。反過(guò)來(lái),膨脹后圖像灰度計(jì)算需要的原始圖像灰度坐標(biāo)即為i*(1/r)取整。
本發(fā)明設(shè)計(jì)了一種無(wú)精度損失快速取址方法,取址計(jì)算不采用乘除法運(yùn)算,只用簡(jiǎn)單的加法和比較運(yùn)算,保證單周期完成該級(jí)流水線。
如前面提高的圖像膨脹坐標(biāo)轉(zhuǎn)換公式:這樣,膨脹后圖像每行橫向坐標(biāo)i與原始圖像坐標(biāo)i0的映射關(guān)系為該式中分母一致為width_exp,膨脹后圖像坐標(biāo)每一次移動(dòng)表示分子加上width_src,對(duì)分子分母進(jìn)行比較來(lái)判斷橫坐標(biāo)是否移動(dòng)。
i=0時(shí),分子初值為0,[i0]=0;
i=1時(shí),分子為width_src+0,由于width_src<width_exp,則[i0]不變?nèi)詾?;
i=2時(shí),分子為width_src+width_src,若width_src+width_src<width_exp,則[i0]不變?nèi)詾?;若width_src+width_src≥width_exp,則[i0]加1且分子減去width_exp為下一次即i=3比較運(yùn)算的分子值;
……
i=n時(shí),比較分子與width_src之和與width_exp,若分子與width_src之和小于width_exp則[i0]不變;若分子與width_src之和大于width_exp,則[i0]加1且分子減去width_exp作為下一次即i=n+1比較運(yùn)算的分子值;
縱坐標(biāo)同理,膨脹后圖像每行縱向坐標(biāo)j與原始圖像坐標(biāo)j0的映射關(guān)系為按照相同的方法通過(guò)來(lái)比較分子分母判斷縱坐標(biāo)是否移動(dòng),可得到膨脹后圖像對(duì)原始圖像縱坐標(biāo)的映射。
得到膨脹后圖像對(duì)原始圖像橫坐標(biāo)和縱坐標(biāo)的映射后,即可得到對(duì)原始圖像地址取址,取址地址=縱坐標(biāo)×width_src+橫坐標(biāo)。這種方法沒(méi)有采用除法操作,只有簡(jiǎn)單的加法和比較操作,因此沒(méi)有精度損失,可以實(shí)現(xiàn)對(duì)原始圖像坐標(biāo)的快速取址。
2、灰度讀取
為縮減處理時(shí)間提高處理效率,只進(jìn)行最終截取圖像的膨脹運(yùn)算。一次膨脹運(yùn)算讀取需要四個(gè)灰度數(shù)據(jù)。若每次只讀取一個(gè)灰度數(shù)據(jù),每次膨脹運(yùn)算需要讀取4次,即需要四個(gè)時(shí)鐘周期。本算法采用高位寬存儲(chǔ)器,圖3中存儲(chǔ)器1的總線位寬為灰度位寬的4倍,這樣一次可以讀取4個(gè)灰度數(shù)據(jù)。以灰度位寬8bit為例,存儲(chǔ)器總線位寬取為32bit。每四個(gè)像素點(diǎn)的灰度值對(duì)應(yīng)一個(gè)存儲(chǔ)地址。另外,由于膨脹計(jì)算需要的四個(gè)灰度數(shù)據(jù)地址不連續(xù),其中兩兩一組連續(xù),兩組數(shù)據(jù)間隔width_src。本設(shè)計(jì)采用了兩個(gè)深度為16,寬度為灰度位寬的內(nèi)部FIFO(FIFO_0和FIFO_1)。從存儲(chǔ)器中讀取的灰度存入FIFO,膨脹計(jì)算從FIFO讀取灰度,完成膨脹計(jì)算后的FIFO空間釋放。FIFO存在4個(gè)或以上空閑空間時(shí)會(huì)自動(dòng)從存儲(chǔ)器中讀取灰度,如圖6所示。若灰度位寬為8bit,兩個(gè)FIFO大小均為16*8bit,即一個(gè)FIFO可存儲(chǔ)16個(gè)灰度數(shù)據(jù)。讀取外部地址時(shí),輪流讀上下兩行數(shù)據(jù),分別寫(xiě)入兩個(gè)FIFO。這樣,在讀取存儲(chǔ)器每行的數(shù)據(jù)時(shí)地址不需要經(jīng)過(guò)復(fù)雜的運(yùn)算,順序加1就可以了。
考慮到截取圖像的隨機(jī)性,在讀取存儲(chǔ)器中的數(shù)據(jù)時(shí)需要考慮讀取灰度的有效性。由于圖像對(duì)齊影響,原始圖像每行第一拍灰度需考慮偏移有效位,對(duì)第一拍數(shù)據(jù)有效灰度判斷。由于取址地址實(shí)際上是對(duì)存儲(chǔ)地址進(jìn)行了低兩位截短,因此存儲(chǔ)地址的低兩位就是讀取數(shù)據(jù)的有效位。當(dāng)?shù)蛢晌粸?’b00時(shí)讀取的4個(gè)灰度數(shù)據(jù)都有效。當(dāng)?shù)蛢晌粸?’b01時(shí)讀取的后3個(gè)灰度數(shù)據(jù)有效。當(dāng)?shù)蛢晌粸?’b10時(shí)讀取的后2個(gè)灰度數(shù)據(jù)有效。當(dāng)?shù)蛢晌粸?’b11時(shí)讀取的最后1個(gè)灰度數(shù)據(jù)都有效。當(dāng)?shù)蛢晌粸?’b00,2’b01,2’b10時(shí),第一次灰度讀取需要2個(gè)周期,之后流水線正常工作。當(dāng)?shù)蛢晌粸?’b11時(shí),第一次灰度讀取需要4個(gè)周期。每次FIFO寫(xiě)操作寫(xiě)入4個(gè)FIFO灰度存儲(chǔ)空間,F(xiàn)IFO讀操作讀出2個(gè)FIFO數(shù)據(jù),根據(jù)取址偏移判斷是否釋放FIFO灰度存儲(chǔ)空間。通過(guò)FIFO讀寫(xiě)控制,當(dāng)FIFO中數(shù)據(jù)完成計(jì)算釋放資源存在4個(gè)或以上可用灰度存儲(chǔ)空間讀取存儲(chǔ)器數(shù)據(jù)寫(xiě)入FIFO,反復(fù)循環(huán)。由于FIFO寫(xiě)比FIFO讀更快,可以保證后續(xù)流水線每個(gè)clk均可從FIFO讀取數(shù)據(jù)進(jìn)行膨脹計(jì)算,保證流水線順利進(jìn)行。
具體實(shí)現(xiàn)過(guò)程為:
在每行的第一個(gè)流水線周期內(nèi),執(zhí)行如下步驟:
(2.1a)、計(jì)算灰度值f(im,jn)在存儲(chǔ)器中的絕對(duì)地址,記為上行地址addr上;計(jì)算f(im+1,jn)在存儲(chǔ)器中的絕對(duì)地址,記為下行地址addr下:
addr上=im×width_src+jm
addr下=(im+1)×width_src+jm
(2.2a)、將上行地址addr上和下行地址addr下轉(zhuǎn)換成二進(jìn)制形式,并將二進(jìn)制形式的上行地址addr上和二進(jìn)制形式的下行地址addr下進(jìn)行低兩位截短得到存儲(chǔ)器上行讀地址addr_read上和下行讀地址addr_read下;
(2.3a)、根據(jù)上行讀指針addr_read上提取存儲(chǔ)器中一個(gè)數(shù)據(jù)(連續(xù)4個(gè)灰度數(shù)據(jù))存入到FIFO_0中,上行讀地址addr_read上加1,F(xiàn)IFO_0寫(xiě)地址加4;根據(jù)下行讀指針addr_read下提取存儲(chǔ)器中一個(gè)數(shù)據(jù)(連續(xù)4個(gè)灰度數(shù)據(jù))存入到FIFO_1中,下行讀地址addr_read下加1,F(xiàn)IFO_1寫(xiě)地址加4;
(2.4a)、當(dāng)addr上的低2位為2’b11時(shí),將addr_read上往后遞推一個(gè)地址,得到新的addr_read上,重新執(zhí)行步驟(2.3a),然后,進(jìn)入下一級(jí)流水線膨脹計(jì)算步驟;否則,直接進(jìn)入下一級(jí)流水線膨脹計(jì)算步驟;
也就是說(shuō),當(dāng)二進(jìn)制形式的上行地址addr上的低2位,2’b00、2’b01或者2’b10時(shí),完成上述步驟(2.3a)即可開(kāi)始下一級(jí)流水線膨脹計(jì)算;當(dāng)addr上的低2位為2’b11時(shí),需要從存儲(chǔ)器讀取數(shù)據(jù)兩次才能開(kāi)始下一級(jí)流水線膨脹計(jì)算,需要等待1個(gè)周期,將上述步驟(2.3a)進(jìn)行兩次;
在每行的后續(xù)流水線周期,執(zhí)行如下步驟:
(2.1b)、通過(guò)FIFO_0讀寫(xiě)地址比較判斷FIFO_0中是否存在至少4個(gè)空閑空間,如果存在,則上行讀地址addr_read上加1,從存儲(chǔ)器中讀取一個(gè)數(shù)據(jù)(連續(xù)4個(gè)灰度數(shù)據(jù))依次存入到FIFO_0中;FIFO_0寫(xiě)地址加4;否則,等待;
(2.2b)、通過(guò)FIFO_1讀寫(xiě)地址比較判斷FIFO_1中是否存在至少4個(gè)空閑空間,如果存在,則下行讀地址addr_read下加1,從存儲(chǔ)器中讀取一個(gè)數(shù)據(jù)(連續(xù)4個(gè)灰度數(shù)據(jù))依次存入到FIFO_1中;FIFO_1寫(xiě)地址加4;否則,等待;
所述FIFO_0和FIFO_1均為循環(huán)緩沖區(qū),當(dāng)FIFO_0和FIFO_1已滿(mǎn)時(shí),循環(huán)存儲(chǔ)。
3、膨脹計(jì)算
膨脹計(jì)算根據(jù)p(i0,j0)點(diǎn)周?chē)膫€(gè)點(diǎn)的灰度值:f(im,jn)、f(im+1,jn)、f(im,jn+1)、f(im+1,jn+1),采用雙線性插值算法計(jì)算膨脹后的圖像中p'(i,j)的圖像灰度值,其具體實(shí)現(xiàn)為:
在每行的第一個(gè)流水線周期內(nèi),執(zhí)行如下步驟:
(3.1a)提取根據(jù)二進(jìn)制形式上行地址addr上和二進(jìn)制形式下行地址addr下的低兩位作為FIFO_0和FIFO_1中的初始讀地址;
(3.2a)、從FIFO_0中讀地址開(kāi)始取出f(im,jn)、f(im,jn+1);從FIFO_1中讀地址開(kāi)始取出f(im+1,jn)、f(im+1,jn+1);
(3.3a)、將步驟(3.2a)中讀取的四個(gè)灰度值進(jìn)行相加后右移2位得到膨脹后的圖像中p'(i,j)的圖像灰度值:
f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;
在每行的后續(xù)流水線周期內(nèi),執(zhí)行如下步驟:
(3.1b)根據(jù)坐標(biāo)變換中計(jì)算結(jié)果,當(dāng)Rm<width_exp,即im=im-1,且Tn<height_exp,即jn=j(luò)n-1時(shí),F(xiàn)IFO_0和FIFO_1讀地址不變;當(dāng)Tn≥height_exp時(shí),jn=j(luò)n-1+1,F(xiàn)IFO_0和FIFO_1讀地址加1;
(3.2b)、從FIFO_0中讀地址開(kāi)始取出f(im,jn)、f(im,jn+1);從FIFO_1中讀地址開(kāi)始取出f(im+1,jn)、f(im+1,jn+1);
(3.3b)、將步驟(3.2b)中讀取的四個(gè)灰度值進(jìn)行相加后右移2位得到膨脹后的圖像中p'(i,j)的圖像灰度值:
f′(m,n)=(f(im,jn)+f(im+1,jn)+f(im,jn+1)+f(im+1,jn+1))>>2;
本算法硬件化過(guò)程中,前面提到的除2操作也通過(guò)右移1位來(lái)實(shí)現(xiàn)。
4、灰度存儲(chǔ)
將膨脹計(jì)算所得到的p'(m,n)的圖像灰度值f′(m,n)保存至指定的存儲(chǔ)器中,即圖3中的存儲(chǔ)器2。
當(dāng)膨脹圖像后為截取圖像時(shí),一般在膨脹后圖像上居中截取,用來(lái)調(diào)整圖像分辨率。截取圖像尺寸為width_icpt×height_icpt。截取區(qū)域矩陣寬坐標(biāo)范圍:(width_exp-width_icpt)/2,(width_exp+width_icpt)/2;矩陣高坐標(biāo)范圍:(height_exp-height_icpt)/2,(height_exp+height_icpt)/2。只需要計(jì)算該截取區(qū)域的膨脹圖像灰度即可。坐標(biāo)變換從行第一個(gè)數(shù)開(kāi)始計(jì)算截取圖像中第一行第一個(gè)像素點(diǎn)在原圖中映射坐標(biāo),截取圖像每行第一個(gè)像素點(diǎn)在原圖中映射縱坐標(biāo)一致,之后按照上述流水線方式計(jì)算膨脹圖像灰度。
實(shí)施例
本發(fā)明在Xilinx virtex5-XC5VFX100T下FPGA實(shí)現(xiàn),工作在100M。對(duì)原始圖像160*128,膨脹1.2倍,即192*153,再在膨脹圖像上截取原模板圖1.1倍大小即176*140的圖像,完成算法運(yùn)算只需0.25ms。
以上所述,僅為本發(fā)明最佳的具體實(shí)施方式,但本發(fā)明的保護(hù)范圍并不局限于此,任何熟悉本技術(shù)領(lǐng)域的技術(shù)人員在本發(fā)明揭露的技術(shù)范圍內(nèi),可輕易想到的變化或替換,都應(yīng)涵蓋在本發(fā)明的保護(hù)范圍之內(nèi)。
本發(fā)明說(shuō)明書(shū)中未作詳細(xì)描述的內(nèi)容屬于本領(lǐng)域?qū)I(yè)技術(shù)人員的公知技術(shù)。