直方图均衡化的英文名称是Histogram Equalization. 

  图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
  直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
  缺点: 
  1)变换后图像的灰度级减少,某些细节消失; 
  2)某些图像,如直方图有高峰,经处理后对比度不自然的过分增强。 
  直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。 
  这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
  这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景杂讯的对比度并且降低有用信号的对比度。

1.连续灰度值

r:待处理图像的灰度。假设r的取值区间[0,L-1], r = 0表示黑色,r = L - 1表示白色。

变换形式: s = T(r);

pr(r)和ps(s)分别表示变量 r 和 s 的概率密度函数(PDF)。

输出灰度变量s的PDF由输入灰度的PDF的变换函数:s = T(r) = (L - 1)∫pr(w)dw.

其中,w是积分的假变量。公式右边是随机变量 r 的累积分布函数(CDF).

新图像中的灰度的PDF是均匀的,ps(s) = 1/(L - 1);

 

2.离散灰度值

pr(rk) = nk/MN,  k = 0,1,2...,L-1

其中,MN是图像中像素的总数,nk是灰度为rk的像素个数。

输出灰度变量s的PDF由输入灰度的PDF的变换函数:sk = T(rk) = ((L - 1)/MN)∑nj,  k = 0,1,2...,L-1.

 

matlab调用自带函数编码实现:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');
f_enhance = histeq(f);
subplot(221)
imshow(f)
subplot(222)
imshow(f_enhance)
subplot(223)
imhist(f)
subplot(224)
imhist(f_enhance)

 

显示:

 

matlab手动实现:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');

[height,width] = size(f);
f_enhance = uint8(zeros(height,width));

%统计各灰度数目,共256个灰度级
Num_Pixel = zeros(1,256);
for i = 1:height
for j = 1:width
Num_Pixel(f(i,j) + 1) = Num_Pixel(f(i,j) + 1) + 1;
end
end

%计算灰度分布密度
Prob_Pixel = zeros(1,256);
for i = 1:256
Prob_Pixel(i) = Num_Pixel(i)/ (height * width * 1.0);
end

%计算累计直方图分布
Equalization_Pixel = zeros(1,256);
for i = 1:256
if i ==1
Equalization_Pixel(i) = Prob_Pixel(i);
else
Equalization_Pixel(i) = Equalization_Pixel(i - 1) + Prob_Pixel(i);
end
end

%对灰度值进行映射(均衡化)
pixel_max=255;
pixel_min=0;
for i = 1:height
for j = 1: width
f_enhance(i,j) = Equalization_Pixel(f(i,j)+1)*(pixel_max-pixel_min)+pixel_min;
end
end

subplot(221)
imshow(f)
subplot(222)
imshow(f_enhance)
subplot(223)
imhist(f)
subplot(224)
imhist(f_enhance)

 

显示:

 

上面代码在手动实现时本想调用matlab自带函数求概率分布以及转换后的灰度值,实现过程中发现用以下方法行不通,无法把均衡后的灰度值替换回去,还未解决,不知用以下方法是否有解决办法,希望有老师愿意指导一下,谢谢!

代码:

f = imread('D:\图像处理\image\DIP3E_Original_Images_CH03\Fig0316(2)(2nd_from_top).tif');

[m,n] = imhist(f);%进行像素灰度级统计
x = m ./ numel(f);%概率近似

y = zeros(1,256);
for i = 1:256
if i == 1
y(i) =x(i);
else
y(i) =(y(i-1) + x(i));
end
end
y = 255 * y; %直方图均衡化

 

参考资源链接:http://blog.csdn.net/ebowtang/article/details/38236441

 http://blog.csdn.net/zhengxiaoyang995926/article/details/79515411