直方圖均衡化Matlab代碼實現 數字圖像處理

下圖爲《數字圖像處理》-岡薩雷斯中的直方圖均衡化公式。對於公式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);


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章