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 @   天子骄龙  阅读(348)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示

目录导航