直方图均衡
1.原理
一幅图像的灰度级可以看成是区间[0,L-1]内的随机变量,随机变量的一个最重要的基本描述是其概率密度函数(PDF),记pr(r )和ps(s )分别代表r和s的概率密度函数
由基本概率理论得到一个基本结果如果pr(r )和T(r )已知,且T(r )满足在区间0<r<L-1中为单值且单调递增,那么变换变量s的概率密度函数ps(s)可由以下简单公式得到:
因此,变换变量s的概率密度函数由输入图像的灰度级PDF和所选的变换函数决定。
图像处理中一个尤为重要的变换函数,即单值单调递增的灰度级变换函数的定义为:
因为概率密度函数永远为正,并且函数积分是一个函数曲线下的面积,所以它遵循该函数是单值单调增加的条件。
可见上式给出的ps(s)形式为均匀密度概率函数
对于离散值,我们处理其概率密度与和,而不是概率密度函数和积分
一副图像中灰度级rk出现的概率近似为:
其中MN是图像像素的总数,nk是灰度级为rk的像素个数,L为灰度级的数量
连续函数的变换函数:
连续函数的变换函数的离散形式为:
因此,通过上式,将输入图像中灰度级为rk的各像素映射到输出图像中的灰度级为sk的对应像素得到
称为直方图均衡
2.Matlab编程
%读取图像
I = imread('pict2.jpg');
%显示原图
figure;
imshow(I);
%获得输入图像尺寸M、N、C(size函数)
[height,width,d] = size(I);
%转换成灰度图像并显示
if( d > 1)
I = rgb2gray(I);
figure;
imshow(I);
end
nbins = 256;
%计算原图像J的灰度直方图h
%或者通过两重循环遍历每个像素点从而得到每个灰度值的累计像素点个数)。
hist_0 = imhist(I,nbins);
%显示原图的灰度直方图
imhist(I);
%计算原图的灰度分布概率hs, hs=h/(M*N) (i=0,1,…,255)。
hist_1 = hist_0/(height*width);
%计算原图灰度的累计分布hp0(使用cumsum函数)
hp_0 = cumsum(hist_1);%cumsum默认按列累
%hp1=hp0*255 将hp1四舍五入
hp_1 = round(hp_0*255);
hp_1(1) = 0;
I0 = double(I);
%置两重循环遍历图像F中所有像素点,求出每一个像素点的灰度值F(i,j)
for i = 1:height
for j = 1:width
Old_Grayscale = I0(i,j);
New_grayscale = hp_1(Old_Grayscale+1);
J(i,j) = New_grayscale;
end
end
%显示直方图均衡后的图像
J = uint8(J);
figure;
imshow(J);
figure;
imhist(J);
%合并显示
subplot(2,2,1);
imshow(I); title('原图的灰度图');
subplot(2,2,2);
imhist(I); title('原图直方图');
subplot(2,2,3);
imshow(J); title('均衡后的灰度图');
subplot(2,2,4);
imhist(J); title('均衡后灰度图的直方图');