昨天說了,今天要好好的來解釋說明一下直方圖均衡化。並且通過不調用histeq函數來實現直方圖的均衡化。
一、直方圖均衡化概述
直方圖均衡化(Histogram Equalization) 又稱直方圖平坦化,實質上是對圖像進行非線性拉伸,重新分配圖像象元值,使一定灰度范圍內象元值的數量大致相等。這樣,原來直方圖中間的峰頂部分對比度得到增強,而兩側的谷底部分對比度降低,輸出圖像的直方圖是一個較平的分段直方圖:如果輸出數據分段值較小的話,會產生粗略分類的視覺效果。[1]
根據香農定理關於信息熵的定義:
對於一副圖像而言,當每一個灰度值分布更均衡,圖像所包含的信息量是越大的;相反,僅僅只有一個灰度值的時候,信息量很少。這個是我們能夠想來的比如:純黑圖像包含信息量很少,而其他圖像我們可能會看到一些人物、景物。
就效果而言,直方圖均衡化使得圖像信息量變大,但是不可能會發生較小的灰度值在經過均衡化后變得比原來較大的灰度值更大。這也就意味着,我們通過均衡化后的圖所觀察到的景物應當與原來圖像所觀察到的一致,只是顏色層次更清晰,更加具有辨識度。
二、直方圖均衡化公式推導
(ps:今天一開始看了好多人的推導都覺得特別亂,思路比較混亂,最后自己沉下心來研究了一下,終於將推導思路理順了,在下文進行呈現)
現假定原圖的直方圖-灰度值關系為f(x),則累積灰度直方圖應當是F(x),經過均衡化后的直方圖-灰度值關系為f(y),其累積灰度直方圖應當是F(y)。原灰度值x與后灰度值y之間存在某種映射關系:y=T(x)。
方程兩邊對y求導:
由於有:
可得:
方程兩邊積分:
即
對於離散值而言:
三、直方圖均衡化Matlab代碼實現
clc; clear; RGB = imread('2.jpg'); % 讀取彩色圖 subplot(2,3,1);imshow(RGB);title('彩色圖'); fx=rgb2gray(RGB); subplot(2,3,2);imshow(fx);title('灰度圖'); subplot(2,3,3);imhist(fx);title('灰度圖'); [R, C] = size(fx); % 統計每個像素值出現次數 count = zeros(1, 256); for i = 1 : R for j = 1 : C count(1, fx(i, j) + 1) = count(1, fx(i, j) + 1) + 1; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %一下編寫T函數[2] T = zeros(1, 256); T = double(T); count = double(count); % 統計每個像素值出現的概率, 得到概率直方圖 for i = 1 : 256 T(1, i) = count(1, i) / (R * C); end % 求累計概率,得到累計直方圖 for i = 2 : 256 T(1, i) = T(1, i - 1) + T(1, i); end % 完善T函數的定義 for i = 1 : 256 T(1, i) = T(1, i) * 255; end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 完成每個像素點的映射 fy = double(fx); for i = 1 : R for j = 1 : C fy(i, j) = T(1, fy(i, j) + 1); end end % 輸出仍然要記得改數據類型 fy = uint8(fy); subplot(2,3,5);imshow(fy);title('直方圖均衡化'); subplot(2,3,6);imhist(fy);title('直方圖均衡化');
參考文獻:
[1] https://www.cnblogs.com/hustlx/p/5245461.html.
[2] https://blog.csdn.net/acmore_xiong/article/details/53183131.
2019-03-07
22:24:57