李 華
(商洛學院,陜西 商洛 726000)
現在的數字圖像采集系統出于成本和體積重量等因素考慮都是在灰度CCD/CMOS傳感器感光表面覆蓋顏色濾波陣列(CFA),產生一種馬賽克圖像,從而實現彩色成像,其中最常用的為Bayer格式[1]。對經過濾波陣列馬賽克圖像進行彩色恢復,特別是實時彩色恢復,在圖像處理方面有著非常重要的應用。
在Bayer格式中,因為每個像素點僅有一種顏色,因此,需要利用其周圍像素點的強度相關性來估計出缺失的另外兩種顏色,從而得到彩色圖像,這種方法稱為彩色插值或去馬賽克。應用硬件實現彩色恢復算法,實時輸出彩色圖像不但可以省去二次處理圖像的麻煩,還可以將算法應用于別的系統之中,比如圖像分割等。本文設計了1套基于1片FPGA結合4片SDRAM來完成Bayer插值算法的實時彩色輸出硬件實現方案,該設計原理簡單,實際開發較容易,穩定性高,而且具有一定的通用性。
自1976年Bayer首次提出Bayer陣列至今,Bayer插值算法不計其數,但都是在3×3,5×5或是更大的數據窗口中進行,它們應用硬件設計都會使用如圖1所示的數據流結構(以5×5為例說明)。當輸入數據有效時,Raw格式的數據依次通過緩存 1,R44,R43,R42,R41,R40;緩存 2,R34,R33,R32,R31,R30;緩存 3,R24,R23,R22,R21,R20;緩存4,R14,R13,R12,R11,R10;緩存5,R04,R03,R02,R01,R00緩存送入算法處理單元,然后利用插值算法得到最終的RGB圖像。其中BufferX為行緩存器,RXX為像素緩存器。
本文使用的探測器是DALSA公司的一款全色CMOS探測器,分辨率為2352×1728,它采用的輸出形式是奇偶行同時輸出,這樣,在做CFA插值時就有兩種方案可供選擇,一種是將探測器輸出的Bayer格式圖像數據進行緩存,然后再構成圖1所示的數據流結構進行插值,輸出的彩色圖像不需要緩存就可以直接輸出顯示或存儲;另一種是直接將探測器輸出的數據構成圖1的數據流結構,因為是同時輸出2路,所以,要緩存6行然后同時輸出2行彩色圖像,但是,這樣就要對彩色圖像進行緩存、拼接,然后才能輸出。兩種方案各有優劣,本文選用第一種,即將Bayer格式圖像數據緩沖,具體的過程如圖2所示。


圖2中,因為CMOS探測器是同時輸出2行圖像數據,又SDRAM是單口輸入輸出存儲器,所以不能在同1片SDRAM的2個bank進行乒乓操作,而只能使用2片SDRAM進行存儲,其中,圖像的奇數行存儲在SDRAM A(a),偶數行存儲在SDRAM A(b)。又因為1幀圖像的大小為2352×1728×16 bit,而本設計使用的SDRAM容量為8388608×16 bit×4 bank,所以1片SDRAM的1個bank就可以存儲半幀圖像,這樣讀寫都在1個bank進行,簡化了設計。當1幀圖像在SDRAMA存儲完畢后,開始將輸出的下1幀圖像的兩路圖像數據以同樣的方式存儲在SDRAM B中,在寫SDRAM B的同時對SDRAM A(a)和SDRAM A(b)進行乒乓讀操作,將奇數行和偶數行拼接順序輸出,由于圖像輸出的幀頻是20 f/s(幀/秒),而順序讀完一幀只需要40 ms,所以,讀時不會造成數據丟失。當第二幀數據全部寫到SDRAM B后又開始寫SDRAM A。同時,對SDRAM B進行乒乓讀操作,順序輸出圖像數據,如此循環,就完成了探測器數據順序的改變,構成圖2的數據流結構,滿足了彩色插值的要求。
目前,CFA插值算法很多,但大部分算法卻因為過于復雜而只能停留在計算機仿真驗證階段,本文結合文獻[2],設計了一種易于硬件實現的線性Bayer插值算法。由圖像原理可知,任何一幅圖片的紅、綠、藍三顏色之間的信息是相互關聯,而不是單獨存在的,這就意味著可以用這種關聯關系來獲取圖片的顏色信息,通常是用梯度關系來操作,文獻[3]使用了兩個通道之差,即G通道分別減去R和B通道,來增加通道之間的相關性,再用相減得到的結果進行插值,由于這種方法考慮了各通道間的關聯,因此插值結果偽彩色大大減少。本文也是采用與文獻[3]類似的通道相關梯度法,具體設計如下:
以Bayer格式中的R為例,定義R0處的梯度為

這樣就可以得到R0處的G分量為


將式(1)代入式(3),即得到R0處的G分量為

同理,可得到R0處的B分量為

這樣,R0處的R,G,B三分量都已經得到。將該算法應用到Bayer格式圖像的其他分量,就可以得到整幅圖像的R,G,B分量,從而輸出彩色圖像。由于算法中的修正因子是按照維納逼近計算的,所以,計算出的結果具有最小的均方誤差,這樣得到的插值效果也就更佳。圖3為本文使用的算法和雙線性插值算法的效果比較,本文算法不僅3個通道的PSNR均比雙線性插值算法高3 dB以上,而且視覺效果更勝一籌。

圖3 兩種算法的插值效果比較
除了本文所用的插值算法效果比較好,對式(4)和式(5)分析,不難看出,算法在計算方面僅有加減和移位計算,這就特別適合硬件設計,特別是適合硬件資源豐富的FPGA來實現。設計上只要有圖1所示的數據順序再結合流水線技術就能將算法實現,實時地輸出彩色圖像。
SDRAM是一種應用廣泛的存儲器,具有容量大、數據讀寫速度快等優點,特別適合那些需要海量存儲的應用領域[4]。SDRAM內部存儲單元由若干個相當于矩陣的bank組成。而行地址就是矩陣的行元素,列地址相當于矩陣的列元素。這樣,只要給定了bank的地址,就可以通過行地址和列地址的選取唯一地指定一個存取單元。
SDRAM和別的存儲器不同的是,所有行在系統初始化后都處于非活動狀態,要進行讀寫操作就必須先激活相應的行。在激活命令執行完畢,并經過從行地址選擇到列地址選擇的延遲之后,就可以根據read/write信號決定SDRAM將要進行讀操作還是寫操作了。
SDRAM控制邏輯主要由3部分組成:主控制模塊、信號產生模塊和數據通路模塊。主控制模塊通常由兩個狀態機構成,它是SDRAM系統設計的核心模塊,主要是根據外部控制信號來改變SDRAM當前的工作狀態;信號產生模塊則根據SDRAM的工作狀態產生SDRAM需要的行列地址和工作信號;而數據通路模塊主要是負責控制邏輯對SDRAM的數據進行寫入或讀出。
本設計除了以上基本注意點,還根據圖像連續輸出的特點,讓SDRAM工作在滿頁模式狀態下,由于使用的SDRAM每次讀寫的長度僅為1024×16 bit,而探測器輸出的圖像數據1行的長度卻是2352×16 bit,所以,SDRAM每讀寫完1行1024×16 bit后,要進行一次Burst Stop操作,然后對SDRAM進行刷新,再讀寫下一行,這樣,探測器輸出的每1行要占用SDRAM中的3行。由于數據在讀寫的過程中有Burst Stop等操作的存在,而探測器輸出的每行圖像數據又是連續的,所以,兩者之間就存在速度的不匹配,這就要用到FIFO。當然,這里FIFO的深度不是很深,僅僅用來緩沖兩次Burst Stop和刷新操作時間內的數據即可,設計時當狀態是Burst Stop和刷新狀態時,就將FIFO讀使能信號去掉,其他狀態再恢復讀使能。這樣,探測器的數據就能完整無誤地在SDRAM中寫入和讀出了。
顯然,只需要一套SDRAM控制程序,結合圖2的乒乓操作就可以按照圖1的數據流要求輸出數據了。
基于上述設計思路,FPGA使用Xilinx公司的XC6SLX150,SDRAM使用爾必達公司的EDS5116,探測器使用DALSA公司的Bayer格式彩色CMOS探測器設計的某型相機,實時輸出的彩色圖像如圖4所示。由結果可以看出,圖像偽彩色較少,邊緣較銳利,整體效果優于雙線性算法等其他線性插值算法,甚至要好于某些非線性算法,證明了設計的可行性。

圖4 實時輸出的彩色圖像
本文提出了一種基于大容量存儲器的Bayer格式圖像梯度插值算法硬件設計方案。整個系統由一片FPGA控制,其中,針對特定探測器圖像數據輸出格式,使用了4片SDRAM并結合乒乓操作,完成了探測器數據格式的改變,滿足了插值算法對數據流格式的要求,試驗證明,本系統能夠實時、穩定輸出高質量的彩色圖像,目前,該系統已成功應用于某工程項目之中。
[1]BAYER B E.Color imaging array:U.S.,3971065[P].1975-07-20.
[2]MALVAR H S,HE L W,CUTLER R.High-quality linear interpolation for demosaicing of Bayer-patterned color images[C]//Proc.IEEE International Conference on Acoustics, Speech and Signal Processing.Quebec,Canada:IEEE Press,2004:485-488.
[3]PEI S C,TAM I K.Effective color interpolation in CCD color filter arrays using signal correlation[J].IEEE Trans.Circuits and Systems for Video Technology,2003,13(6):503-513.
[4]雷海軍,劉鵬,陳戰夫,等.視頻格式轉換系統中DDR控制器設計[J].電視技術,2011,35(4):22-24.