下图为《数字图像处理》-冈萨雷斯中的直方图均衡化公式。对于公式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);