上一节我们学习了用自适应阈值对一幅图像进行二值化,相信大家学习之后,已经有所了解,本节我们针对二值化这个概念我们进入深入的剖析,本节我们将学习二值化函数(threshold)的具体原理与用法!
1、函数原型
double threshold(InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type);
2、函数功能
对数组元素进行固定阈值操作;并且该函数可以对多通道的数组用固定的阈值进行二值化;通常用于将灰度图像转换为二值化的图像;用于消除噪声,即滤除值过小或过大的像素;函数支持几种类型的阈值处理,由函数中的type参数决定;
另外,THRESH_OTSU or THRESH_TRIANGLE可以与type进行组合对图像进行二值化处理;在这些情况下,函数使用Otsu或者Triangle算法确定最优阈值,并使用它代替指定的阈值;
Note:
目前,Otsu或者Triangle算法仅支持8位单通道图像的实现,该函数支持就地操作哦!
返回值:
如果Otsu或者Triangle算法,则计算阈值。
3、参数详解
- 第一个参数,InputArray src,输入图像,可以是多通道图像、8位图像、32位浮点型图像;
- 第二个参数,OutputArray dst,目标图像,和原图像有一样的尺寸、类型和同样的通道数;
- 第三个参数,double thresh,进行二值化的阈值;
- 第四个参数,double maxval,最大值,一般与THRESH_BINARY或者THRESH_BINARY_INV阈值类型一起使用;
- 第五个参数,int type,阈值的类型;
4、阈值类型详解
![670343c41f22f49b9c954c226c5ae46f.png](https://i-blog.csdnimg.cn/blog_migrate/44e69a1debfc53aa91258068a38ab899.jpeg)
阈值详解
(1)THRESH_BINARY,正向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为maxval;否则,将该点的像素值设置为0;
具体的公式如下
![24e8090ab883424bb2c13146cf987768.png](https://i-blog.csdnimg.cn/blog_migrate/20e499e63122b2656140c5e8d260bcf2.jpeg)
THRESH_BINARY
(2)THRESH_BINARY_INV ,反向二值化,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值设置为maxval;
具体的公式如下
![800c20c0cdc4ec69a8559bb2dd67f546.png](https://i-blog.csdnimg.cn/blog_migrate/da829ac3c693951669a7033c00cf7658.jpeg)
THRESH_BINARY_INV
(3)THRESH_TRUNC ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为threshold;否则,将该点的像素值不变;
具体的公式如下
![fef52a20af05229892ab51a10ed07438.png](https://i-blog.csdnimg.cn/blog_migrate/09697cde7e0ad5a0c734508984f2b599.jpeg)
THRESH_TRUNC
(4)THRESH_TOZERO ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值不变;否则,将该点的像素值设置为0;
具体的公式如下
![1d241ab7b3623300bb0be3a026777ed3.png](https://i-blog.csdnimg.cn/blog_migrate/b74804f6c6230b4ab806a41d83e22657.jpeg)
THRESH_TOZERO
(5)THRESH_TOZERO_INV ,如果当前的像素值大于设置的阈值(thresh),则将该点的像素值设置为0;否则,将该点的像素值不变;
具体的公式如下
![b2f383178ab7e0e243259e6c90a0c61c.png](https://i-blog.csdnimg.cn/blog_migrate/553562f762658f1987a87e5ac8a3a841.jpeg)
THRESH_TOZERO_INV
(6)THRESH_MASK
(7)THRESH_OTSU,使用Otsu算法选择最佳阈值。
(8)THRESH_TRIANGLE,使用三角算法选择最佳阈值。
5、实验案例
#include
#include
#include
using namespace cv;
// 原图像
Mat srcImage, dstImage;
// 调整阈值类型的变量
int g_ThresholdType = 0;
int g_ThresholdValue = 128;
// 回调函数
static void OnThresholdMethod(int, void*);
int main(int argc, char** argv)
{
// 载入图像
srcImage = imread("lena.png");
// 判断图像是否为空
if (srcImage.empty())
{
printf("image error!");
return 0;
}
// 对原图像进行备份
dstImage = srcImage.clone();
namedWindow("原图");
imshow("原图