阈值化
在对图像进行处理操作的过程中,我们常常需要对图像中的像素做出取舍与决策,直接剔除一些低于或高于一定值的像素。
阈值分割可以视为最简单的图像分割方法。比如基于图像中物体与背景之间的灰度差异,可以利用阈值分割出我们需要的物体。这种分割是像素级的分割,为了从一幅图像中提取我们需要的部分,应该用图像中的每个像素点的灰度值与选择的阈值进行比较,并作出取舍判断。
注意,阈值的选取依赖于具体问题,物体在不同的图片中可能会有不同的灰度值。一旦找到了需要分割的物体的像素点,可以对这些像素点设定一些特定的值来表示。例如可以将物体的像素点的灰度值设定为”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
来源:https://www.cnblogs.com/bjxqmy/p/12318691.html