昊虹君 发表于 2022-12-15 22:16

详解OpenCV的函数adaptiveThreshold(),并利用它实现图像的自适应二值化阈值分割

详解OpenCV的函数adaptiveThreshold(),并利用它实现图像的自适应二值化阈值分割

图像阈值化的一个常见作用是从灰度图像中分割出目标区域和背景区域,然而仅仅通过设定固定阈值来实现图像的阈值化分割,就显得缺乏灵活性,有时候难以达到理想的分割效果。
比如我之前写的博文 https://www.hhai.cc/thread-162-1-1.html 中介绍的函数threshold(),它实现的就是固定阈值法。

在实际应用中,我们可以通过图像像素邻域块的分布特征来自适应确定区域的二值化阈值,实际上就是把图像分成一小块、一小块的,然后去用某种算法去计算这些小块的二值化阈值,并对这些小块进行阈值化处理。

OpenCV中提供了自适应阈值化函数adaptiveThreshold来实现自适应阈值处理。

函数adaptiveThreshold()的原型如下:
void cv::adaptiveThreshold(InputArray src,
                           OutputArray dst,
                           double maxValue,
                           int adaptiveMethod,
                           int thresholdType,
                           int blockSize,
                           double C)
官方文档对这个函数的说明如下:
http://pic1.hhai.cc/pic1/2022/2022-12/001/21.png

对上面的内容作一个大概的翻译如下:
InputArray src:源图像。
OutputArray dst:输出图像,与源图像的尺寸和数据类型一致。
maxValue:上面截图中的数学表达式已经很直观地说明了这个值的意义,这里就不再赘述了。
adaptiveMethod:在一个邻域内计算阈值所采用的算法,有两个取值,分别为 ADAPTIVE_THRESH_MEAN_C 和 ADAPTIVE_THRESH_GAUSSIAN_C 。
    ADAPTIVE_THRESH_MEAN_C的计算方法是计算出领域的平均值再减去第七个参数double C的值
    ADAPTIVE_THRESH_GAUSSIAN_C的计算方法是计算出领域的高斯均值再减去第七个参数double C的值
thresholdType:这是阈值化类型,只有两个取值,分别为 THRESH_BINARY 和THRESH_BINARY_INV ,这两个取值的意义见上面截图中的公式。
blockSize:函数adaptiveThreshold()的阈值计算单位是像素的邻域块,而邻域块取多大,就由这个值作决定。
C:在对参数adaptiveMethod的说明中,已经说明了这个参数的作用,从中可以看出,这个参数实际上是一个偏移值调整量。

下面附一个使用函数adaptiveThreshold()对图像进行自适应二值化阈值分割的C++代码。

//出处:昊虹AI笔记网(hhai.cc)
//用心记录计算机视觉和AI技术

//博主微信/QQ 2487872782
//QQ群 271891601
//欢迎技术交流与咨询

//OpenCV版本 OpenCV3.0

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

using namespace std;
using namespace cv;

int main()
{
        // 图像读取及判断
        cv::Mat srcImage = cv::imread("F:/material/images/P0027-coins-01.png");
        if (!srcImage.data)
                return 1;
        // 灰度转换
        cv::Mat srcGray;
        cv::cvtColor(srcImage, srcGray, CV_RGB2GRAY);
        cv::imshow("srcGray", srcGray);
        cv::Mat dstImage;
        // 初始化自适应阈值参数
        int blockSize = 5;
        int constValue = 10;
        const int maxVal = 255;
        /* 自适应阈值算法
        0:ADAPTIVE_THRESH_MEAN_C
        1: ADAPTIVE_THRESH_GAUSSIAN_C
        阈值类型
        0: THRESH_BINARY
        1: THRESH_BINARY_INV */
        int adaptiveMethod = 0;
        int thresholdType = 1;
        // 图像自适应阈值操作
        cv::adaptiveThreshold(srcGray, dstImage,
                maxVal, adaptiveMethod,
                thresholdType, blockSize,
                constValue);
        cv::imshow("dstImage", dstImage);
        cv::waitKey(0);
        return 0;
}
运行结果如下:
http://pic1.hhai.cc/pic1/2022/2022-12/001/22.png
页: [1]
查看完整版本: 详解OpenCV的函数adaptiveThreshold(),并利用它实现图像的自适应二值化阈值分割