摘 要: 介紹了視頻圖像" title="視頻圖像">視頻圖像灰度信號直方圖均衡" title="直方圖均衡">直方圖均衡實時處理" title="實時處理">實時處理的FPGA實現(xiàn),重點介紹了灰度信號直方圖統(tǒng)計和SDRAM控制器實現(xiàn)的方案。
關(guān)鍵詞: 直方圖均衡 直方圖統(tǒng)計 FPGA SDRAM控制器
直方圖均衡作為一種基礎(chǔ)的圖像處理方法在很多領(lǐng)域得到應(yīng)用,但大多是通過DSP或者CPU編程實現(xiàn),其優(yōu)點是靈活性比較高,調(diào)試方便,最大的缺點是很難做到實時或者準實時處理,這在某些領(lǐng)域是不可接受的。而使用FPGA實現(xiàn)可以很好地解決實時處理的難題,而且目前的FPGA資源容量已經(jīng)很豐富,片內(nèi)的SRAM/PLL/邏輯資源已經(jīng)足以應(yīng)對一般圖像處理算法的需要,同時隨著價格的不斷下降,客觀上使得FPGA成為圖像處理算法實現(xiàn)不錯的選擇。
本文主要介紹在FPGA上實現(xiàn)直方圖均衡算法的總體結(jié)構(gòu)和最重要的兩個子模塊的實現(xiàn)細節(jié),以及最終的實現(xiàn)結(jié)果。
1 直方圖均衡的理論基礎(chǔ)
原始圖像灰度值r歸一化在0~1之間,p(r)為原始圖像灰度分布的概率密度函數(shù)。直方圖均衡化處理實際上就是尋找一個灰度變換函數(shù)T,使得變化后的灰度值s=T(r), 其中,s歸一化為0~1,即建立r與s之間的映射關(guān)系,要求處理后圖像灰度分布的概率密度函數(shù)p(s)=1,期望所有灰度級出現(xiàn)概率相同。
對于數(shù)字圖像離散情況,其直方圖均衡化處理的計算步驟如下:
(1)統(tǒng)計原始圖像的直方圖
式中,rk是歸一化的輸入圖像灰度;nk是輸入圖像中歸一化灰度等于rk的像素個數(shù);n是輸入圖像的像素總數(shù)。
(2)計算直方圖累積分布曲線
(3)用累積分布函數(shù)作變換函數(shù)進行圖像灰度變換
根據(jù)計算得到的累積分布函數(shù),建立輸入圖像與輸出圖像灰度之間的對應(yīng)關(guān)系,最后要將變換后的灰度恢復(fù)成原先范圍。
2 FPGA實現(xiàn)的總體結(jié)構(gòu)
從上面對直方圖均衡算法的描述可知,在進行直方圖均衡以前,首先必須對圖像灰度進行統(tǒng)計,然后再計算輸出。而要統(tǒng)計一幅圖像的全局灰度信息,就不得不把整幅圖像先寫入緩存。雖然FPGA內(nèi)部的SRAM資源豐富,但是仍然無法滿足整幅圖像存儲的需要。因此,需要以SDRAM作為圖像緩存,存儲前后兩場視頻圖像,然后再計算輸出。SDRAM的容量、速度都能滿足直方圖均衡算法的要求,唯一的缺點是必須有相應(yīng)的SDRAM控制器控制SDRAM的讀寫和刷新操作。下面簡要介紹總體實現(xiàn)的方案,其實現(xiàn)框圖如圖1所示。
從圖1中可以看出,在輸入端,模擬復(fù)合視頻數(shù)據(jù)經(jīng)過視頻圖像解碼進入FPGA,在FPGA里先對數(shù)據(jù)進行簡單處理,產(chǎn)生內(nèi)部使用的行同步信號/場同步信號/數(shù)據(jù)有效信號和16bit" title="16bit">16bit YUV4:2:2格式的視頻信號。然后,灰度信息進入灰度直方圖統(tǒng)計模塊對當前灰度信息出現(xiàn)的頻率加以統(tǒng)計,將統(tǒng)計信息以乒乓的方式存入SRAM,與此同時所有視頻數(shù)據(jù)通過“寫”控制模塊和SDRAM控制器存入SDRAM;在輸出端,在“讀”控制單元" title="控制單元">控制單元的控制下通過SDRAM控制模塊從SDRAM讀出上一場的數(shù)據(jù)進入灰度變換模塊,根據(jù)存儲的上一場的灰度統(tǒng)計信息,對數(shù)據(jù)進行灰度變換。這樣就完成了完整的灰度直方圖均衡變換。
如果需要在顯示設(shè)備(如PC顯示器)上顯示,還必須要有時序產(chǎn)生/圖像數(shù)據(jù)格式變換等模塊。另外,由于需要對某些內(nèi)部參數(shù)進行調(diào)整(如SDRAM的Latency等),必須有一個控制接口和外部相連,在這里使用了一個I2C協(xié)議接口。
在所有模塊中最主要的實現(xiàn)單元主要有兩大部分,一個是直方圖統(tǒng)計和灰度變換模塊,另一個是SDRAM控制器和讀寫控制單元。下面將詳細介紹這兩部分。
3 直方圖統(tǒng)計的實現(xiàn)結(jié)構(gòu)
直方圖統(tǒng)計是通過FPGA內(nèi)部兩塊雙端口SRAM的乒乓操作實現(xiàn)的。其中每塊SRAM的地址反映了灰度值的大小,而SRAM每個單元的數(shù)據(jù)寬度必須相應(yīng)于每場圖像的像素數(shù)量。例如,對于我國PAL制的電視圖像來說,根據(jù)ITU-R BT.601/656數(shù)字視頻標準規(guī)定每一場數(shù)字化后的視頻圖像,它的有效數(shù)據(jù)是每行720個有效點,每場288個有效行,每場總共207360個有效像素點,平均每個點16bit的數(shù)據(jù)量,其中有8bit灰度數(shù)據(jù)。所以在選取SRAM的大小時,應(yīng)該選擇容量為256(2的8次方)、數(shù)據(jù)寬度為18位(207 360大于2的17次方)的SRAM。但是為了擴展的方便,實際使用中使用了容量為256、數(shù)據(jù)寬度為22位的SRAM,這樣可以對數(shù)據(jù)量更大的圖像加以處理。
每當一個新的圖像數(shù)據(jù)進入統(tǒng)計模塊,就將SRAM內(nèi)相應(yīng)地址的統(tǒng)計數(shù)據(jù)讀出,累加后再存入該地址。由于前后數(shù)據(jù)可能是一樣的,會造成對同一個SRAM地址同時讀寫而引起錯誤。這就需要一個模塊對整個過程加以控制?;镜乃悸肥牵簩η昂髷?shù)據(jù)進行比較,若前后數(shù)據(jù)相等就將計數(shù)器累加,直到發(fā)現(xiàn)數(shù)據(jù)不等才將統(tǒng)計數(shù)據(jù)寫入SRAM,這樣就從根本上避免了讀寫同一個地址的可能性。直方圖統(tǒng)計狀態(tài)機實現(xiàn)框圖如圖2所示。
由于使用了乒乓模式(一塊SRAM用于當前場的統(tǒng)計,另一塊用于前一場灰度均衡的計算),狀態(tài)機在上電復(fù)位后首先需要將用于統(tǒng)計的SRAM清空,這可以利用視頻的場消隱時間加以處理(相應(yīng)的狀態(tài)機狀態(tài)是CLEAR SRAM狀態(tài)),然后等待有效數(shù)據(jù)進入(對應(yīng)于STBY狀態(tài)),一旦有效灰度數(shù)據(jù)進入,狀態(tài)機就進入統(tǒng)計狀態(tài)0(CALCULATION HISTOGRAM STEP0)。此時,首先讀出SRAM相應(yīng)于該灰度值的數(shù)據(jù),同時將數(shù)據(jù)延遲并觀察前后數(shù)據(jù)是否相同,如相同則繼續(xù)停留在該狀態(tài),將計數(shù)器加1;否則進入統(tǒng)計狀態(tài)1(CALCULATION HISTOGRAM STEP1)。進入狀態(tài)1后,計算上一個灰度值的統(tǒng)計數(shù)據(jù)(將從SRAM中讀出的值加上計數(shù)器的值再加1)存入SRAM,同時還要讀出SRAM里相應(yīng)于當前灰度值的數(shù)據(jù)。此后的工作與狀態(tài)0相似。以此類推,狀態(tài)不斷在狀態(tài)0和狀態(tài)1之間切換,直到有效數(shù)據(jù)結(jié)束后進入統(tǒng)計狀態(tài)2(CALCULATION HISTOGRAM STEP2),狀態(tài)2 的作用是將這一行的最后一個灰度數(shù)據(jù)的統(tǒng)計信息寫入SRAM。隨后回到STBY狀態(tài),等待下一行數(shù)據(jù)。當所有有效行都統(tǒng)計完后,進入狀態(tài)機的統(tǒng)計狀態(tài)3(CALCULATION HISTOGRAM STEP3),重新將灰度統(tǒng)計數(shù)據(jù)累計后存入SRAM。
4 SDRAM 控制器的實現(xiàn)結(jié)構(gòu)
輸入輸出視頻圖像的速度(13.5MHz)遠低于SDRAM的最高速度(143MHz),假如以單個數(shù)據(jù)對SDRAM讀寫(Single Write/Single Read),根本無法發(fā)揮SDRAM高速的優(yōu)勢,所以必須使用SDRAM的突發(fā)模式(BURST MODE),即一次讀出或者寫入多個數(shù)據(jù)。以美光公司(MICRON)MT48LC1M16A1S SDRAM為例,它支持1、2、4、8個字或者整頁(256個字)的讀寫。由于屬于兩個時鐘域,所以必須對寫入或者讀出SDRAM的數(shù)據(jù)緩存。在這里,讀寫模塊分別使用兩個深度為64、寬度為16bit的雙口SRAM以乒乓的方式加以實現(xiàn)。一次突發(fā)模式讀寫的數(shù)據(jù)量都是64個字,因此選擇深度為64的SRAM是一種折衷的辦法,數(shù)據(jù)過少無法發(fā)揮突發(fā)模式的優(yōu)勢,數(shù)據(jù)過大則需要更多的SRAM作為緩存,使開銷過高。實踐證明一次讀寫64個數(shù)據(jù)比較合適。
由于SDRAM結(jié)構(gòu)的特殊性,它的讀寫刷新操作需要滿足一定的時序要求,所以需要專門的控制器來維護對SDRAM的操作。圖3是Hynix Electronics公司HY5DV641622AT 的SDRAM的狀態(tài)機框圖,該框圖包含SDRAM上電時序、模式寄存器的設(shè)置、讀寫控制、預(yù)充電和定時刷新等多個環(huán)節(jié)。控制器的具體實現(xiàn)可以參考Xillinx或者Altera公司相關(guān)文檔和各家DRAM廠商的資料。
需要說明的是對SDRAM的地址劃分問題。由于采用了乒乓模式,SDRAM也自然被劃分為兩個部分,一部分用于當前場的存儲,另一部分用于前一場的讀取,也就是說在存儲/統(tǒng)計當前場的同時,將前一場讀出并且計算灰度后輸出。至于地址的具體劃分則要考慮到SDRAM容量大小和輸入視頻大小。以MT48LC1M16A1S SDRAM為例,該SDRAM 的結(jié)構(gòu)是512K×16×2,每塊SDRAM被分為兩個BANK,每個BANK有2 048行,每行256個16bit的字,總計1M字。而PAL制電視以ITU656數(shù)字化后的單場數(shù)據(jù)大約是202K字,NTSC大約是170K字,480P(YUV4:2:2格式)每幀大約是337K字,所以可以考慮將SDRAM以BANK劃分,每個BANK存儲一場/一幀。
另外一個問題牽涉到邏輯地址到物理地址的映射問題,即由于PAL制每行有720個點,而SDRAM每行只有256個存儲單元,所以一行圖像需要占據(jù)稍小于三行的SDRAM空間,三行中的最后一行的最后一點空間不加利用。SDRAM讀寫控制單元的地址產(chǎn)生模塊需要注意這一點。SDRAM的具體劃分圖如圖4所示。
5 實驗結(jié)果與說明
實驗結(jié)果如圖5、圖6所示。從實驗結(jié)果可以看出,直方圖均衡后的圖像對比度得到了明顯的提高。但是,直方圖均衡算法的缺點同樣明顯,噪聲對直方圖均衡的影響非常大。從對原圖的處理結(jié)果就可以看到,原圖的背景噪聲并不明顯,但是經(jīng)過直方圖均衡后變得非常突出。這就需要對算法進行改進,例如對局部圖像進行統(tǒng)計,然后和全局圖像統(tǒng)計數(shù)據(jù)進行比較,最后決定是否對該區(qū)域進行均衡。但這超出了本文的論述范圍。
?
參考文獻
1 Gonzalez R C. Digital image processing. 北京:電子工業(yè)出版社, 2003
2 XAPP 134(V3.4). Synthesizable high-performance SDRAM controllers. Xilinx公司, 2005
3 SDR SDRAM controller white paper. Altera公司,2005
4 MT48LC1M16A1S data Sheet.Micron 公司,1999
5 HY5DV641622 data sheet. Hynix Electronic公司,2002