基于FPGA的圖像處理的研究
圖像處理是用計(jì)算機(jī)對(duì)圖像進(jìn)行分析,以達(dá)到所需的結(jié)果的一種技術(shù),又稱(chēng)為影像處理。它是對(duì)圖像進(jìn)行操作從而得到自己想要的結(jié)果,它是一個(gè)非常廣義的概念,包含圖像增強(qiáng)、圖像復(fù)原、圖像重建、圖像分析、模式識(shí)別、計(jì)算機(jī)視覺(jué)等N多個(gè)應(yīng)用方向。這些應(yīng)用技術(shù)有許多在本質(zhì)上是相通的,但是不同應(yīng)用領(lǐng)域的關(guān)注點(diǎn)往往是不同的。
FPGA做圖像處理的優(yōu)勢(shì)
用FPGA做圖像處理最關(guān)鍵的一點(diǎn)優(yōu)勢(shì)就是:FPGA能進(jìn)行實(shí)時(shí)流水線(xiàn)運(yùn)算,能達(dá)到最高的實(shí)時(shí)性。因此在一些對(duì)實(shí)時(shí)性要求非常高的應(yīng)用領(lǐng)域,做圖像處理基本就只能用FPGA。例如在某些分選設(shè)備中圖像處理基本上用的都是FPGA,因?yàn)樵谙鄼C(jī)中從看到物料圖像到給出執(zhí)行指令之間的延時(shí)大概只有幾毫秒,這就要求圖像處理必須很快且延時(shí)固定,只有FPGA進(jìn)行的實(shí)時(shí)流水線(xiàn)運(yùn)算才能滿(mǎn)足這一要求。
要了解FPGA進(jìn)行圖像處理的優(yōu)勢(shì)就必須理解FPGA所能進(jìn)行的實(shí)時(shí)流水線(xiàn)運(yùn)算和DSP,GPU等進(jìn)行的圖像處理運(yùn)算有何不同:
DSP,GPU,CPU對(duì)圖像的處理基本是以幀為單位的,從相機(jī)采集到的圖像數(shù)據(jù)會(huì)先存在內(nèi)存中,然后GPU會(huì)讀取內(nèi)存中的圖像數(shù)據(jù)進(jìn)行處理。假如采集圖像的幀率是30幀,那么DSP,GPU要是能在1/30秒內(nèi)完成一幀圖像的處理,那基本上就能算是實(shí)時(shí)處理。
而FPGA對(duì)圖像進(jìn)行實(shí)時(shí)流水線(xiàn)運(yùn)算是以行為單位的。FPGA可以直接和圖像傳感器芯片連接采集圖像數(shù)據(jù)流,如果是RAW格式的還可以通過(guò)差值來(lái)獲得RGB圖像數(shù)據(jù)。FPGA能進(jìn)行實(shí)時(shí)流水線(xiàn)處理的關(guān)鍵是它可以用內(nèi)部的Block Ram緩存若干行的圖像數(shù)據(jù)。Block Ram可以說(shuō)是類(lèi)似于CPU里面的Cache,但Cache不是你能完全控制的,而B(niǎo)lock Ram是完全可控的,可以用它實(shí)現(xiàn)各種靈活的運(yùn)算處理。這樣FPGA通過(guò)緩存若干行圖像數(shù)據(jù)就可以對(duì)圖像進(jìn)行實(shí)時(shí)處理,數(shù)據(jù)就這樣一邊流過(guò)就一邊處理好了,不需要送入DDR緩存了之后再讀出來(lái)處理。
FPGA圖像處理之路,從此開(kāi)始
用FPGA做圖像處理相關(guān)的開(kāi)發(fā)時(shí),往往我們首先要考慮的是FPGA處理板的性能,因?yàn)樽鰣D像處理是一個(gè)十分消耗資源的事情。從網(wǎng)上可以搜索到很多圖像處理FPGA開(kāi)發(fā)板,有些開(kāi)發(fā)板上的資源十分豐富,可以滿(mǎn)足我們前期試驗(yàn)的需求。
FPGA在圖像處理方面的主要應(yīng)用于圖像的預(yù)處理階段。
什么是圖像的預(yù)處理?比如圖像的畸變校正,濾波器處理,邊緣檢測(cè)、顏色檢測(cè)和閾值處理等。這些預(yù)處理都有共同的特征:算法較為簡(jiǎn)單,操作重復(fù)性強(qiáng)等。但是,除了預(yù)處理,F(xiàn)PGA就不能做點(diǎn)別的嗎?圖像處理類(lèi)似一個(gè)三層金字塔,分為底層,中間層,高層。
圖像處理金字塔有三層,分別針對(duì)的是像素級(jí)、特征級(jí)和目標(biāo)級(jí)。一個(gè)成熟的圖像處理應(yīng)用應(yīng)該同時(shí)完成這三層。
在像素層,我們可以對(duì)圖像做一些變換,目的是增強(qiáng)圖像的有用信息,同時(shí)濾波任何不相關(guān)的信息(如噪聲)。然后通過(guò)對(duì)預(yù)處理后的圖像做分割操作實(shí)現(xiàn)圖像從像素級(jí)到特征級(jí)的過(guò)度,分割操作可以理解為檢測(cè)圖像中具有共同性質(zhì)的區(qū)域。針對(duì)這些區(qū)域,依據(jù)一個(gè)或多個(gè)分類(lèi)法則,將區(qū)域歸類(lèi)到預(yù)先設(shè)定的特征類(lèi)型中作為后期識(shí)別的數(shù)據(jù)集。此時(shí)的數(shù)據(jù)已經(jīng)不僅僅是圖像了,其中包含了豐富的特征信息,如物體的位置等。在金字塔高層,依靠獲取的特征信息,如有必要還可以將這些特征集作為學(xué)習(xí)的訓(xùn)練集來(lái)創(chuàng)建專(zhuān)用的模型,借助模型來(lái)實(shí)現(xiàn)識(shí)別,進(jìn)而用來(lái)對(duì)實(shí)時(shí)采集的圖像進(jìn)行描述。
圖像處理系統(tǒng)設(shè)計(jì)注意點(diǎn)
1. 將算法開(kāi)發(fā)和FPGA實(shí)現(xiàn)分離。用軟件的圖像處理環(huán)境算法可以進(jìn)行大批量的圖像樣本測(cè)試及調(diào)試,再將算法映射到硬件上,這樣大大節(jié)省了硬件調(diào)試周期。
2. 算法的精度。圖像處理的算法中,大部分需要采用浮點(diǎn)數(shù)運(yùn)算,而浮點(diǎn)數(shù)運(yùn)算再FPGA中是非常不劃算的,因此需要轉(zhuǎn)換成定點(diǎn)數(shù)計(jì)算,此時(shí)會(huì)涉及到浮點(diǎn)運(yùn)算轉(zhuǎn)定點(diǎn)運(yùn)算時(shí)精度下降的問(wèn)題。
3. 結(jié)構(gòu)的合理劃分。這里是指DSP,CPU與FPGA;一般結(jié)構(gòu)規(guī)則:計(jì)算量大的操作如sobel算子、均值濾波可以采用FPGA進(jìn)行,不規(guī)則的動(dòng)態(tài)可變長(zhǎng)度循環(huán)的底層算法由DSP、CPU進(jìn)行;
圖像處理FPGA 設(shè)計(jì)基本方法
1. 陣列結(jié)構(gòu)結(jié)合流水線(xiàn)處理設(shè)計(jì)。例如RGB圖像,包括三組數(shù)據(jù),處理時(shí)需要并行三通道后,每個(gè)通道進(jìn)行分別的串行流水處理。
2. 緩存設(shè)計(jì)。幀緩存、行緩存、列對(duì)齊。
3. 資源。分辨率、處理窗口、對(duì)資源影響成倍增加。