本文共 2699 字,大约阅读时间需要 8 分钟。
目录
继续填坑。
如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:
如果你想了解更多有关于计算机视觉、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应用):
我们通过调整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);}
大家也可以自己尝试一下呀,一定要多做练习!
大家也可以尝试先将图像二值化,然后再进行阈值操作。
转载地址:http://mzyni.baihongyu.com/