opencv —— threshold、adaptiveThreshold 固定阈值、自适应阈值

自古美人都是妖i 提交于 2020-02-16 21:11:37

阈值化

在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素。

阈值分割可以视为最简单的图像分割方法。比如基于图像中物体与背景之间的灰度差异,可以利用阈值分割出我们需要的物体。这种分割是像素级的分割,为了从一幅图像中提取我们需要的部分,应该用图像中的每个像素点的灰度值与选择的阈值进行比较,并作出取舍判断。

注意,阈值的选取依赖于具体问题,物体在不同的图片中可能会有不同的灰度值。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。例如可以将物体的像素点的灰度值设定为”0“(黑色),其他像素点的灰度值设为”255“(白色)。

OpenCV 中 threshold() 函数(固定阈值操作)和 adaptiveThreshold() 函数(自适应阈值操作)可以满足这样的需求。它们的基本思想是:给定一个数组和一个阈值,根据数组中的每个元素的值是高于还是低于阈值而进行一些操作。

 

固定阈值操作:threshold 函数

threshold() 函数是对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像(compare 函数也可以达到此目的),或者去除噪声,过滤掉像素值很小或很大的图像点。

double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type);
  • src,输入数组,填单通道、8 或 32 位浮点类型的 Mat 类型对象即可。
  • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
  • thresh,阈值的具体值。
  • maxval,输出像素值的上限,仅当第五个参数阈值类型 type 取 THRESH_BINARY 或 THRESH_BINARY_INV 时会用到。
  • type,阈值类型。

折线为将被阈值化的值,虚线为阈值

THRESH_BINARY:大于阈值的部分被置为 maxval,小于部分被置为 0

THRESH_BINARY_INV:大于阈值部分被置为 0,小于部分被置为 maxval

THRESH_TRUNC:大于阈值部分被置为 thresh,小于部分保持原样  

THRESH_TOZERO:小于阈值部分被置为 0,大于部分保持不变

THRESH_TOZERO_INV:大于阈值部分被置为 0,小于部分保持不变

 

自适应阈值操作:adaptiveThreshold 函数

前面看到简单阈值是一种全局性的阈值,只需要规定一个阈值的值,整个图像都和这个阈值比较。而自适应阈值可以看成一种局部性的阈值,通过规定一个区域大小,比较这个点与区域大小里面像素点的平均值(或者其他特征)的大小关系确定这个像素点是属于黑或者白(如果是二值情况)。

double adaptiveThreshold (InputArray src, OutputArray dst, double maxVal, int adaptiveMethod, int thresholdType, int blockSize, double C);
  • src,输入数组,Mat 类的对象即可,但需要为 8 位单通道浮点型图像。
  • dst,输出数组,和第一个参数中的 Mat 变量有一样的尺寸和类型。
  • maxVal,输出像素值的上限。
  • adaptiveMethod,用于指定要使用的自适应阈值算法。阈值有两种取值:

ADAPTIVE_THRESH_MEAN_C :领域内均值

ADAPTIVE_THRESH_GAUSSIAN_C :领域内像素点加权和,权重为一个高斯窗口。

  • thresholdType,阈值类型。取值必须为 THRESH_BINARY 或 THRESH_BINARY_INV。
  • blockSize,用于计算阈值大小的一个像素的邻域尺寸,取值为 3、5、7。
  • C,阈值 = 平均或加权平均值 - C。为0相当于阈值 就是求得领域内均值或者加权值。

 

代码示例:

#include <opencv.hpp>
using namespace cv;
int main() {
    Mat src = imread("C:/Users/齐明洋/Desktop/证件照/7.jpg", 0);
    imshow("src", src);
    
    Mat dst;
    threshold(src, dst, 150, 255, THRESH_BINARY);
    imshow("binary img", dst);

    adaptiveThreshold(src, dst, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 3, 0);
    imshow("adaptive binary img", dst);

    waitKey(0);
}

效果展示:

 

借鉴博客:https://blog.csdn.net/qq_37385726/article/details/82015545

https://www.cnblogs.com/yinliang-liang/p/9293310.html

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!