opencv官方示例-阈值操作Threshold

这是官方历程中关于阈值分割的一个应用。简单了解阈值分割可以参考百度百科

阈值分割法是一种基于区域的图像分割技术,原理是把图像象素点分为若干类。图像阈值化分割是一种传统的最常用的图像分割方法,因其实现简单、计算量小、性能较稳定而成为图像分割中最基本和应用最广泛的分割技术。它特别适用于目标和背景占据不同灰度级范围的图像。它不仅可以极大的压缩数据量,而且也大大简化了分析和处理步骤,因此在很多情况下,是进行图像分析特征提取与模式识别之前的必要的图像预处理过程。图像阈值化的目的是要按照灰度级,对像素集合进行一个划分,得到的每个子集形成一个与现实景物相对应的区域,各个区域内部具有一致的属性,而相邻区域不具有这种一致属性。这样的划分可以通过从灰度级出发选取一个或多个阈值来实现。

基本原理是:通过设定不同的特征阈值,把图像像素点分为若干类。

常用的特征包括:直接来自原始图像的灰度或彩色特征;由原始灰度或彩色值变换得到的特征。

设原始图像为f(x,y),按照一定的准则f(x,y)中找到特征值T,将图像分割为两个部分,分割后的图像为:

若取:b0=0(黑),b1=1(白),即为我们通常所说的图像二值化

阈值分割的优点是计算简单、运算效率较高、速度快。在重视运算效率的应用场合(如用于硬件实现),它得到了广泛应用。目前,图像的阈值分割已被应用于很多的领域,例如,在红外技术应用中,红外无损检测中红外热图像的分割,红外成像跟踪系统中目标的分割;在遥感应用中,合成孔径雷达图像中目标的分割等;在医学应用中,血液细胞图像的分割,磁共振图像的分割;在农业工程应用中,水果品质无损检测过程中水果图像与背景的分割。在工业生产应用中,机器视觉运用于产品质量检测等。

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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
/*

* @file Threshold.cpp

* @brief Sample code that shows how to use the diverse threshold options offered by OpenCV

* @author OpenCV team

*/

/**

* 阈值

* 演示如何使用 OpenCV 提供的各种阈值选项的简短示例代码

*/

//头文件

#include "opencv2/imgproc.hpp" //图像处理相关

#include "opencv2/imgcodecs.hpp" //图像读取和写入相关

#include "opencv2/highgui.hpp" //GUI相关

/**

* 程序流程:

* 1、加载图像,命令行输入图像路径或者默认

* 2、初始化变量,创建窗口

* 3、创建滑动条

* 4、调用显示

*/

//命名空间

using namespace cv;

/// Global variables

// 全局变量

int threshold_value = 0; //阈值

int threshold_type = 3; //阈值分割的类型

int const max_value = 255; //最大值

int const max_type = 4; //最大值的类型

int const max_BINARY_value = 255; //二值化图像的最大值

// 图像变量, 窗口

Mat src, src_gray, dst;

const char* window_name = "Threshold Demo";

//滑动条

const char* trackbar_type = "Type: \n 0: Binary \n 1: Binary Inverted \n 2: Truncate \n 3: To Zero \n 4: To Zero Inverted";

const char* trackbar_value = "Value";

/// Function headers

/// 回掉函数声明,原型必须为 void function_name(int, void*)

void Threshold_Demo( int, void* );

/**

* @function main

*/

// 主函数

int main( int argc, char** argv )

{

//! [load]

// 加载图像

String imageName("../data/stuff.jpg"); // by default, 默认路径

if (argc > 1)

{

imageName = argv[1];//或者命令行参数输入图像路径

}

//加载图像

src = imread( imageName, IMREAD_COLOR ); // Load an image

if( src.empty() )

{ return -1; }

//图像转为灰度图

cvtColor( src, src_gray, COLOR_BGR2GRAY ); // Convert the image to Gray

//! [load]

//! [window]

//创建窗口

namedWindow( window_name, WINDOW_AUTOSIZE ); // Create a window to display results

//! [window]

//! [trackbar]

// 创建滑动条

createTrackbar( trackbar_type,

window_name, &threshold_type,

max_type, Threshold_Demo ); // Create Trackbar to choose type of Threshold

createTrackbar( trackbar_value,

window_name, &threshold_value,

max_value, Threshold_Demo ); // Create Trackbar to choose Threshold value

//! [trackbar]

//调用显示

Threshold_Demo( 0, 0 ); // Call the function to initialize

/// Wait until user finishes program

/// 等待按下 esc 键退出

for(;;)

{

char c = (char)waitKey( 20 );

if( c == 27 )

{ break; }

}

}

//![Threshold_Demo]

/**

* @function Threshold_Demo

*/

void Threshold_Demo( int, void* )

{

/* 0: Binary

1: Binary Inverted

2: Threshold Truncated

3: Threshold to Zero

4: Threshold to Zero Inverted

*/

/**

* 阈值分割的类型

* 0、二进制,大于阈值, dst = max_value; 小于阈值, dst = 0;

* 1、反二进制,与二进制相反;

* 2、阈值截断,大于阈值, dst = thresh; 小于阈值, dst = src;

* 3、0阈值, 大于阈值, dst = src; 小于阈值, dst = 0;

* 4、反0阈值,与0阈值相反

*/

//调用阈值分割函数

threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );

imshow( window_name, dst );

}

//![Threshold_Demo]

/**

* 要点总结

* 阈值操作的类型,二进制、反二进制、阈值截断、0阈值、反0阈值

*/

参考文献

百度百科-阈值分割

-------------本文结束感谢您的阅读-------------