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

文章目录

  • 前言
  • 一、opencv cv::adaptiveThreshold()函数
    • 1.函数原型:
    • 2.参数说明:
    • 3.函数原理:
  • 代码示例

前言

从以下复杂背景图片下提取划痕
opencv 自适应二值化cv::adaptiveThreshold()函数详解(复杂背景下提取划痕)_第1张图片
假设采用全局阈值二值化, cv::threshold(src, globalBinayImage, 150, 255, cv::THRESH_BINARY_INV),很难得到最优的二值化效果,划痕没有完整提取出来,反而把背景也提取出来了:
opencv 自适应二值化cv::adaptiveThreshold()函数详解(复杂背景下提取划痕)_第2张图片

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

一、opencv cv::adaptiveThreshold()函数

1.函数原型:

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

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);

程序运行效果:
opencv 自适应二值化cv::adaptiveThreshold()函数详解(复杂背景下提取划痕)_第3张图片

你可能感兴趣的:(opencv,图像处理,c++,计算机视觉,opencv)