• 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 imes blockSize)范围内所有灰度值的均值减去(C);

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

    • 首先,生成一个大小为(blockSize imes 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;
    }
    

  • 相关阅读:
    签字文件的保存逻辑
    POJ-1273 Drainage Ditches
    POJ-2513 Colored Sticks
    HDU-1251 统计难题
    POJ-1300 Door Man
    POJ-3159 Candies
    POJ-3169 Layout
    POJ-2983 Is the Information Reliable?
    POJ-1716 Integer Intervals
    HDU-3666 THE MATRIX PROBLEM
  • 原文地址:https://www.cnblogs.com/chenzhen0530/p/14645794.html
Copyright © 2020-2023  润新知