林科業(yè),黃仕凰
(韓山師范學(xué)院物理與電子工程學(xué)院,廣東 潮州 521041)
數(shù)字圖像處理技術(shù)已經(jīng)廣泛應(yīng)用到日常生活和工業(yè)生產(chǎn)中。傳統(tǒng)的數(shù)字圖像處理技術(shù)主要是基于PC 軟件平臺(tái)的處理方式[1-2]。但PC 軟件平臺(tái)由于體積較大、較為笨重等缺陷,帶來(lái)了應(yīng)用上的不便利,移植到到嵌入式開(kāi)發(fā)平臺(tái)上是一個(gè)不錯(cuò)的解決辦法。隨著圖像采集設(shè)備的更新?lián)Q代,以及視頻處理技術(shù)的發(fā)展,采集到的圖像的分辨率、存儲(chǔ)大小以及圖像的處理速度都越來(lái)越高[3],這也要求嵌入式平臺(tái)圖像處理系統(tǒng)有更可能小的硬件體積和盡可能高的實(shí)時(shí)性。在眾多的嵌入式平臺(tái)中,F(xiàn)PGA 平臺(tái)因其處理速度快、處理能力強(qiáng)等特點(diǎn)[4]能夠很好地滿足要求。本研究即采用FPGA 平臺(tái),以模塊化的方式設(shè)計(jì)圖像處理實(shí)驗(yàn),讓程序設(shè)計(jì)更簡(jiǎn)便,移植性更好,有助于更快地進(jìn)行二次開(kāi)發(fā)。
在實(shí)驗(yàn)設(shè)計(jì)中,F(xiàn)PGA 實(shí)驗(yàn)平臺(tái)的外設(shè)主要有OV5640 攝像頭、SDRAM 存儲(chǔ)器、按鍵以及VGA 顯示器。OV5640 攝像頭主要用來(lái)采集圖像,其感光陣列為:2592×1944pixel(即500 萬(wàn)像素)[5]。在實(shí)驗(yàn)設(shè)計(jì)中,采集的圖像像素大小為640×480pixel,幀率能夠達(dá)到90f/s。這樣的采樣幀率能夠滿足工業(yè)化生產(chǎn)領(lǐng)域圖像快速采集的需求。設(shè)計(jì)中使用的按鍵,是用來(lái)實(shí)現(xiàn)圖像處理功能的切換控制。按鍵經(jīng)過(guò)消除抖動(dòng)后,計(jì)算按鍵的有效按下次數(shù),來(lái)切換VGA 顯示器顯示的內(nèi)容。在設(shè)計(jì)中,考慮到采集設(shè)備和顯示設(shè)備的頻率不同,需要將經(jīng)過(guò)圖像處理后的圖像存儲(chǔ)到SDRAM 芯片中,再?gòu)腟DRAM 讀取到VGA 進(jìn)行顯示。
在FPGA 程序設(shè)計(jì)中,以模塊化的方式,將程序設(shè)計(jì)成不同功能的模塊,其系統(tǒng)架構(gòu)如圖1 所示。在每個(gè)不同功能的模塊中都有一個(gè)主文件,用于將模塊中的各個(gè)程序整合起來(lái);引出較少的端口將更加便于不同模塊之間的信號(hào)通信。最后工程的頂層文件再將各個(gè)模塊的主文件進(jìn)行整合調(diào)用。模塊化設(shè)計(jì)思路使整個(gè)程序架構(gòu)層次分明,不同模塊之間的調(diào)用更加簡(jiǎn)單。

圖1 FPGA 實(shí)驗(yàn)平臺(tái)的系統(tǒng)架構(gòu)圖
由于各外設(shè)的時(shí)鐘頻率不同,在程序設(shè)計(jì)中,須用PLL 鎖相環(huán)提供時(shí)鐘頻率并確保精度。實(shí)驗(yàn)采用的FPGA 開(kāi)發(fā)平臺(tái)的工作時(shí)鐘頻率是50 MHz。SDRAM 需要用到100 MHz 和相位偏移了180°的100MHz 頻率,皆可通過(guò)PLL 鎖相環(huán)進(jìn)行倍頻獲得。OV5640 和VGA 顯示640×480 分辨率的時(shí)候,所需工作頻率是25MHz,需要PLL 鎖相環(huán)進(jìn)行分頻。
圖1 中的OV5640 模塊封裝了OV5640 攝像頭工作的驅(qū)動(dòng)程序,以及圖像獲取程序。調(diào)用OV5640的主程序就能獲得攝像頭采集到的圖像。OV5640攝像頭的驅(qū)動(dòng)程序的各個(gè)寄存器配置和驅(qū)動(dòng)通過(guò)I2C 總線來(lái)實(shí)現(xiàn)。OV5640 攝像頭獲取到的圖像以16位的數(shù)據(jù)輸出。
采集到的圖像通過(guò)圖1 中的圖像模塊進(jìn)行數(shù)字圖處理。在設(shè)計(jì)中,不同的數(shù)字圖像的處理程序,都在這部分模塊中實(shí)現(xiàn)。按鍵按下的次數(shù)控制數(shù)字圖像處理后的結(jié)果輸出。各個(gè)圖像處理算法又可以封裝成獨(dú)立的單元模塊,使用時(shí)只需要在主文件調(diào)用各個(gè)獨(dú)立模塊即可。
圖1 中的SDRAM 模塊主要負(fù)責(zé)SDRAM 芯片的驅(qū)動(dòng)。程序設(shè)計(jì)中需要對(duì)SDRAM 芯片進(jìn)行初始化、周期性的刷新,以及讀寫(xiě)控制。將經(jīng)過(guò)圖像處理后的數(shù)據(jù)存儲(chǔ)到SDRAM 芯片中。需要顯示時(shí),再?gòu)腟DRAM 中讀取數(shù)據(jù)到VGA 顯示器進(jìn)行顯示。
圖1 中的VGA 模塊實(shí)現(xiàn)對(duì)VGA 顯示驅(qū)動(dòng)。該模塊需要根據(jù)顯示的分辨率進(jìn)行顯示參數(shù)的設(shè)置。在設(shè)計(jì)中,VGA 顯示器采用640×480 的分辨率,工作頻率為25MHz。
實(shí)驗(yàn)設(shè)計(jì)了6 個(gè)圖像處理模塊,分別用來(lái)實(shí)現(xiàn)圖像的灰度處理、二值化、RGB 到Y(jié)CbCr 色彩空間的轉(zhuǎn)化、均值濾波、形態(tài)學(xué)中的腐蝕和膨脹,以及Sobel 邊沿檢測(cè),總體結(jié)構(gòu)如圖2 所示。每個(gè)模塊除了圖像數(shù)據(jù)的輸入端口有所差異,其他信號(hào)的輸入端口都是一致的。每個(gè)模塊都是獨(dú)立的處理單元,這便于調(diào)試,也讓電路設(shè)計(jì)更為直觀。每個(gè)模塊在設(shè)計(jì)的過(guò)程中,需要注意輸入信號(hào)和輸出信號(hào)的同步,以免造成信號(hào)的不同步,導(dǎo)致VGA 顯示上的錯(cuò)亂。

圖2 圖像處理模塊示意圖
攝像頭OV5640 采集到的圖像是16 位的彩色圖像,紅色、綠色和藍(lán)色各占5 位、6 位和5 位[6];根據(jù)公式Gray=0.299R+0.587G+0.114B,可將彩色圖像轉(zhuǎn)換為灰度圖像。在FPGA 實(shí)現(xiàn)中,先把RGB 三個(gè)分量擴(kuò)充為8 位的數(shù)據(jù),再用一個(gè)24 位的中間變量Gray_m 來(lái)存儲(chǔ)灰度轉(zhuǎn)換后的結(jié)果[7-8]。由于FPGA對(duì)浮點(diǎn)運(yùn)算需要消耗很多資源,在設(shè)計(jì)中要對(duì)系數(shù)進(jìn)行倍數(shù)放大,將除法運(yùn)算轉(zhuǎn)換成乘法運(yùn)算:
RGB 到Y(jié)CbCr 色彩空間的轉(zhuǎn)化,則可以根據(jù)以下公式:
攝像頭采集的圖像經(jīng)過(guò)灰度轉(zhuǎn)換后,在灰度值的基礎(chǔ)上設(shè)置一個(gè)閾值,將灰度圖像轉(zhuǎn)換成二值圖像。轉(zhuǎn)換后的二值圖像就可以進(jìn)行圖像形態(tài)學(xué)操作。圖像膨脹或圖像腐蝕實(shí)驗(yàn)都是在二值圖像的基礎(chǔ)上進(jìn)行的圖像處理。
在實(shí)驗(yàn)過(guò)程中,圖像的膨脹、腐蝕、均值濾波,以及Sobel 運(yùn)算,都需要使用RAM 對(duì)圖像數(shù)據(jù)進(jìn)行緩存,再將圖像與卷積核進(jìn)行卷積。所以實(shí)驗(yàn)設(shè)計(jì)采用雙端口RAM。RAM 的存儲(chǔ)深度根據(jù)顯示分辨率進(jìn)行設(shè)置。由于VGA 的顯示頻率是640×480,在設(shè)置RAM 的存儲(chǔ)深度時(shí)設(shè)置為640,位寬為8bit。在程序例化時(shí),RAM 寄存器需要例化兩個(gè)單位,用于存儲(chǔ)圖像的上一行和前一行數(shù)據(jù)。RAM 存儲(chǔ)和卷積運(yùn)算原理如圖3 所示。通過(guò)移位的方式,每次將每行的前三個(gè)數(shù)據(jù)取出,再和卷積核進(jìn)行卷積運(yùn)算。根據(jù)卷積核不同,可進(jìn)行不同的圖像處理。

圖3 RAM 存儲(chǔ)和卷積運(yùn)算示意圖
實(shí)驗(yàn)設(shè)計(jì)為使用一個(gè)按鍵實(shí)現(xiàn)圖像處理功能的切換。按鍵通過(guò)消抖動(dòng)后,根據(jù)按鍵被按下的有效次數(shù),能夠很好的控制圖像的不同處理功能的切換。具體切換效果如圖4 所示。

圖4 圖像處理實(shí)驗(yàn)效果
當(dāng)按鍵按一下時(shí),對(duì)圖像進(jìn)行均值濾波處理,如圖4(a)所示為圖像經(jīng)過(guò)3×3 卷積核均值濾波處理后的結(jié)果。實(shí)驗(yàn)的均值濾波是在灰度圖像上進(jìn)行的,均值濾波后圖像相較原圖像邊沿會(huì)更平滑些。
當(dāng)按鍵按兩下時(shí),對(duì)圖像進(jìn)行Sobel 算法運(yùn)算,圖4(b)即為Sobel 運(yùn)算后的效果。原灰度圖像經(jīng)過(guò)Sobel 運(yùn)算能夠很好地提取圖像的邊沿輪廓。
當(dāng)按鍵按三下時(shí),對(duì)圖像進(jìn)行RGB 到灰度轉(zhuǎn)化,如圖4(c)所示。灰度轉(zhuǎn)化后,原圖像由原來(lái)的16位RGB 彩色圖像變成了8 位的灰度圖像。
當(dāng)按鍵按四下時(shí),對(duì)圖像進(jìn)行二值化處理,效果如圖4(d)所示。圖像的二值化處理是將原灰度圖像的每個(gè)像素點(diǎn)和預(yù)定設(shè)置的閥值進(jìn)行比較,得到每個(gè)像素點(diǎn)為0 和1 的二值圖像。
當(dāng)按鍵按五下時(shí),對(duì)圖像進(jìn)行圖像形態(tài)學(xué)膨脹處理,如圖4(e)。實(shí)驗(yàn)中的膨脹處理需要先對(duì)原灰度圖像進(jìn)行二值化處理;再對(duì)每個(gè)像素點(diǎn)周?chē)? 個(gè)像素點(diǎn)進(jìn)行或運(yùn)算。
當(dāng)按鍵按六下時(shí),對(duì)圖像進(jìn)行圖像形態(tài)學(xué)腐蝕處理,如圖4(f)。實(shí)驗(yàn)中的腐蝕處理也需要先對(duì)原灰度圖像進(jìn)行二值化處理;再對(duì)每個(gè)像素點(diǎn)周?chē)?個(gè)像素點(diǎn)進(jìn)行與運(yùn)算。
實(shí)驗(yàn)結(jié)果表明,F(xiàn)PGA 平臺(tái)上能夠很好的實(shí)現(xiàn)數(shù)字圖像處理的基本功能。所設(shè)計(jì)的圖像預(yù)處理模塊,體現(xiàn)出了較高的靈活性和較快的處理速度。
本研究基于FPGA 平臺(tái),以模塊化思路加以設(shè)計(jì)。圖像處理實(shí)驗(yàn)圖像預(yù)處理模塊具有較強(qiáng)的可移植性,能夠?yàn)榫唧w的工程項(xiàng)目開(kāi)發(fā)提供幫助,具有非常好的應(yīng)用和研究?jī)r(jià)值。在對(duì)數(shù)字圖像處理算法的后續(xù)研究中,可以在現(xiàn)有的工程架構(gòu)上進(jìn)行進(jìn)一步完善,添加相應(yīng)的模塊,實(shí)現(xiàn)更高階的用法和功能。