下圖爲《數字圖像處理》-岡薩雷斯中的直方圖均衡化公式。對於公式3.3-7即爲求圖像的歸一化直方圖,可以理解爲求圖像灰度的概率密度函數。
歸一化直方圖的求法可以在我的另一篇博客https://blog.csdn.net/u013573243/article/details/105201631中找到,也可以用matlab自帶的函數實現。
而下面的3.3-8式,則是直方圖均衡化的公式,可以理解爲變形的概率分佈函數。而直方圖均衡化則是利用這個函數對原圖像的灰度值做映射。下面借用數字圖像處理課本中的例子作解釋。
假設有一幅64x64的圖片,其中灰度級爲0的像素有790個佔19%,其中灰度級爲1的像素有1023個佔25%......如上表所示。利用3.3-8式計算映射函數sk = T(kr)。
經過公式計算,其中原灰度級爲0的現在被映射爲1,原灰度級爲1的變爲3,原灰度級爲2的變爲5,原灰度級爲3和4的變爲6,原灰度級爲5,6,7的變爲7。
下面爲我的實現結果。
下面給出Matlab代碼
其中Get_Histogram函數可以在我的博客https://blog.csdn.net/u013573243/article/details/105201631中找到,也可以用matlab自帶的直方圖函數後在進行歸一化。
% -------------------------------------------------------------------------
% Author:xingdapai
% Time: 2020/03/01
% -------------------------------------------------------------------------
% Hist_Equalize: 均衡化函數
% 輸入(圖片矩陣)
% 返回[均衡後直方圖數列, 均衡後圖片]
% -------------------------------------------------------------------------
function [outputList, outputImg] = Hist_Equalize(inputImg)
outputImg = inputImg;
imgHist = Get_Histogram(inputImg);
[imgHeight, imgWidth] = size(inputImg);
grayMap = imgHist;
outputList = zeros(1, 256);
for i = 2 : 256
grayMap(i) = grayMap(i) + grayMap(i - 1);
end % for i
grayMap = grayMap * 255 + 0.5;
grayMap = floor(grayMap) + 1;
for i = 1 : imgHeight
for j = 1 : imgWidth
imgGrayLvl = inputImg(i, j) + 1;
nowGrayLvl = grayMap(imgGrayLvl);
outputImg(i, j) = nowGrayLvl;
outputList(nowGrayLvl) = outputList(nowGrayLvl) + 1;
end %for j
end %for i
outputList = outputList / (imgHeight * imgWidth);
outputImg = uint8(outputImg);