目录
一、前言
二、阈值操作
1、啥是阈值
2、阈值有哪些
1.阈值二值化
2.阈值反二值化
3.截断
4.阈值取零
5.阈值反取零
3、API与代码实战
1.API
2.代码展示
3.执行结果
继续填坑。
如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:
【OpenCV系列】:https://blog.csdn.net/shuiyixin/article/category/7581855
如果你想了解更多有关于计算机视觉、OpenCV、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!
首先先说一下啥是阈。阈的意思是界限,那阈值就是界限值。怎么理解这个呢。
我们考虑成绩,100分满分,60分及格。60分就是一个阈值,如果大于等于这个阈值,那就是属于及格,如果小于这个阈值,就是不及格。
通过上面这种分类,我们将所有的成绩分成两个类别,分类的标准,也就是界限,就是阈值。
在opencv中,常用的阈值有如下几个:
(1)阈值二值化(threshold binary)。
(2)阈值反二值化(threshold binary Inverted)
(3)截断 (truncate)
(4)阈值取零 (threshold to zero)
(5)阈值反取零 (threshold to zero inverted)
名字都挺高大上,但是很简单,我们一个一个来讲解。
为了方便讲解,我们使用如下的一个图像,红色表示图像,黑色是图像的边界,蓝色是阈值
阈值二值化就是通过阈值将所有的情况分成两种情况:
1.大于阈值,取最大值。
2.小于等于阈值取0。
如果用公式表示一下,就是如下的公式
对于原图,如果我们进行二值化操作,那么蓝色的线以上的,都变成最大值,蓝色的线以下的线都变成0,也就是如下图:
阈值反二值化也是通过阈值将所有的情况分成两种情况,但是和二值化相反:
1.大于阈值,取0。
2.小于等于阈值取最大值。
如果用公式表示一下,就是如下的公式
对于原图,如果我们进行反二值化操作,那么蓝色的线以下的,都变成最大值,蓝色的线以上的线都变成0,也就是如下图:
截断从字面意思去理解也是比较简单的,大家可以想一下园丁在修建花草,为了美观,会把所有的树剪成一样高的,也就是会把大于阈值的去掉:
1.大于阈值的,取阈值。
2.小于等于阈值取原值。
如果用公式表示一下,就是如下的公式
对于原图,如果我们进行截断操作,也就是如下图:
阈值取零相当于设限,大家考虑比赛,如果比赛晋级,那成绩有效,继续比赛,如果成绩没有达标,那就算输,成绩归零,也就是会把小于阈值的归零:
1.大于阈值的,取原值。
2.小于等于阈值取0。
如果用公式表示一下,就是如下的公式
对于原图,如果我们进行截断操作,也就是如下图:
阈值反取零和阈值取零相反,也就是会把大于阈值的取零:
1.大于阈值的,取0。
2.小于等于阈值取原值。
如果用公式表示一下,就是如下的公式
对于原图,如果我们进行截断操作,也就是如下图:
总结一下,五个基本阈值操作如下:
图像的阈值操作API如下:
double threshold(
InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type
);
函数参数含义如下:
(1)InputArray类型的src ,输入图像,多通道、8位或32位浮点。
(2)OutputArray类型的dst ,输出图像,图像的大小、类型、通道数和输入图像相同。
(3)double类型的thresh,阈值。
(4)double类型的maxval,使用THRESH_BINARY 和THRESH_BINARY_INV阈值类型时候的最大值。
(5)int类型的type,阈值类型,取值参见:cv::ThresholdTypes。
讲完API,我们看一个具体的例子。为了能够看到更好的效果,我们结合一下滑动条trackbar。如果你还不了解trackbar,那可以看这篇博客:
形态学操作应用(trackbar应用):https://blog.csdn.net/shuiyixin/article/details/104387257
我们通过调整trackbar来控制阈值,并实现阈值类型的来回切换。
#include
#include
using namespace std;
using namespace cv;
//全局变量
Mat src, dst;
int thresholdValue = 127;
int thresholdMax = 255;
int typeValue = 2;
int typeMax = 4;
const char* output_title = "binary img";//窗口名称“二值化图像”
void Threshold_Demo(int, void*);//二值化演示函数
//主函数入口
int main()
{
src = imread("E:/image/girl2.png");
if (!src.data)
{
cout << "could not load image..." << endl;
return -1;
}
imshow("show image", src);
namedWindow(output_title, CV_WINDOW_AUTOSIZE);
createTrackbar("Threshold Value", output_title, &thresholdValue, thresholdMax, Threshold_Demo);//动态调整
createTrackbar("Type Value", output_title, &typeValue, typeMax, Threshold_Demo);
Threshold_Demo(0, 0);
imshow(output_title, dst);
waitKey(0);
return 0;
}
void Threshold_Demo(int, void*)
{
threshold(src, dst, thresholdValue, thresholdMax, typeValue);
imshow(output_title, dst);
}
大家也可以自己尝试一下呀,一定要多做练习!
大家也可以尝试先将图像二值化,然后再进行阈值操作。