opencv-adaptiveThreshold自适应阈值

OTSU算法和最大熵算法,但这两种算法都属于全局阈值法,所以对于某些光照不均的图像,这种全局阈值分割的方法会显得苍白无力,如下图:

 

 此时应采用自适应阈值法(adaptiveThreshold),它的思想不是计算全局图像的阈值,而是根据图像不同区域亮度分布,计算其局部阈值,所以对于图像不同区域,能够自适应计算不同的阈值,因此被称为自适应阈值法。(其实就是局部阈值法)

如何确定局部阈值呢?可以计算某个邻域(局部)的均值、中值、高斯加权平均(高斯滤波)来确定阈值

 

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



int main(int argc, char** argv) {

    cv::Mat srcImage = cv::imread("D:/bb/tu/6.png");
    cv::Mat srcGray;
    cv::cvtColor(srcImage, srcGray, cv::COLOR_RGB2GRAY);
    cv::imshow("srcGray", srcGray);
    cv::Mat dstImage;

    const int maxVal = 255;
    int adaptiveMethod = 0;
    int thresholdType = 1;
    int blockSize = 5;
    int constValue = 10;

    cv::adaptiveThreshold(srcGray, dstImage,maxVal, adaptiveMethod,thresholdType, blockSize,constValue);// 自适应阈值操作
    /*
    参数1:InputArray src:源图像
    参数2:OutputArray dst:输出图像,与源图像大小一致
    参数3:maxVal 预设最大值
    参数4:adaptiveMethod 在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 
            cv::ADAPTIVE_THRESH_MEAN_C=0 的计算方法是计算出领域的平均值再减去第七个参数double C的值
            cv::ADAPTIVE_THRESH_GAUSSIAN_C=1 的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
    参数5:thresholdType 这是阈值类型,只有两个取值,分别为 cv::THRESH_BINARY=0 和 cv::THRESH_BINARY_INV=1
    参数6:blockSize 表示邻域大小,局部邻域大小为3、5、7等
    参数7:constValue    这个参数实际上是一个偏移值调整量,用均值和高斯计算阈值后,再加这个值就是最终阈值  
    */

    cv::imshow("dstImage", dstImage);
    
    cv::waitKey(0);
    return 0;
}

 

 

 

 

 

 

 

posted @ 2021-12-17 21:44  天子骄龙  阅读(308)  评论(0编辑  收藏  举报