OpenCV-C++ 图像自适应阈值二值化处理adaptiveThreshold

API介绍

这篇文章主要介绍有关adaptiveThreshold的使用方式;

首先,来看一下调用格式;

void adaptiveThreshold( InputArray src, OutputArray dst,
                       double maxValue, int adaptiveMethod,
                       int thresholdType, int blockSize, double C );
  • src表示需要进行二值化的图像;需要注意的是,该输入必须是8-bit单通道的图像;
  • dst表示输出图像的二值图像;
  • maxValue是一个非零值,用于对哪些满足条件的阈值进行赋值;
  • adaptiveMethod表示选择哪一种自适应阈值算法;Opencv提供两种,ADAPTIVE_THRESH_MEAN_CADAPTIVE_THRESH_GAUSSIAN_C,下面会详细介绍;
  • thresholdType表示二值化类型,OpenCV提供两种, THRESH_BINARYTHRESH_BINARY_INV,下面会详细介绍;
  • blocksize表示参与计算的像素的领域范围,必须使用奇数;
  • C可以为正数, 零或者负数;用于在计算过程中容忍程度;

thresholdType介绍

OpenCV在adaptiveThreshold方法中允许使用两种ThresholdTypes,毕竟是进行二值化处理;分别为:

  • THRESH_BINARY
  • THRESH_BINARY_INV

计算方式如下:

其中,\(src(x, y)\)表示原始灰度图像灰度值,\(T(x, y)\)是根据自适应阈值算法计算得到;计算的方式来自于adaptiveMethod;

adaptiveMethod介绍

OpenCV提供两种自适应阈值算法:

  • ADAPTIVE_THRESH_MEAN_C
  • ADAPTIVE_THRESH_GAUSSIAN_C

其中,第一种ADAPTIVE_THRESH_MEAN_C,针对像素\((x, y)\)的计算方式如下:

  • \(T(x, y)\)结果是\((x, y)\)的邻域\(blockSize \times blockSize\)范围内所有灰度值的均值减去\(C\);

第二种ADAPTIVE_THRESH_GAUSSIAN_C,针对像素\((x, y)\)的计算方式如下:

  • 首先,生成一个大小为\(blockSize \times blockSize\)的高斯核,作为权重;
  • 其次,利用高斯核与\((x, y)\)邻域范围内灰度值,进行加权求和,再减去\(C\),得到\(T(x, y)\);

示例:

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

/**
 * adaptiveThreshold的使用
*/

int main(){
    // 读取图像
    Mat src = imread("/home/chen/dataset/lena.jpg");
    if (! src.data){
        cout << "could not load image." << endl;
        return -1;
    }
    namedWindow("src", WINDOW_AUTOSIZE);
    imshow("src", src);

    // 转成灰度图
    Mat srcGray;
    cvtColor(src, srcGray, COLOR_BGR2GRAY);
    namedWindow("srcGray", WINDOW_AUTOSIZE);
    imshow("srcGray", srcGray);

    // 自适应阈值二值化
    Mat srcBinary;
    adaptiveThreshold(~srcGray, srcBinary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 11, -2);
    namedWindow("srcBinary", WINDOW_AUTOSIZE);
    imshow("srcBinary", srcBinary);

    waitKey(0);
    return 0;
}

posted @ 2021-04-11 22:02  chenzhen0530  阅读(6957)  评论(0编辑  收藏  举报