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

来源:互联网 发布:快递员端抢件软件 编辑:程序博客网 时间:2024/06/04 19:35

一. 直方图均衡化算法分为三个步骤


直方图均衡化是通过灰度变换将一幅图象转换为另一幅具有均衡直方图,即在每个灰度级上都具有相同的象素点数的过程。

第一步是统计直方图每个灰度级出现的次数(与绘制直方图第一步统计相同)并归一化到0..1;

第二步是累计归一化的直方图;

第三步是计算新的像素值;


第一步:

我们来看一个灰度图像,让表示灰度出现的次数,这样图像中灰度为 的像素的出现概率是

 是图像中所有的灰度数, 是图像中所有的像素数 实际上是图像的直方图,归一化到 



第二步:

把  作为对应于  的累计概率函数定义为:


 是图像的累计归一化直方图


第三步:

通常,直方图均衡化算式如下:


累积分布函数最小值cdfmin在本例中为1, MN分别代表了图像的长宽像素个数(本例中为8×8=64),而L则是灰度级数(如本例中,图像为8位深度,则灰度级数共有2^8=256级数,这也是最常见的灰度级数).


二. 直方图均衡化某实现


(代码来自visual c++数字图像处理开发入门与编程实践)

void GrayEqualize(BYTE* pixel, BYTE* tempPixel, UINT width, UINT height){// 灰度映射表BYTE map[256];long lCounts[256];memset(lCounts, 0, sizeof(long) * 256);// 计算各灰度值个数for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];lCounts[x]++;}// 保存运算中的临时值long lTemp;for (int i = 0; i < 256; i++){lTemp = 0;for (int j = 0; j <= i; j++)lTemp += lCounts[j];map[i] = (BYTE)(lTemp * 255.0f / width / height);}// 变换后的值直接在映射表中查找for (UINT i = 0; i < width * height; i++){int x = pixel[i * 4];tempPixel[i*4] = tempPixel[i*4+1] = tempPixel[i*4+2] = map[x];tempPixel[i*4+3] = 255;}}



三. 举例

直方图

直方图均衡化后

四. 用途和说明


直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。

通常用来增加图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

直方图均衡化对于背景和前景都太亮或者太暗的图像非常有用尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。

直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

所以在增强图像对比度的方法之一是可以使用直方图均衡化.(无论彩色图像还是灰度图都适合使用).



参考:

http://media.cs.tsinghua.edu.cn/~ahz/digitalimageprocess/chapter03/chapt03_ahz.htm

http://zh.wikipedia.org/zh-cn/%E7%9B%B4%E6%96%B9%E5%9B%BE%E5%9D%87%E8%A1%A1%E5%8C%96

说明得非常清楚

原创粉丝点击