基于C++的OpenCV4入门基础–阈值分割之二值图

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。基于C++的OpenCV4入门基础–阈值分割之二值图,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一,阈值处理之固定阈值法
例如,图像由暗色背景上的亮目标组成,目标像素和背景像素的灰度值组合构成两种主要模式,可以通过设定适当的阈值 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)

1,均值法:
在这里插入图片描述

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

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!