OpenCV4入门系列教程27:基本阈值操作

索引地址:系列教程索引地址

上一篇:OpenCV4入门系列教程26:全局阈值和局部阈值

根据二值图定义,我们知道实际上是黑白图。灰度图值为0~255中的任意值。定义一个阈值,灰度值大于它就置为255,否则置为0。这样的话,灰度图就只剩下0/255两个值,所有的像素值只能是这两个,就是黑白图。

如何获取灰度图,就是前面提到的imread参数和cvtColor()。

而阈值函数为:

1
2
3
4
5
double cv::threshold (InputArray src,
OutputArray dst,
double thresh,
double maxval,
int type)

函数中四个参数分别是:

  • 原图像
  • 输出图像
  • 阈值 由开发者指定
  • 最大值 一般使用此函数是灰度图,灰度图最大值为255。
  • 阈值类型 一般分为五种:
    • THRESH_BINARY:大于阈值的部分像素值变为maxval,其他变为0
    • THRESH_BINARY_INV:大于阈值的部分变为0,其他部分变为最大值
    • THRESH_TRUNC:大于阈值的部分变为阈值,其余部分不变
    • THRESH_TOZERO:大于阈值的部分不变,其余部分变为0
    • THRESH_TOZERO_INV:大于阈值的部分变为0,其余部分不变

这个时候,滑动栏的用处就体现出来了。通过滑动栏,我们可以动态的调整阈值。

测试代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//--------------------------------------【程序说明】-------------------------------------------
// 程序说明:《OpenCV3编程入门》OpenCV3版书本配套示例程序55
// 程序描述:OpenCV基本阈值操作
// 2014年11月 Created by @浅墨_毛星云
// 2014年12月 Revised by @浅墨_毛星云
//------------------------------------------------------------------------------------------------

//---------------------------------【头文件、命名空间包含部分】----------------------------
// 描述:包含程序所使用的头文件和命名空间
//------------------------------------------------------------------------------------------------
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
using namespace cv;
using namespace std;

//-----------------------------------【宏定义部分】--------------------------------------------
// 描述:定义一些辅助宏
//------------------------------------------------------------------------------------------------
#define WINDOW_NAME "threshold" //为窗口标题定义的宏

//-----------------------------------【全局变量声明部分】--------------------------------------
// 描述:全局变量的声明
//-----------------------------------------------------------------------------------------------
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
Mat g_srcImage, g_grayImage, g_dstImage;

//-----------------------------------【全局函数声明部分】--------------------------------------
// 描述:全局函数的声明
//-----------------------------------------------------------------------------------------------
static void ShowHelpText(); //输出帮助文字
void on_Threshold(int, void *); //回调函数

//-----------------------------------【main( )函数】--------------------------------------------
// 描述:控制台应用程序的入口函数,我们的程序从这里开始执行
//-----------------------------------------------------------------------------------------------
int main() {
//【0】显示欢迎和帮助文字
ShowHelpText();

//【1】读入源图片
g_srcImage = imread("1.jpg");
if (!g_srcImage.data) {
printf("读取图片错误,请确定目录下是否有imread函数指定的图片存在~! \n");
return false;
}
imshow("Original", g_srcImage);

//【2】存留一份原图的灰度图
cvtColor(g_srcImage, g_grayImage, COLOR_RGB2GRAY);

//【3】创建窗口并显示原始图
namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);

//【4】创建滑动条来控制阈值
createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold);

createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold);

//【5】初始化自定义的阈值回调函数
on_Threshold(0, 0);

// 【6】轮询等待用户按键,如果ESC键按下则退出程序
while (1) {
int key;
key = waitKey(20);
if ((char)key == 27) {
break;
}
}
}

//-----------------------------------【on_Threshold( )函数】------------------------------------
// 描述:自定义的阈值回调函数
//-----------------------------------------------------------------------------------------------
void on_Threshold(int, void *) {
//调用阈值函数
threshold(g_grayImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);

//更新效果图
imshow(WINDOW_NAME, g_dstImage);
}

//-----------------------------------【ShowHelpText( )函数】----------------------------------
// 描述:输出一些帮助信息
//----------------------------------------------------------------------------------------------
static void ShowHelpText() {
//输出一些帮助信息
printf("\n\t欢迎来到【基本阈值操作】示例程序~\n\n");
printf("\n\t按键操作说明: \n\n"
"\t\t键盘按键【ESC】- 退出程序\n"
"\t\t滚动条模式0- 二进制阈值\n"
"\t\t滚动条模式1- 反二进制阈值\n"
"\t\t滚动条模式2- 截断阈值\n"
"\t\t滚动条模式3- 反阈值化为0\n"
"\t\t滚动条模式4- 阈值化为0\n");
}

测试结果:

threshold

下一篇:OpenCV4入门系列教程28:其他阈值算法