【opencv学习笔记】015之基本阈值操作

目录

一、前言

二、阈值操作

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、机器学习、深度学习等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

二、阈值操作

1、啥是阈值

首先先说一下啥是阈。阈的意思是界限,那阈值就是界限值。怎么理解这个呢。

我们考虑成绩,100分满分,60分及格。60分就是一个阈值,如果大于等于这个阈值,那就是属于及格,如果小于这个阈值,就是不及格。

通过上面这种分类,我们将所有的成绩分成两个类别,分类的标准,也就是界限,就是阈值。

2、阈值有哪些

在opencv中,常用的阈值有如下几个:

(1)阈值二值化(threshold binary)。

(2)阈值反二值化(threshold binary Inverted)

(3)截断 (truncate)

(4)阈值取零 (threshold to zero)

(5)阈值反取零 (threshold to zero inverted)

名字都挺高大上,但是很简单,我们一个一个来讲解。

为了方便讲解,我们使用如下的一个图像,红色表示图像,黑色是图像的边界,蓝色是阈值

原图

 

1.阈值二值化

阈值二值化就是通过阈值将所有的情况分成两种情况:

1.大于阈值,取最大值。

2.小于等于阈值取0。

如果用公式表示一下,就是如下的公式

对于原图,如果我们进行二值化操作,那么蓝色的线以上的,都变成最大值,蓝色的线以下的线都变成0,也就是如下图:

二值化

2.阈值反二值化

阈值反二值化也是通过阈值将所有的情况分成两种情况,但是和二值化相反:

1.大于阈值,取0。

2.小于等于阈值取最大值。

如果用公式表示一下,就是如下的公式

对于原图,如果我们进行反二值化操作,那么蓝色的线以下的,都变成最大值,蓝色的线以上的线都变成0,也就是如下图:

阈值反二值化

3.截断

截断从字面意思去理解也是比较简单的,大家可以想一下园丁在修建花草,为了美观,会把所有的树剪成一样高的,也就是会把大于阈值的去掉:

1.大于阈值的,取阈值。

2.小于等于阈值取原值。

如果用公式表示一下,就是如下的公式

对于原图,如果我们进行截断操作,也就是如下图:

截断

4.阈值取零

阈值取零相当于设限,大家考虑比赛,如果比赛晋级,那成绩有效,继续比赛,如果成绩没有达标,那就算输,成绩归零,也就是会把小于阈值的归零:

1.大于阈值的,取原值。

2.小于等于阈值取0。

如果用公式表示一下,就是如下的公式

对于原图,如果我们进行截断操作,也就是如下图:

阈值取零

5.阈值反取零

阈值反取零和阈值取零相反,也就是会把大于阈值的取零:

1.大于阈值的,取0。

2.小于等于阈值取原值。

如果用公式表示一下,就是如下的公式

对于原图,如果我们进行截断操作,也就是如下图:

阈值反取零

总结一下,五个基本阈值操作如下:

基本阈值操作

3、API与代码实战

 

1.API

图像的阈值操作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。

 

2.代码展示

讲完API,我们看一个具体的例子。为了能够看到更好的效果,我们结合一下滑动条trackbar。如果你还不了解trackbar,那可以看这篇博客:

形态学操作应用(trackbar应用):https://blog.csdn.net/shuiyixin/article/details/104387257

我们通过调整trackbar来控制阈值,并实现阈值类型的来回切换。

#include<iostream>
#include<opencv2/opencv.hpp>

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);

}

3.执行结果

原图

大家也可以自己尝试一下呀,一定要多做练习!

大家也可以尝试先将图像二值化,然后再进行阈值操作。

发布了256 篇原创文章 · 获赞 513 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/104423534
今日推荐