博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【opencv学习笔记】015之基本阈值操作
阅读量:4074 次
发布时间:2019-05-25

本文共 2699 字,大约阅读时间需要 8 分钟。

目录


一、前言

继续填坑。

如果想看其他有关于OpenCV学习方法介绍、学习教程、代码实战、常见报错及解决方案等相关内容,可以直接看我的OpenCV分类:

如果你想了解更多有关于计算机视觉、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应用):

我们通过调整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);}

3.执行结果

原图

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

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

 

转载地址:http://mzyni.baihongyu.com/

你可能感兴趣的文章
搞定Java面试中的数据结构问题
查看>>
React Native(一):搭建开发环境、出Hello World
查看>>
React Native(二):属性、状态
查看>>
JSX使用总结
查看>>
React Native(四):布局(使用Flexbox)
查看>>
React Native(七):Android双击Back键退出应用
查看>>
Android自定义apk名称、版本号自增
查看>>
【剑指offer】q50:树中结点的最近祖先
查看>>
二叉树的非递归遍历
查看>>
【leetcode】Reorder List (python)
查看>>
【leetcode】Linked List Cycle (python)
查看>>
【leetcode】Candy(python)
查看>>
【leetcode】Sum Root to leaf Numbers
查看>>
【leetcode】Pascal's Triangle II (python)
查看>>
如何成为编程高手
查看>>
本科生的编程水平到底有多高
查看>>
Solr及Spring-Data-Solr入门学习
查看>>
python_time模块
查看>>
python_configparser(解析ini)
查看>>
selenium学习资料
查看>>