直方图均衡化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);


 

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