MATLAB直方图均衡化函数的计算及使用

MATLAB直方图均衡化函数的计算及使用

本文针对灰度图像的直方图均衡化函数给出运算方法。

图像的直方图展示了图像汇总的不同灰度级的分布。由下图的比较,我们可以清楚地区分:左上原始图像的像素值主要集中在低值处,因此整个图像看起来较为暗沉,不易分辨;而左下处理后的图像进行了灰度均衡化之后,整幅图像的像素值在0~256上分布较为均匀,因此更加清晰可辨。
MATLAB直方图均衡化函数的计算及使用_第1张图片
matlab中有自带函数histeq可以很好地完成灰度直方图均衡化,而本文用的是展开图像频率的直方图均衡化方法,因为这个方法是先求出转换函数再进行计算,因此可以更直观地看出转换过程。
所谓展开图像频率,是指使用如下方程进行处理。
在这里插入图片描述
其中,sk为输出亮度值,T()为转换函数,rk为输入亮度值;L为图像中可能的灰度级数。本文中的原始图像为uint8格式,所以L=2^8=256; Pr为亮度值为rk的像素的分布概率,Pr(rk)=nk/MN,其中MN为像素总个数,nk为像素值为rk的像素点个数。

s0=255pr(r0);
s1=255
[pr(r0)+pr(r1)];

sk=255*[pr(r0)+pr(r1)+…Pr(rk)];
以此类推。
MATLAB直方图均衡化函数的计算及使用_第2张图片
此图即为转换函数图。由此图可以看出,此函数主要将原先集中在亮度值较低处的函数值拉伸到了整个0~255区间上,因此图像会变得更加清晰。
以下为源代码:

I1=imread('Fig1.tif');
[M,N]=size(I1);
subplot(2,2,1);
imshow(I1);         %显示原图
title('original image');
subplot(2,2,2);
h1=imhist(I1);         
bar(h1);            %显示灰度直方图
axis([0 256,-inf,inf]);

%求变换函数
s=[];
s(1)=255*h1(1)/M/N;
for k=2:255
    s(k)=s(k-1)+h1(k)/M/N;
end

%%绘制变换后的图像
I2=[];

    for m=1:M
        for n=1:N
            for k=1:255
            if I1(m,n)==k %遍历I1中的所有像素点
                I2(m,n)=round(s(k));%取整
            end
            end
        end
    end
I2=uint8(I2);  %由于运算后函数为double型,因此需用此句转换为uint8型以显示
subplot(2,2,3);
imshow(I2);      
subplot(2,2,4);
h2=imhist(I2);         
bar(h2);  

figure;
plot(s);

参考文献:
冈萨雷斯.数字图像处理[M].阮天琪,等译.3版.北京:电子工业出版社,2011:72-83

你可能感兴趣的:(matlab)