林科業(yè),黃仕凰
(韓山師范學(xué)院物理與電子工程學(xué)院,廣東 潮州 521041)
數(shù)字圖像處理技術(shù)已經(jīng)廣泛應(yīng)用到日常生活和工業(yè)生產(chǎn)中。傳統(tǒng)的數(shù)字圖像處理技術(shù)主要是基于PC 軟件平臺的處理方式[1-2]。但PC 軟件平臺由于體積較大、較為笨重等缺陷,帶來了應(yīng)用上的不便利,移植到到嵌入式開發(fā)平臺上是一個不錯的解決辦法。隨著圖像采集設(shè)備的更新?lián)Q代,以及視頻處理技術(shù)的發(fā)展,采集到的圖像的分辨率、存儲大小以及圖像的處理速度都越來越高[3],這也要求嵌入式平臺圖像處理系統(tǒng)有更可能小的硬件體積和盡可能高的實時性。在眾多的嵌入式平臺中,F(xiàn)PGA 平臺因其處理速度快、處理能力強等特點[4]能夠很好地滿足要求。本研究即采用FPGA 平臺,以模塊化的方式設(shè)計圖像處理實驗,讓程序設(shè)計更簡便,移植性更好,有助于更快地進行二次開發(fā)。
在實驗設(shè)計中,F(xiàn)PGA 實驗平臺的外設(shè)主要有OV5640 攝像頭、SDRAM 存儲器、按鍵以及VGA 顯示器。OV5640 攝像頭主要用來采集圖像,其感光陣列為:2592×1944pixel(即500 萬像素)[5]。在實驗設(shè)計中,采集的圖像像素大小為640×480pixel,幀率能夠達到90f/s。這樣的采樣幀率能夠滿足工業(yè)化生產(chǎn)領(lǐng)域圖像快速采集的需求。設(shè)計中使用的按鍵,是用來實現(xiàn)圖像處理功能的切換控制。按鍵經(jīng)過消除抖動后,計算按鍵的有效按下次數(shù),來切換VGA 顯示器顯示的內(nèi)容。在設(shè)計中,考慮到采集設(shè)備和顯示設(shè)備的頻率不同,需要將經(jīng)過圖像處理后的圖像存儲到SDRAM 芯片中,再從SDRAM 讀取到VGA 進行顯示。
在FPGA 程序設(shè)計中,以模塊化的方式,將程序設(shè)計成不同功能的模塊,其系統(tǒng)架構(gòu)如圖1 所示。在每個不同功能的模塊中都有一個主文件,用于將模塊中的各個程序整合起來;引出較少的端口將更加便于不同模塊之間的信號通信。最后工程的頂層文件再將各個模塊的主文件進行整合調(diào)用。模塊化設(shè)計思路使整個程序架構(gòu)層次分明,不同模塊之間的調(diào)用更加簡單。
圖1 FPGA 實驗平臺的系統(tǒng)架構(gòu)圖
由于各外設(shè)的時鐘頻率不同,在程序設(shè)計中,須用PLL 鎖相環(huán)提供時鐘頻率并確保精度。實驗采用的FPGA 開發(fā)平臺的工作時鐘頻率是50 MHz。SDRAM 需要用到100 MHz 和相位偏移了180°的100MHz 頻率,皆可通過PLL 鎖相環(huán)進行倍頻獲得。OV5640 和VGA 顯示640×480 分辨率的時候,所需工作頻率是25MHz,需要PLL 鎖相環(huán)進行分頻。
圖1 中的OV5640 模塊封裝了OV5640 攝像頭工作的驅(qū)動程序,以及圖像獲取程序。調(diào)用OV5640的主程序就能獲得攝像頭采集到的圖像。OV5640攝像頭的驅(qū)動程序的各個寄存器配置和驅(qū)動通過I2C 總線來實現(xiàn)。OV5640 攝像頭獲取到的圖像以16位的數(shù)據(jù)輸出。
采集到的圖像通過圖1 中的圖像模塊進行數(shù)字圖處理。在設(shè)計中,不同的數(shù)字圖像的處理程序,都在這部分模塊中實現(xiàn)。按鍵按下的次數(shù)控制數(shù)字圖像處理后的結(jié)果輸出。各個圖像處理算法又可以封裝成獨立的單元模塊,使用時只需要在主文件調(diào)用各個獨立模塊即可。
圖1 中的SDRAM 模塊主要負責(zé)SDRAM 芯片的驅(qū)動。程序設(shè)計中需要對SDRAM 芯片進行初始化、周期性的刷新,以及讀寫控制。將經(jīng)過圖像處理后的數(shù)據(jù)存儲到SDRAM 芯片中。需要顯示時,再從SDRAM 中讀取數(shù)據(jù)到VGA 顯示器進行顯示。
圖1 中的VGA 模塊實現(xiàn)對VGA 顯示驅(qū)動。該模塊需要根據(jù)顯示的分辨率進行顯示參數(shù)的設(shè)置。在設(shè)計中,VGA 顯示器采用640×480 的分辨率,工作頻率為25MHz。
實驗設(shè)計了6 個圖像處理模塊,分別用來實現(xiàn)圖像的灰度處理、二值化、RGB 到Y(jié)CbCr 色彩空間的轉(zhuǎn)化、均值濾波、形態(tài)學(xué)中的腐蝕和膨脹,以及Sobel 邊沿檢測,總體結(jié)構(gòu)如圖2 所示。每個模塊除了圖像數(shù)據(jù)的輸入端口有所差異,其他信號的輸入端口都是一致的。每個模塊都是獨立的處理單元,這便于調(diào)試,也讓電路設(shè)計更為直觀。每個模塊在設(shè)計的過程中,需要注意輸入信號和輸出信號的同步,以免造成信號的不同步,導(dǎo)致VGA 顯示上的錯亂。
圖2 圖像處理模塊示意圖
攝像頭OV5640 采集到的圖像是16 位的彩色圖像,紅色、綠色和藍色各占5 位、6 位和5 位[6];根據(jù)公式Gray=0.299R+0.587G+0.114B,可將彩色圖像轉(zhuǎn)換為灰度圖像。在FPGA 實現(xiàn)中,先把RGB 三個分量擴充為8 位的數(shù)據(jù),再用一個24 位的中間變量Gray_m 來存儲灰度轉(zhuǎn)換后的結(jié)果[7-8]。由于FPGA對浮點運算需要消耗很多資源,在設(shè)計中要對系數(shù)進行倍數(shù)放大,將除法運算轉(zhuǎn)換成乘法運算:
RGB 到Y(jié)CbCr 色彩空間的轉(zhuǎn)化,則可以根據(jù)以下公式:
攝像頭采集的圖像經(jīng)過灰度轉(zhuǎn)換后,在灰度值的基礎(chǔ)上設(shè)置一個閾值,將灰度圖像轉(zhuǎn)換成二值圖像。轉(zhuǎn)換后的二值圖像就可以進行圖像形態(tài)學(xué)操作。圖像膨脹或圖像腐蝕實驗都是在二值圖像的基礎(chǔ)上進行的圖像處理。
在實驗過程中,圖像的膨脹、腐蝕、均值濾波,以及Sobel 運算,都需要使用RAM 對圖像數(shù)據(jù)進行緩存,再將圖像與卷積核進行卷積。所以實驗設(shè)計采用雙端口RAM。RAM 的存儲深度根據(jù)顯示分辨率進行設(shè)置。由于VGA 的顯示頻率是640×480,在設(shè)置RAM 的存儲深度時設(shè)置為640,位寬為8bit。在程序例化時,RAM 寄存器需要例化兩個單位,用于存儲圖像的上一行和前一行數(shù)據(jù)。RAM 存儲和卷積運算原理如圖3 所示。通過移位的方式,每次將每行的前三個數(shù)據(jù)取出,再和卷積核進行卷積運算。根據(jù)卷積核不同,可進行不同的圖像處理。
圖3 RAM 存儲和卷積運算示意圖
實驗設(shè)計為使用一個按鍵實現(xiàn)圖像處理功能的切換。按鍵通過消抖動后,根據(jù)按鍵被按下的有效次數(shù),能夠很好的控制圖像的不同處理功能的切換。具體切換效果如圖4 所示。
圖4 圖像處理實驗效果
當(dāng)按鍵按一下時,對圖像進行均值濾波處理,如圖4(a)所示為圖像經(jīng)過3×3 卷積核均值濾波處理后的結(jié)果。實驗的均值濾波是在灰度圖像上進行的,均值濾波后圖像相較原圖像邊沿會更平滑些。
當(dāng)按鍵按兩下時,對圖像進行Sobel 算法運算,圖4(b)即為Sobel 運算后的效果。原灰度圖像經(jīng)過Sobel 運算能夠很好地提取圖像的邊沿輪廓。
當(dāng)按鍵按三下時,對圖像進行RGB 到灰度轉(zhuǎn)化,如圖4(c)所示?;叶绒D(zhuǎn)化后,原圖像由原來的16位RGB 彩色圖像變成了8 位的灰度圖像。
當(dāng)按鍵按四下時,對圖像進行二值化處理,效果如圖4(d)所示。圖像的二值化處理是將原灰度圖像的每個像素點和預(yù)定設(shè)置的閥值進行比較,得到每個像素點為0 和1 的二值圖像。
當(dāng)按鍵按五下時,對圖像進行圖像形態(tài)學(xué)膨脹處理,如圖4(e)。實驗中的膨脹處理需要先對原灰度圖像進行二值化處理;再對每個像素點周圍的8 個像素點進行或運算。
當(dāng)按鍵按六下時,對圖像進行圖像形態(tài)學(xué)腐蝕處理,如圖4(f)。實驗中的腐蝕處理也需要先對原灰度圖像進行二值化處理;再對每個像素點周圍的8個像素點進行與運算。
實驗結(jié)果表明,F(xiàn)PGA 平臺上能夠很好的實現(xiàn)數(shù)字圖像處理的基本功能。所設(shè)計的圖像預(yù)處理模塊,體現(xiàn)出了較高的靈活性和較快的處理速度。
本研究基于FPGA 平臺,以模塊化思路加以設(shè)計。圖像處理實驗圖像預(yù)處理模塊具有較強的可移植性,能夠為具體的工程項目開發(fā)提供幫助,具有非常好的應(yīng)用和研究價值。在對數(shù)字圖像處理算法的后續(xù)研究中,可以在現(xiàn)有的工程架構(gòu)上進行進一步完善,添加相應(yīng)的模塊,實現(xiàn)更高階的用法和功能。