当前位置:   article > 正文

opencv 自适应二值化cv::adaptiveThreshold()函数详解(复杂背景下提取划痕)

cv::adaptivethreshold

前言

从以下复杂背景图片下提取划痕
在这里插入图片描述
假设采用全局阈值二值化, cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV),很难得到最优的二值化效果,划痕没有完整提取出来,反而把背景也提取出来了:
在这里插入图片描述

这个时候就需要一种能够自适应的二值化算法上场了。

一、opencv cv::adaptiveThreshold()函数

1.函数原型:

CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
                                     double maxValue, int adaptiveMethod,
                                     int thresholdType, int blockSize, double C );
  • 1
  • 2
  • 3

2.参数说明:

src:输入8位单通道图像。
dst:输出图像,大小和类型与src相同。
maxValue:满足条件的像素所分配的非零值。
adaptiveMethod:要使用的自适应阈值算法,ADAPTIVE_THRESH_MEAN_C或者ADAPTIVE_THRESH_GAUSSIAN_C
thresholdType:阈值类型,必须是THRESH_BINARY或者HRESH_BINARY_INV,指示要提取亮区域还是暗区域
blockSize:用于计算像素阈值的像素邻域的大小:3,5,7,以此类推。
C:偏移值调整量,从每个邻域计算出的平均值或高斯加权平均值中减去的常量,就是最终阈值,它可以是正的,也可以是零或负的。

3.函数原理:

算法通过计算每个像素周围blockSize x blockSize大小像素块的加权均值并减去常量C得到该像素值的最终阈值,每个像素都会有一个自适应的动态阈值。

代码示例

   cv::Mat src;
    src = cv::imread("D:\\QtProject\\Opencv_Example\\adaptiveThreshold\\adaptiveThreshold.png", cv::IMREAD_GRAYSCALE);
    if (src.empty()) {
      cout << "Cannot load image" << endl;
      return;
    }
    //全局二值化
    cv::Mat globalBinayImage;
    cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV);


    //自适应二值化
    cv::Mat binaryImage;
    cv::adaptiveThreshold(src, binaryImage, 255,cv::THRESH_BINARY_INV, cv::ADAPTIVE_THRESH_GAUSSIAN_C, 7,8);

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

程序运行效果:
在这里插入图片描述

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

闽ICP备14008679号