一,阈值处理之固定阈值法
例如,图像由暗色背景上的亮目标组成,目标像素和背景像素的灰度值组合构成两种主要模式,可以通过设定适当的阈值 T,将图像的像素划分为两类:灰度值大于 T 的像素集是目标,小于 T 的像素集是背景。
如果图像的直方图存在明显边界,容易找到图像的分割阈值;但如果图像直方图分界不明显,则很难找到合适的阈值,甚至可能无法找到固定的阈值有效地分割图像。
1,C++ API:threshold 注意这个 API 只能支持灰度图
CV_EXPORTS_W double threshold( InputArray src, OutputArray dst,
double thresh, double maxval, int type );
函数 threshold() 可以将灰度图像转换为二值图像,图像完全由像素 0 和 255 构成,呈现出只有黑白两色的视觉效果。
灰度阈值化通过选取的灰度阈值 thresh,将每个像素的灰度值与阈值进行比较,将灰度大于阈值的像素点置为最大灰度,小于阈值的像素点置为最小灰度,得到二值图像,可以突出图像轮廓,把目标从背景中分割出来。
参数说明:
scr:变换操作的输入图像,nparray 二维数组,必须是单通道灰度图像!
thresh:阈值,取值范围 0~255
maxval:填充色,取值范围 0~255,一般取 255
type:变换类型
cv2.THRESH_BINARY:大于阈值时置 255,否则置 0
cv2.THRESH_BINARY_INV:大于阈值时置 0,否则置 255
cv2.THRESH_TRUNC:大于阈值时置为阈值 thresh,否则不变(保持原色)
cv2.THRESH_TOZERO:大于阈值时不变(保持原色),否则置 0
cv2.THRESH_TOZERO_INV:大于阈值时置 0,否则不变(保持原色)
cv2.THRESH_OTSU:使用 OTSU 算法选择阈值
返回值 retval:返回二值化的阈值
返回值 dst:返回阈值变换的输出图像
注意:
函数 cv2.threshold 进行固定阈值的二值化处理;函数 cv2.adaptiveThreshold 为自适应阈值的二值化处理函数,可以通过比较像素点与周围像素点的关系动态调整阈值。
确切地说,只有 type 为 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV 时输出为二值图像,其它变换类型时进行阈值处理但并不是二值处理。
2,用法
//阈值分割(五种方式)
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);//得到灰度图
imshow("gray", gray);
threshold(gray, binary, 127, 255, THRESH_BINARY);//这个 T = 127 暂时给定 不一定合理 后面分析怎么确定
imshow("binary", binary);//二值分割
threshold(gray, binary, 127, 255, THRESH_BINARY_INV);
imshow("threshold binary invert", binary);
threshold(gray, binary, 127, 255, THRESH_TRUNC);
imshow("threshold TRUNC", binary);
threshold(gray, binary, 127, 255, THRESH_TOZERO);
imshow("threshold to zero", binary);
threshold(gray, binary, 127, 255, THRESH_TOZERO_INV);
imshow("threshold to zero invert", binary);
二,阈值处理之全局阈值
全局阈值概念
全局固定阈值很容易理解,就是对整幅图像都是用一个统一的阈值来进行二值化!
全局阈值分割方法: 均值法、 OTSU、 三角法(Triangle)
2,全局阈值处理 Otsu 方法
阈值处理本质上是对像素进行分类的统计决策问题。
OTSU 方法又称大津算法,使用最大化类间方差(intra-class variance)作为评价准则,基于对图像直方图的计算,可以给出类间最优分离的最优阈值。
任取一个灰度值 T,可以将图像分割为两个集合 F 和 B,集合 F、B 的像素数的占比分别为 pF、pB,集合 F、B 的灰度值均值分别为 mF、mB,图像灰度值为 m,定义类间方差为:
使类间方差 ICV 最大化的灰度值 T 就是最优阈值。
因此,只要遍历所有的灰度值,就可以得到使 ICV 最大的最优阈值 T。
OpenCV 提供了函数 cv.threshold 可以对图像进行阈值处理,将参数 type 设为 cv.THRESH_OTSU,就可以使用使用 OTSU 算法进行最优阈值分割。
3,用法
//OTSU
double t1 = threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);//t1为otsu分割阈值
printf("otsu threshold T:%.2f\n", t1);
imshow("otsu binary", binary);
//三角法 triangle
double t2 = threshold(gray, binary, 0, 255, THRESH_BINARY | THRESH_TRIANGLE);//t2为triangle分割阈值
printf("triangle threshold T:%.2f\n", t2);
imshow("triangle binary", binary);
三,阈值处理之自适应阈值
噪声和非均匀光照等因素对阈值处理的影响很大,例如光照复杂时 Otsu 算法等全局阈值分割方法的效果往往不太理想,需要使用可变阈值处理。
可变阈值是指对于图像中的每个像素点或像素块有不同的阈值,如果该像素点大于其对应的阈值则认为是前景。
局部阈值分割可以根据图像的局部特征进行处理,与图像像素位置、灰度值及邻域特征值有关。
可变阈值处理的基本方法,是对图像中的每个点,根据其邻域的性质计算阈值。标准差和均值是对比度和平均灰度的描述,在局部阈值处理中非常有效。
1,C++ API:adaptiveThreshold
CV_EXPORTS_W void adaptiveThreshold( InputArray src, OutputArray dst,
double maxValue, int adaptiveMethod,
int thresholdType, int blockSize, double C );
参数说明:
scr:输入图像,nparray 二维数组,必须是 8-bit 单通道灰度图像!
dst:输出图像,大小和格式与 scr 相同
maxValue:为满足条件的像素指定的非零值,具体用法见 thresholdType 说明
adaptiveMethod:自适应方法选择
cv.ADAPTIVE_THRESH_MEAN_C:阈值是邻域的均值
cv.ADAPTIVE_THRESH_GAUSSIAN_C:阈值是邻域的高斯核加权均值
thresholdType:阈值处理方法
cv2.THRESH_BINARY:大于阈值时置 maxValue,否则置 0
cv2.THRESH_BINARY_INV:大于阈值时置 0,否则置 maxValue
blockSize:像素邻域的尺寸,用于计算邻域的阈值,通常取 3,5,7
C:偏移量,从邻域均值中减去该常数
2,用法
//自适应阈值
adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 25, 10);
imshow("ada-gaussian binary", binary);
adaptiveThreshold(gray, binary, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 25, 10);
imshow("ada-mean binary", binary);
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/182008.html