Advertisement

《数字图像处理》:直方图处理的几种方式

阅读量:

目录

前言

一、直方图均衡化

1、直方图均衡化的介绍

2、直方图均衡化的数学原理

3、直方图均衡化的matlab代码实现

二、直方图规定化

1、直方图规定化介绍

2、直方图规定化的原理

3、直方图规定化的代码实现

三、局部直方图处理

1、直方图统计引例

2、直方图统计原理的简单介绍

总结

前言

记录一下2020年刚进校园的我,在赖老师“引诱”下,《数字图像处理》的初次学习。

一、直方图均衡化

1、直方图均衡化的介绍

直方图均衡化是一种 简单有效的图像增强技术 ,通过改变图像的直方图来改变图像中各像素的灰度,主要用于 增强动态范围偏小的图像的对比度 。原始图像由于其灰度分布可能集中在较窄的区间,造成图像不够清晰。例如,过曝光将使图像的灰度级集中在高亮度范围内,而曝光不足将使图像灰度级集中在低亮度范围内。采用直方图均衡化,可以把原始图像的直方图变换为均匀分布(均衡)的形式,这样就增加了像素之间灰度值差别的动态范围,从而达到增强图像整体对比度的效果。换言之,直方图均衡化的基本原理是:对在 图像中像素个数多的灰度值 (即对画面起主要作用的灰度值)进行 展宽 ,而对 像素个数少的灰度值 (即对画面不起主要作用的灰度值)进行 归并 ,从而 增大对比度,使图像清晰,达到增强的目的。

(左边为原始图片,右边为均衡化后的图片)

2、直方图均衡化的数学原理

我们先来简单了解一下灰度级的概念。

若把白色与黑色之间按对数关系分成若干级,称为“ 灰度级 ”。范围一般从0到255,白色为255,黑色为0。

接着,我们先来做一个简单的假设。我们假设 rs 分别表示 原图像 灰度级和 经直方图均衡化后的图像 灰度级。

我们将直方图均衡化过程看成是一个 变换函数(变化) 的过程,并且设变换函数为**** s = T(r)****

**** 那么我们又怎么知道这个变换函数的具体表达式呢?这里引入概率论的一个公式。

F_{s}eft =nt_{0}^{s}p_{s}eft ds=nt_{0}^{r}p_{r}eftdr

**** 公式(1-1)

其中, p_{s}eft为s的 概率密度函数 ,同理p_{r}eft为r的 概率密度函数 ,由上面的公式易知,直方图均衡化后,图像的灰度级虽会发生改变,但是它的 灰度级累计概率F_{s}eft 是不变的。

我们将公式(1-1)两边对s进行求导,我们可以得到以下公式(1-2)
p_{s}eft=rac{athrm{d} F_{s}eft}{athrm{d} s}=rac{athrm{d}}{athrm{d} s}=p_{r}rac{athrm{d} r}{athrm{d} s}=p_{r}rac{athrm{d} r}{athrm{d} T}

公式(1-2)

可以看出, 通过变换函数 T(r) 可以控制图像灰度级的概率密度函数 ,从而改善图像的灰度层次,

这就是直方图均衡化的理论基础。

从人眼视觉特性来考虑,一幅图像的灰度直方图如果是均匀分布的,那么该图像看上去效果比较好。

因此要做直方图均衡化,这里的p_{s}应该是 均匀分布 的概率密度函数。

由概率论的知识可知,若原图像没有归一化对于s在区间[0,L-1]的分布,其概率密度函数应该为frac{1}{L-1}

而如果原图像归一化了后,s在区间[0,1]分布,其概率密度函数p_{s}=frac{1}{1-0}=1。

另外,若原图像归一化后,由于p_{s}=1,则公式(1-2)p_{s}=p_{r}eftfrac{dr}{ds}可转化为

ds=p_{r}eftdr

**** 公式(1-3)

对公式(1-3)进行积分,可得
s=T=nt_{0}^{r}p_{r}dr

公式(1-4)

公式(1-4)即为我们所求的 变换 函数展开式

3、直方图均衡化的matlab代码实现

**** 在matlab里面,我们可以直接调用 histeq函数 来对直方图进行均衡化,使用起来非常方便。

但抱着学习的心态,我们还是来看一下 histeq函数 内部的具体实现:

复制代码
 image=imread('orl1_1.bmp');%读入图片。

    
 [height,width]=size(image);%测量图片的高度和宽度。
    
 num_pixel=zeros(1,256);%创建一个单行256列的空矩阵,来统计各灰度值k的像素个数。
    
 for i=1:height
    
  for j=1:width
    
      k=image(i,j);%k为灰度值,i和j表示图片像素点的坐标
    
 num_pixel(k+1)=num_pixel(k+1)+1;%由于数组的下标是从1开始计数,而灰度值K是从0开始的,到255结束。
    
  end
    
 end
    
  
    
  
    
 %显示num_pixel的直方图。
    
 figure;
    
 subplot(111),bar(num_pixel);%这里我用bar函数绘制直方图,用imhist函数也可以绘制
    
  
    
  
    
 %归一化操作,归一化即正则化
    
 P=zeros(1,256);
    
 for i=1:256
    
   P(i)=num_pixel(i)/(height*width);%计算每个灰度值的概率。
    
 end
    
  
    
  
    
 %显示P的直方图,和未归一化的直方图进行比较。
    
 figure;
    
 subplot(121),bar(num_pixel);
    
 subplot(122),bar(P);
    
  
    
  
    
 cum_pixel=cumsum(P);%计算灰度累计分布频率(求积分),就是我们之前说的那个变换函数的展开式。
    
 cum_pixel=uint8((256-1).*cum_pixel+0.5);%先将各灰度的累计频率乘以(L-1),再进行四舍五入化整,以使得均衡化后图像的灰度级与归一化前的原始图像一致。
    
  
    
  
    
 %显示cum_pixel的直方图,并和之前的直方图进行比较。
    
 figure;
    
 subplot(131),bar(num_pixel);
    
 subplot(132),bar(P);
    
 subplot(133),bar(cum_pixel);
    
  
    
  
    
 out_image=uint8(zeros(height,width));%创建一个新的空矩阵,用来储存均衡化后的灰度值数据
    
 for i=1:height
    
    for j=1:width
    
      out_image(i,j)=cum_pixel(image(i,j));%在这里的image(i,j)为索引值,起索引的作用。
    
    end
    
 end
    
  
    
  
    
 figure;
    
 imshowpair(image,out_image,'montage');%利用imshowpair函数将原图和均衡化的数据进行比较,为了显示相同大小的多张图片,我们这里使用‘montage’(蒙太奇)的手法。

二、直方图规定化

1、直方图规定化介绍

讲完直方图的均衡化后,肯定会有同学在想,那我们如何 调节图像对比度 呢?

没错。直方图均衡化虽然能增大对比度、丰富灰度级数。但是只能扩展到整个灰度区间,不能根据我们的实际需要作出相应调整。

灰度规定化 可以弥补这个缺憾,能让我们通过 灰度变换 得到我们想要的灰度分布区间。

直方图规定化就如手机里的对比度调节功能,图像的对比度是由我们来规定的。

2、直方图规定化的原理

p_{r}p_{z}分别表示 原灰度图像目标图像 的灰度分布的概率密度函数。

根据直方图规定化的特点与要求,应使原图像的直方图具有p_{z}所表示的形状。

因此我们要找出p_{r}p_{z}之间的联系。

根据直方图均衡化理论,首先对原图像的直方图进行均衡化处理,即求变换函数。
s=T=nt_{0}^{r}p_{r}dr

公式(1-4)

我们现在 假设 原图像已经被规定化了,我们对规定化后的图像(即目标图像)也采用同样的方法进行均衡化处理。
v=G=nt_{0}^{z}p_{z}dz

公式(2-1)

上式的逆变换(反函数)为
z=G^{-1}

公式(2-2)

上述逆变换表明,我们可以通过均衡化后的灰度值v求出目标图像的灰度值z。由于原图像和目标图像都进行了均衡化处理、我们的灰度区间都是相同的长度[0,255],所以规定化后则 具有相同的概率密度函数
p_{s}=p_{v}

公式(2-3)

因而我们可以用s代替v,得到
z=G{-1}(v)=G{-1}

公式(2-4)

所以我们得到了 目标图像的灰度值z

3、直方图规定化的代码实现

在Matlab中没有直接实现灰度规定化的函数。但我们可以直接通过imhisthisteq 两个函数的灵活使用来实现。

复制代码
 image=imread('原图.png');

    
 image_m=imread('局部处理.png');
    
  
    
 imahe_imhist=imhist(image);
    
 image_m_imhist=imhist(image_m);
    
 result=histeq(image,image_m_imhist);
    
  
    
 figure;
    
 subplot(231),imshow(image),title('原图像');
    
 subplot(232),imshow(image_m),title('模板图像');
    
 subplot(233),imshow(result),title('规定化后的图像');
    
 subplot(234),imhist(image),title('原图像的直方图');
    
 subplot(235),imhist(image_m),title('模板图像的直方图');
    
 subplot(236),imhist(result),title('规定化处理后的图像的直方图');

效果图如下:

PS:直方图规定化:彩色图处理的方法

彩色图的直方图匹配与灰度图像稍有不同,需要分解成RGB进行分别匹配才可以完成彩色图像的直方图匹配。与灰度图像匹配一样,原图像也受到模板图像灰度级的影响。

由于彩色图处理与灰度图处理的原理相同,只是处理数据多了两维,便不作过多介绍了。

三、局部直方图处理

前面我们讨论的两种直方图处理方法是全局性的,在某种意义上,像素基于整幅图像的灰度分布的变换函数修改。

虽然这种全局方法适用于整个图像的增强,但存在这样的情况,增强图像中小区域的细节也是需要的。这些区域中,一些像素的影响在全局变换的计算中可能被忽略了,因为全局变换没有必要保证期望的局部增强。

解决方法是以图像中每个像素的领域中的灰度分布为基础设计变换函数。

下面我将为大家讲一讲 使用直方图统计的局部增强

1、直方图统计引例

****

倘若我们想把左图中黑色区域中的图案凸显出来,得到右图的效果。

那么首先我们要明确我们进行局部处理的目的: 增强低对比度暗区域的对比度。

然而问题是,如何增强暗色区域,但同时尽可能保持明亮区域不变,因为明亮区域不需要增强。

为解决这一问题,我们应该先分辨暗区域与亮区域的不同,再分辨低对比度与高对比度区域的不同,最后增强低对比度的暗区域。

判断 一个区域在点(x,y) 是暗是亮 的方法是把局部平均灰度m_{s_{xy}}与全局平均灰度 m_{G}进行 进行比较。

这样我们就有了第一个判断条件:如果k_{0} m_{G}m_{s_{xy}}k_{1}m_{G},其中k_{0} 和 _k_{1}_是一个值小于等于1.0的正常数,那么我们将把点(x,y)处的像素考虑作为处理的 候选点

2、直方图统计原理的简单介绍

因为我们感兴趣的是增强 低对比度 的区域,所以还需要一个判断条件来判断一个区域的对比度是否可作为增强的候选点。因此,如果 k_{1}n_{G}n_{S_{xy}} k_{2}n_{G} , 𝑘1 <𝑘2 ,则将(x,y)作为候选点。

判断了之后,我们可以简单地通过将已选好的像素值乘以一个指定的常数E来处理,以达到局部增强的目的。

_g=Ent,k_{0}m_{G}eq m_{S_{xy}}eq k_{1}m_{G}_k_{2}n_{G}eq n_{S_{xy}}eq k_{3}n_{G},k_{0}< k_{1},k_{2}<k_{3}

其中,E, _k_{0},k_{1},k_{2},k_{3}_是规定的参数;m_{G} 是输入图像的全局均值; n_{G}是输入图像的全局标准差;参数m_{S_{xy}}和 _n_{S_{xy}}_分别是局部均值和局部标准差。x=0,1,2…,M-1 y=0,1,2,…,N-1,其中M和N是图像行和列的维数。


接下来我们来看看均衡化和局部处理方法处理后的效果对比

全部评论 (0)

还没有任何评论哟~