灰度直方图之直方图均衡化

来源:互联网 发布:淘宝怎么利用微淘推广 编辑:程序博客网 时间:2024/06/05 03:30

      直方图均衡化

       在我们对图片进行处理时,有些图像的灰度主要集中分布在一个较小的灰度范围内从而导致图像的对比度很弱,如果我们采用灰度拉伸或者非线性变换,也能达到一定的增强效果。但还是没能达到预期的效果。而直方图均衡则将原始图像的灰度均匀的分布在允许的灰度范围内,扩大灰度的显示范围,从而能较好的提高图像对比度,增强图像。

       假如输入图像像素数为N,它具有灰度直方图Ih,具有灰度级(I1-I2);输出图像具有灰度直方图Oh,具有灰度级(o1-o2);设变换函数为F,即Oh=F(Ih);因此,我们要解决的就是得到F的表达式,知道原有直方图与均衡后直方图的映射关系。

       对于In中的某一灰度级Im,经过函数F变为Ou中的Om,即会有如下的关系式,因为灰度在变换的前后,像素数是不变的。


均衡化后的直方图应该满足各个灰度级的像素数相等,即


因而,有


所以


即为原直方图的灰度累计概率分布函数,一般的O2取255,O1取0,

即得到如下公式:

        

这也是我们在图像处理中,用的最多的公式。


实现步骤如下:

1、统计原图像中各灰度的像素数目。

2、计算出原图像的灰度分布概率函数。

3、计算原图像的灰度累计分布函数。

4、通过最后一个公式即得到Oh。

5、根据上面的结果得到均衡后的灰度分布。

需要注意的是,本算法只针对单波段灰度图像。如果要对彩色图像进行均衡化,

参见:点击打开链接


Matlab代码如下:

function f = Histogram_Equalization(In)
[height,width] = size(In);  
figure  ;
subplot(121)  ;
imshow(In)%显示原始图像  
subplot(122)  ;
imhist(In);%显示原始图像直方图  
  
%进行像素灰度统计;  
Ih = zeros(1,256);
for i = 1:height  
    for j = 1: width  
        Ih(In(i,j) + 1) = Ih(In(i,j) + 1) + 1;
    end  
end  
%计算灰度分布密度  
p = zeros(1,256);  
for i = 1:256  
    p(i) = Ih(i) / (height * width * 1.0);  
end  
%计算累计直方图分布  
c = zeros(1,256);  
c(1) = p(1);
for i = 2:256   
        c(i) = c(i - 1) + p(i);  
end  
%累计分布取整
c = uint8(255 .* c );  
%对图像进行均衡化
for i = 1:height  
    for j = 1: width  
        In(i,j) = c(In(i,j)+1);  
    end  
end  
figure;
subplot(121)  ;
imshow(In);%显示均衡化后的图像
subplot(122)  ;
imhist(In);%显显示均衡化后的图像的直方图  
end



原创粉丝点击