当前位置:   article > 正文

OpenCV 对比度增强_opencv 提高对比度

opencv 提高对比度

图像增强的一种重要方法是对比度增强,常见的有以下几种方法:

直方图均衡,局部自适应对比度增强(ACE adaptiveContrastEnhancement),自适应直方图均衡(CLAHE),自动对比度。

1. 直方图均衡

        cv::equalizeHist(src, dst);

2. 自适应直方图均衡(CLAHE)参考

  1. cv::Mat clahe_img = srcGray.clone();
  2. cv::Mat clahe_dst;
  3. cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();
  4. clahe->setClipLimit(8.); // (int)(4.*(8*8)/256)
  5. clahe->setTilesGridSize(Size(32, 32)); // 将图像分为8*8块
  6. clahe->apply(clahe_img, clahe_dst);

3. 局部自适应对比度增强(ACE)参考

  1. void adaptContrastEnhancement()
  2. {
  3. cv::Mat srcMat = cv::imread("1.JPG");
  4. cv::Mat srcGray;
  5. cv::cvtColor(aConMat, srcGray, cv::COLOR_BGR2GRAY);
  6. const int WINSIZE = 15;
  7. const int MAXCG = 10;
  8. Mat localMeansMatrix(srcGray.rows, srcGray.cols, CV_32FC1);
  9. Mat localVarianceMatrix(srcGray.rows, srcGray.cols, CV_32FC1);
  10. if (!getVarianceMean(srcGray, localMeansMatrix, localVarianceMatrix, WINSIZE)) //对Y通道进行增强;
  11. {
  12. cerr << "计算图像均值与标准差过程中发生错误";
  13. return ;
  14. }
  15. Mat temp = srcGray.clone();
  16. Scalar mean;
  17. Scalar dev;
  18. meanStdDev(temp, mean, dev);
  19. float meansGlobal = mean.val[0];
  20. Mat dstMat(srcGray.rows, srcGray.cols, CV_8UC1);
  21. for (int i = 0; i < srcGray.rows; i++) //遍历,对每个点进行自适应调节
  22. {
  23. for (int j = 0; j < srcGray.cols; j++)
  24. {
  25. if (localVarianceMatrix.at<float>(i, j) >= 0.01)
  26. {
  27. float cg = 0.3*meansGlobal / localVarianceMatrix.at<float>(i, j);
  28. float cgs = cg > MAXCG ? MAXCG : cg;
  29. cgs = cgs < 1 ? 1 : cgs;
  30. int e = localMeansMatrix.at<float>(i, j) + cgs * (temp.at<uchar>(i, j) - localMeansMatrix.at<float>(i, j));
  31. if (e > 255) { e = 255; }
  32. else if (e < 0) { e = 0; }
  33. dstMat.at<uchar>(i, j) = e;
  34. }
  35. else
  36. {
  37. dstMat.at<uchar>(i, j) = temp.at<uchar>(i, j);
  38. }
  39. }
  40. }
  41. }
  42. bool getVarianceMean(Mat &scr, Mat &meansDst, Mat &varianceDst, int winSize)
  43. {
  44. if (!scr.data) //判断图像是否被正确读取;
  45. {
  46. cerr << "获取方差与均值的函数读入图片有误";
  47. return false;
  48. }
  49. if (winSize % 2 == 0)
  50. {
  51. cerr << "计算局部均值与标准差的窗口大小应该为单数";
  52. return false;
  53. }
  54. Mat copyBorder_yChannels; //扩充图像边界;
  55. int copyBorderSize = (winSize - 1) / 2;
  56. copyMakeBorder(scr, copyBorder_yChannels, copyBorderSize, copyBorderSize, copyBorderSize, copyBorderSize, BORDER_REFLECT);
  57. for (int i = (winSize - 1) / 2; i < copyBorder_yChannels.rows - (winSize - 1) / 2; i++)
  58. {
  59. for (int j = (winSize - 1) / 2; j < copyBorder_yChannels.cols - (winSize - 1) / 2; j++)
  60. {
  61. Mat temp = copyBorder_yChannels(Rect(j - (winSize - 1) / 2, i - (winSize - 1) / 2, winSize, winSize)); //截取扩展后的图像中的一个方块;
  62. Scalar mean;
  63. Scalar dev;
  64. meanStdDev(temp, mean, dev);
  65. varianceDst.at<float>(i - (winSize - 1) / 2, j - (winSize - 1) / 2) = dev.val[0]; ///一一对应赋值;
  66. meansDst.at<float>(i - (winSize - 1) / 2, j - (winSize - 1) / 2) = mean.val[0];
  67. }
  68. }
  69. return true;
  70. }

4. 自动对比度参考

  1. Mat autocontrost(Mat matface)
  2. {
  3. //进行自动对比度校正
  4. double HistBlue[256] = { 0 };
  5. int bluemap[256] = { 0 };
  6. double dlowcut = 0.1;
  7. double dhighcut = 0.1;
  8. for (int i = 0; i < matface.rows; i++)
  9. {
  10. for (int j = 0; j < matface.cols; j++)
  11. {
  12. int iblue = matface.at<uchar>(i, j);
  13. HistBlue[iblue]++;
  14. }
  15. }
  16. int PixelAmount = matface.rows*matface.cols;
  17. int isum = 0;
  18. // blue
  19. int iminblue = 0; int imaxblue = 0;
  20. for (int y = 0; y < 256; y++)//这两个操作我基本能够了解了
  21. {
  22. isum = isum + HistBlue[y];
  23. if (isum >= PixelAmount * dlowcut*0.01)
  24. {
  25. iminblue = y;
  26. break;
  27. }
  28. }
  29. isum = 0;
  30. for (int y = 255; y >= 0; y--)
  31. {
  32. isum = isum + HistBlue[y];
  33. if (isum >= PixelAmount * dhighcut*0.01)
  34. {
  35. imaxblue = y;
  36. break;
  37. }
  38. }
  39. // 自动色阶
  40. //自动对比度
  41. int imin = 255; int imax = 0;
  42. if (imin > iminblue)
  43. imin = iminblue;
  44. iminblue = imin;
  45. if (imax < imaxblue)
  46. imax = imaxblue;
  47. imaxblue = imax;
  48. /
  49. //blue
  50. for (int y = 0; y < 256; y++)
  51. {
  52. if (y <= iminblue)
  53. {
  54. bluemap[y] = 0;
  55. }
  56. else
  57. {
  58. if (y > imaxblue)
  59. {
  60. bluemap[y] = 255;
  61. }
  62. else
  63. {
  64. // BlueMap(Y) = (Y - MinBlue) / (MaxBlue - MinBlue) * 255 '线性隐射
  65. float ftmp = (float)(y - iminblue) / (imaxblue - iminblue);
  66. bluemap[y] = (int)(ftmp * 255);
  67. }
  68. }
  69. }
  70. //查表
  71. for (int i = 0; i < matface.rows; i++)
  72. {
  73. for (int j = 0; j < matface.cols; j++)
  74. {
  75. matface.at<uchar>(i, j) = bluemap[matface.at<uchar>(i, j)];
  76. }
  77. }
  78. return matface;
  79. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号