【数字图像处理】直方图均衡化详解及编程实现

原创 2011年10月28日 09:31:42
 直方图均衡化的英文名称是Histogram Equalization.
  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
  直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
  缺点:
  1)变换后图像的灰度级减少,某些细节消失;
  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
  这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
  这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。
  直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。设原始图像在(x,y)处的灰度为f,而改变后的图像为g,则对图像增强的方法可表述为将在(x,y)处的灰度f映射为g。在灰度直方图均衡化处理中对图像的映射函数可定义为:g = EQ (f),这个映射函数EQ(f)必须满足两个条件(其中L为图像的灰度级数):
  (1)EQ(f)在0≤f≤L-1范围内是一个单值单增函数。这是为了保证增强处理没有打乱原始图像的灰度排列次序,原图各灰度级在变换后仍保持从黑到白(或从白到黑)的排列。
  (2)对于0≤f≤L-1有0≤g≤L-1,这个条件保证了变换前后灰度值动态范围的一致

性。
  累积分布函数(cumulative distribution function,CDF)即可以满足上述两个条件,并且通过该函数可以完成将原图像f的分布转换成g的均匀分布。此时的直方图均衡化映射函数为:
  gk = EQ(fk) = (ni/n) = pf(fi) ,
  (k=0,1,2,……,L-1)
  上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出fk到gk的灰度映射关系。在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。

关于编程实现,同样是不调用matlab库函数,自己编程实现。这样可以更深刻地理解直方图均衡化技术,提高编程能力。

实现代码(matlab):

%直方图均衡化
I = imread('rice.png');
[height,width] = size(I);
figure
subplot(221)
imshow(I)%显示原始图像
subplot(222)
imhist(I)%显示原始图像直方图

%进行像素灰度统计;
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height
    for j = 1: width
        NumPixel(I(i,j) + 1) = NumPixel(I(i,j) + 1) + 1;%对应灰度值像素点数量增加一
    end
end
%计算灰度分布密度
ProbPixel = zeros(1,256);
for i = 1:256
    ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end
%计算累计直方图分布
CumuPixel = zeros(1,256);
for i = 1:256
    if i == 1
        CumuPixel(i) = ProbPixel(i);
    else
        CumuPixel(i) = CumuPixel(i - 1) + ProbPixel(i);
    end
end
%累计分布取整
CumuPixel = uint8(255 .* CumuPixel + 0.5);
%对灰度值进行映射(均衡化)
for i = 1:height
    for j = 1: width
        I(i,j) = CumuPixel(I(i,j));
    end
end

subplot(223)
imshow(I)%显示原始图像
subplot(224)
imhist(I)%显示原始图像直方图


运行结果:


相关文章推荐

直方图均衡化的数学原理

直方图均衡化的数学原理 直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰...

直方图均衡化

一、直方图均衡化 直方图均衡化一来可以提高图像的对比度,二来可以把图像变换成像素值是几乎均匀分布的图像。 变换 假定r已经标准化在[0,1]区间内,r=0表示黑色,r=1表示白色,变换函数 s=T(r...

直方图均衡化

直方图均衡化 #include #include #include #include using namespace cv; using namespace std; // ======...

直方图均衡化

直方图均衡化是增强图像对比度的一种方法。当一幅图像灰度级分布不均的时候,可以通过直方图均衡化来重新分布灰度。...

直方图均衡化ZT

直方图均衡化 直方图均衡化(Histogram Equalization)是直方图最典型的应用,是图像点运算的一种。对于一幅输入图像,通过运算产生一幅输出图像,点运算是指输出图像的每个像素点的灰度值...
  • woxincd
  • woxincd
  • 2012年07月12日 09:09
  • 4891

直方图均衡化

直方图均衡化 直方图均衡化是对图像的灰阶进行变换,使变换后图像的直方图成为常量值: 目的: l  均衡利用动态范围内的所有灰阶; l  进一步做直方图规定(histogram specificati...

直方图均衡化算法原理与实现

工作后,对原来学习的一些基本图像处理算法有了一些新的认识,比如Canny 算法,直方图均衡化算法等,今天说说直方图均衡化算法。直方图均衡化原理我们知道提高图像对比度的变换函数f(x)f(x)需要满足一...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

[图像增强]二. 直方图均衡化

一. 直方图均衡化算法分为三个步骤 直方图均衡化是通过灰度变换将一幅图象转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。 第一步是统计直方图每个灰度级出现的次数(与绘制直方...
  • cay22
  • cay22
  • 2013年08月07日 15:35
  • 2348

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【数字图像处理】直方图均衡化详解及编程实现
举报原因:
原因补充:

(最多只允许输入30个字)