(37条消息) 直方图均衡化

图像增强------对比度增强。对比度增强可以分为(1)直接对比度增强;(2)间接对比度增强。直接对比度增强可以分为线性变换,分线段线性拉伸,以及指数拉伸与对数拉升。间接对比度增强主要就要直方图均衡化。

直方图均衡化的主要思想是:把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

算法过程:

(1)根据图像灰度计算灰度密度函数PDF.

(2)计算积累分布函数CDF。(cumulative distribution function)

(3)将CDF归一化到原图取值范围[0,255]。

(4)将CDF四色五入取整,得到灰度转换函数SK=T(RK)。

(5)把原图像素点值为rk的变换为sk。

PDF的算法:gk = EQ(fk) = (ni/n) = pf(fi) ,ni表示第K个灰度级的像素点个数。n表示图像的像素点总数。

CDF的算法:

灰度转化函数:sk=255*ck。

利用opencv实现如下:

  1. void CMyTestDlg::OnEqualizeHist()
  2. {
  3. std::vector<Mat>splitBGR(src.channels());
  4. split(src, splitBGR);//图像通道分离
  5. for (int i = 0; i < src.channels(); i++)
  6. {
  7. equalizeHist(splitBGR[i], splitBGR[i]);//图像灰度均衡化
  8. }
  9. Mat dst;
  10. merge(splitBGR, dst);
  11. ShowPicture(dst);
  12. }

效果图:

左边为原图,右边为均衡化效果。

c++实现算法:

  1. /*************************************************************************
  2. * 函数名称:
  3. * InteEqualize()
  4. * 参数:
  5. * LPSTR lpDIBBits - 指向源DIB图像指针
  6. * LONG lWidth - 源图像宽度(象素数)
  7. * LONG lHeight - 源图像高度(象素数)
  8. * 返回值:
  9. * BOOL - 成功返回TRUE,否则返回FALSE。
  10. * 说明:
  11. * 该函数用来对图像进行直方图均衡。
  12. ************************************************************************/
  13. BOOL CDibImage::InteEqualize(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
  14. {
  15. unsigned char*lpSrc;// 指向源图像的指针
  16. LONGlTemp;// 临时变量
  17. LONGi;// 循环变量
  18. LONGj;
  19. BYTEbMap[256];// 灰度映射表
  20. LONGlCount[256];// 灰度映射表
  21. LONGlLineBytes;// 图像每行的字节数
  22. lLineBytes = WIDTHBYTES(lWidth * 8);// 计算图像每行的字节数
  23. if (Nbb != NULL)
  24. {
  25. delete[] Nbb;
  26. Nbb = NULL;
  27. }
  28. Nbb = new char[lLineBytes * lHeight + 1];
  29. memcpy(Nbb, lpDIBBits, lLineBytes * lHeight);
  30. for (i = 0; i < 256; i ++)// 重置计数为0
  31. {
  32. lCount[i] = 0;
  33. }
  34. // 计算各个灰度值的计数
  35. for (i = 0; i < lHeight; i ++)
  36. {
  37. for (j = 0; j < lWidth; j ++)
  38. {
  39. lpSrc = (unsigned char *)lpDIBBits + lLineBytes * i + j;
  40. lCount[*(lpSrc)]++;
  41. }
  42. }
  43. // 计算灰度映射表
  44. for (i = 0; i < 256; i++)
  45. {
  46. lTemp = 0;
  47. for (j = 0; j <= i ; j++)
  48. {
  49. lTemp += lCount[j];
  50. }
  51. // 计算对应的新灰度值
  52. bMap[i] = (BYTE) (lTemp * 255 / lHeight / lWidth);
  53. }
  54. for(i = 0; i < lHeight; i++)// 每行
  55. {
  56. for(j = 0; j < lWidth; j++)// 每列
  57. {
  58. // 指向DIB第i行,第j个象素的指针
  59. lpSrc = (unsigned char*)lpDIBBits + lLineBytes * (lHeight - 1 - i) + j;
  60. // 计算新的灰度值
  61. *lpSrc = bMap[*lpSrc];
  62. }
  63. }
  64. return TRUE;
  65. }

效果图:

右图为原图,左图为灰度均衡化后的图片。

(0)

相关推荐

  • phython+opencv图像处理

    做了两天的直方图均衡,还差一点点,先把前面的发布出来,后面的再慢慢来吧 . 直方图均衡主要是用于增强动态范围偏小的图像. 它的基本思想是把原始图像的直方图变换为在整个灰度范围内均匀分布的形式,这样可以 ...

  • (37条消息) 更改pip镜像源

    一.Windows更改pip镜像源 (1)在windows文件管理器中,输入 %APPDATA% (2)会定位到一个新的目录下,在该目录下新建pip文件夹,然后到pip文件夹里面去新建个pip.ini ...

  • (37条消息) pip手动更新

    萌兔biubiu2019-11-23 11:22:39 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.c ...

  • (37条消息) laravel中SQLSTATE[HY000]: General error: 2036

    一.问题: laravel5.5中 static::find($id); 报错 SQLSTATE[HY000]: General error: 2036 (SQL: select * from `-) ...

  • (7条消息) C++中位运算的使用方法

    一:简介1 位逻辑运算符:& (位   "与")  and^  (位   "异或")|   (位    "或")   or~  (位 ...

  • (35条消息) 中国城域网路由情况介绍

    中国的城域网,大概有三张比较典型的,一个是中国移动的CMnet,一个是中国电信IP城域网,还有一个是中国网通IP城域网.作为接入最后的阵地,城域网的业务是最复杂的.含盖了IPTV,语音,Interne ...

  • (35条消息) 家用宽带网络与服务器使用的网络有什么不同?

    很多人都知道,服务器的网络跟家用网络有很多区别.其中有很多技术大牛,都是使用家里的宽带做很多别人使用公网服务器才能完成的服务. 但是对于普通人来讲,似乎都觉得没什么区别,本文就此简单做一下区分: 固定 ...

  • 人才管理框架内容(37条)

    人不是为组织创造价值,而是为组织创造收入. 这对于了解组织内的人员以及如何释放他们的潜力来提高你的业务绩效非常重要,简而言之,组织需要管理和优化最重要的资产-人. 一.人才管理框架的定义? 人才管理框 ...

  • 怎么设置微信公众号添加关注后自动回复多条消息

    怎么设置微信公众号添加关注后自动回复多条消息

  • (40条消息) 5G网络(接入网+承载网+核心网)

    前一段时间自己一直在做某市的5G试点项目,对5G的无线接入网相关技术有了更深入的认识.因此,希望通过无线接入网为线索(行话叫锚点),帮大家梳理一下无线侧接入网+承载网+核心网的架构,这里以接入网为主, ...