织梦CMS - 轻松建站从此开始!

罗索

直方图均衡化

落鹤生 发布于 2014-07-23 11:19 点击:次 
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,
TAG: 直方图均衡化  图像增强  直方图  

1概述

a、b前;c、d后

a、b前;c、d后

图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。
直方图均衡化的英文名称是Histogram Equalization.
直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

2基本思想

直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。
直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。设原始图像在(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的均匀分布。此时的直方图均衡化映射函数为:
= EQ() = (ni/n) = pf(
) ,
(k=0,1,2,……,L-1)
上述求和区间为0到k,根据该方程可以由源图像的各像素灰度值直接得到直方图均衡化后各像素的灰度值。在实际处理变换时,一般先对原始图像的灰度情况进行统计分析,并计算出原始直方图分布,然后根据计算出的累计直方图分布求出
的灰度映射关系。在重复上述步骤得到源图像所有灰度级到目标图像灰度级的映射关系后,按照这个映射关系对源图像各点像素进行灰度转换,即可完成对源图的直方图均衡化。

3优缺点

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

4示例程序

程序:
  1. // 锁定DIB并返回指向DIB的指针 
  2. LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) hDIB); 
  3. // 找到DIB图像象素起始位置并返回指向DIB象素指针 
  4. LPSTR lpDIBBits = m_clsDIB.FindDIBBits(lpDIB); 
  5. // 获取DIB的宽度 
  6. LONG lWidth = m_clsDIB.DIBWidth(lpDIB); 
  7. // 获取DIB的高度 
  8. LONG lHeight = m_clsDIB.DIBHeight(lpDIB); 
  9. for (i = 0; i < lHeight; i ++) // 对各像素进行灰度转换 
  10. for (j = 0; j < lWidth * 3; j ++) 
  11. // 对各像素进行灰度统计 
  12. unsigned char R = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  13. nNs_R[R]++; j++; 
  14. unsigned char G = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  15. nNs_G[G]++; j++; 
  16. unsigned char B = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  17. nNs_B[B]++; 
  18. for(i=0;i<256;i++) // 计算灰度分布密度 
  19. fPs_R[i] = nNs_R[i] / (lHeight * lWidth * 1.0f); 
  20. fPs_G[i] = nNs_G[i] / (lHeight * lWidth * 1.0f); 
  21. fPs_B[i] = nNs_B[i] / (lHeight * lWidth * 1.0f); 
  22. for(i = 0; i < 256; i++) 
  23. //计算累计直方图分布 
  24. if(i == 0) 
  25. temp_r[0] = fPs_R[0]; 
  26. temp_g[0] = fPs_G[0]; 
  27. temp_b[0] = fPs_B[0]; 
  28. else 
  29. temp_r[i] = temp_r[i-1] + fPs_R[i]; 
  30. temp_g[i] = temp_g[i-1] + fPs_G[i]; 
  31. temp_b[i] = temp_b[i-1] + fPs_B[i]; 
  32. //累计分布取整,nNs_R[]、nNs_G[]、nNs_B[]保存有计算出来的灰度映射关系 
  33. nNs_R[i] = (int)(255.0f * temp_r[i] + 0.5f); 
  34. nNs_G[i] = (int)(255.0f * temp_g[i] + 0.5f); 
  35. nNs_B[i] = (int)(255.0f * temp_b[i] + 0.5f); 
  36. for (i = 0; i < lHeight; i ++) 
  37. for (j = 0; j < lWidth * 3; j ++) 
  38. //对R分量进行灰度映射(均衡化) 
  39. unsigned char R = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  40. *((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_R[R]; 
  41. j++; 
  42. //对G分量进行灰度映射(均衡化) 
  43. unsigned char G = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  44. *((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_G[G]; 
  45. j++; 
  46. //对B分量进行灰度映射(均衡化) 
  47. unsigned char B = *((unsigned char *)lpDIBBits + lWidth * 3 * i + j); 
  48. *((unsigned char *)lpDIBBits + lWidth * 3 * i + j) = nNs_B[B]; 

 

(zhaquanmin)
本站文章除注明转载外,均为本站原创或编译欢迎任何形式的转载,但请务必注明出处,尊重他人劳动,同学习共成长。转载请注明:文章转载自:罗索实验室 [http://www.rosoo.net/a/201407/17012.html]
本文出处:百度百科 作者:zhaquanmin 原文
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片
栏目列表
将本文分享到微信
织梦二维码生成器
推荐内容