直方圖均衡化處理的“中心思想”是把原始圖像的灰度直方圖從比較集中的某個灰度區間變成在全部灰度範圍內的均勻分佈。直方圖均衡化就是對圖像進行非線性拉伸,重新分配圖像像素值,使一定灰度範圍內的像素數量大致相同。
我們來看一個灰度圖像,讓表示灰度出現的次數,這樣圖像中灰度爲 的像素的出現概率是
是圖像中所有的灰度數, 是圖像中所有的像素數, 實際上是圖像的直方圖,歸一化到 。
把 作爲對應於 的累計概率函數, 定義爲:
是圖像的累計歸一化直方圖。
我們創建一個形式爲 的變化,對於原始圖像中的每個值它就產生一個 ,這樣 的累計概率函數就可以在所有值範圍內進行線性化,轉換公式定義爲:
注意 T 將不同的等級映射到 域,爲了將這些值映射回它們最初的域,需要在結果上應用下面的簡單變換:
上面描述了灰度圖像上使用直方圖均衡化的方法。
(以上內容摘自維基百科)
用FPGA實現直方圖操作的思路如下:
1)構建大小爲256、深度爲19的數組cnt。cnt[ i ]的作用和px(i)類似,所不同的是,在每一幀圖像中,cnt[ i ]並不是一個概率值,而是用來表示灰度值爲 i 的像素個數。之所以深度爲19,是因爲cnt可能的最大值爲640*480。
2)構建大小爲256、深度爲27的數組sum。sum[ i ]的作用和c(i)類似,用來表示cnt[ i ]的累加和。例如,sum[5] = cnt[ 0 ] + cnt[ 1 ] + cnt[ 2 ] + cnt[ 3 ] + cnt[ 4 ];
3)當掃描至圖像(0,0)點時,所有256個cnt清零;
4)在掃描圖像過程中(除了第一個點以及最後一個點),構建case語句,根據輸入的灰度值i,對cnt進行如下操作:cnt[ i ] <= cnt[ i ]+1;
輸出像素值 <= sum[i]*255/(640*480);
5)當掃描至圖像最後一個像素點時,對sum進行如下操作:
sum[ i ] = cnt[ 0 ] + cnt[ 1 ] + cnt[ 2 ] +……+cnt[ i-1 ] ;
整理思路後,發現寫verilog並不是難事,只是重複的代碼量比較大而已。
最後,附上源碼鏈接:http://u.download.csdn.net/upload/success