当前位置:   article > 正文

灰度图的直方图均衡化的原理及实现_灰度图无法均衡化是怎么回事

灰度图无法均衡化是怎么回事
直方图均衡化的作用是图像增强。
有两个问题比较难懂,一是为什么要选用累积分布函数,二是为什么使用累积分布函数处理后像素值会均匀分布。
第一个问题。均衡化过程中,必须要保证两个条件:①像素无论怎么映射,一定要保证原来的大小关系不变,较亮的区域,依旧是较亮的,较暗依旧暗,只是对比度增大,绝对不能明暗颠倒;
②如果是八位图像,那么像素映射函数的值域应在0和255之间的,不能越界。综合以上两个条件,累积分布函数是个好的选择,因为累积分布函数是单调增函数(控制大小关系),并且值域是0到1(控制越界问题),所以直方图均衡化中使用的是累积分布函数。
第二个问题。累积分布函数具有一些好的性质,那么如何运用累积分布函数使得直方图均衡化?

比较概率分布函数和累积分布函数,前者的二维图像是参差不齐的,后者是单调递增的。直方图均衡化过程中,映射方法是:


其中,n是图像中像素的总和,nk是当前灰度级的像素个数,L是图像中可能的灰度级总数。
来看看通过上述公式怎样实现的拉伸。假设有如下图像:



得图像的统计信息如下图所示,并根据统计信息完成灰度值映射:



映射后的图像如下所示:



灰度直方图均衡化实现的步骤:

1.统计灰度级中每个像素在整幅图像中的个数

2.计算每个灰度级占图像中的概率分布

3.计算累计分布概率

4.计算均衡化之后的灰度值

5.映射回原来像素的坐标的像素值


放上源代码:

  1. #include<opencv2\opencv.hpp>
  2. #include<cmath>
  3. #include<iostream>
  4. using namespace cv;
  5. using namespace std;
  6. Mat MyequalizeHist(Mat &srcImage)
  7. {
  8. int nRows = srcImage.rows;
  9. int nCols = srcImage.cols;
  10. int nSumPix[256];
  11. double nProDis[256];
  12. double nSumProDis[256];
  13. int EqualizeSumPix[256];
  14. for (int i = 0; i < 256; i++)
  15. {
  16. nSumPix[i] = 0;
  17. nProDis[i] = 0.0;
  18. nSumProDis[i] = 0.0;
  19. EqualizeSumPix[i] = 0;
  20. }
  21. for (int i = 0; i < nRows; i++)
  22. {
  23. for (int j = 0; j < nCols; j++)
  24. {
  25. nSumPix[(int)srcImage.at<uchar>(i, j)]++;
  26. }
  27. }
  28. for (int i = 0; i < 256; i++)
  29. {
  30. nProDis[i] = (double)nSumPix[i] / (nRows * nCols);
  31. }
  32. nSumProDis[0] = nProDis[0];
  33. for (int i = 1; i < 256; i++)
  34. {
  35. nSumProDis[i] = nSumProDis[i - 1] + nProDis[i];
  36. }
  37. for (int i = 0; i < 256; i++)
  38. {
  39. EqualizeSumPix[i] = cvRound((double)nSumProDis[i] * 255);
  40. }
  41. Mat resultImage(nRows, nCols, srcImage.type());
  42. for (int i = 0; i < nRows; i++)
  43. {
  44. for (int j = 0; j < nCols; j++)
  45. {
  46. resultImage.at<uchar>(i, j) = EqualizeSumPix[(int)srcImage.at<uchar>(i, j)];
  47. }
  48. }
  49. return resultImage;
  50. }
  51. int main()
  52. {
  53. Mat srcIamge = imread("flower.jpg");
  54. if (!srcIamge.data)
  55. {
  56. printf("image could not load...\n");
  57. return -1;
  58. }
  59. Mat srcGray;
  60. //转化为灰度图并且显示
  61. cvtColor(srcIamge, srcGray, CV_BGR2GRAY);
  62. imshow("srcGray", srcGray);
  63. Mat resultImage = MyequalizeHist(srcGray);
  64. imshow("res", resultImage);
  65. waitKey(0);
  66. return 0;
  67. }


原图:



效果图:



声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/148830
推荐阅读
相关标签
  

闽ICP备14008679号