理论
什么是阈值?
- 最简单的分割方法
- 应用示例:分离与我们要分析的对象相对应的图像区域。 该分离基于对象像素和背景像素之间的强度变化。
- 为了区分我们感兴趣的像素,我们执行每个像素强度值相对于阈值的比较(根据要解决的问题确定)。
- 一旦我们正确地分离了重要像素,我们就可以设置它们以确定它们(即我们可以为它们分配0(黑色),255(白色)或任何适合您需要的值)。
阈值的类型
- OpenCV提供函数cv :: threshold来执行阈值操作。
- 我们可以用这个函数实现5种类型的阈值操作。
二值化阈值
该阈值操作可表示为:
因此,如果像素src(x,y)的强度高于阈值,则将新像素强度设置为MaxVal。 否则,像素设置为0。
反二值化阈值
该阈值操作可表示为:
如果像素src(x,y)的强度高于阈值,则将新像素强度设置为0.否则,将其设置为MaxVal。
截断阈值
该阈值操作可表示为:
如果像素src(x,y)的强度高于阈值,则将新像素强度设置为0.否则,将其设置为MaxVal。
归0阈值
该阈值操作可表示为:
如果src(x,y)低于thresh,则新像素值将设置为0。
反归0阈值
该阈值操作可表示为:
如果src(x,y)大于thresh,则新像素值将设置为0。
代码
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
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";
void Threshold_Demo( int, void* );
int main( int, char** argv )
{
src = imread( argv[1], 1 );
cvtColor( src, src_gray, COLOR_RGB2GRAY );
namedWindow( window_name, WINDOW_AUTOSIZE );
createTrackbar( trackbar_type,
window_name, &threshold_type,
max_type, Threshold_Demo );
createTrackbar( trackbar_value,
window_name, &threshold_value,
max_value, Threshold_Demo );
Threshold_Demo( 0, 0 );
for(;;)
{
int c;
c = waitKey( 20 );
if( (char)c == 27 )
{ break; }
}
}
void Threshold_Demo( int, void* )
{
/* 0: Binary
1: Binary Inverted
2: Threshold Truncated
3: Threshold to Zero
4: Threshold to Zero Inverted
*/
threshold( src_gray, dst, threshold_value, max_BINARY_value,threshold_type );
imshow( window_name, dst );
}
解释
- 加载图像。 如果是BGR,我们将其转换为灰度。 为此,请记住我们可以使用函数cv :: cvtColor:
- 创建一个窗口以显示结果
- 为用户创建2个轨道栏以输入用户输入:
- 等到用户输入阈值,阈值类型(或直到程序退出)
- 每当用户更改任何Trackbars的值时,都会调用Threshold_Demo函数:
- src_gray:我们的输入图片
- dst:目标(输出)图像
- threshold_value:进行阈值操作的阈值
- max_BINARY_value:二进制阈值操作使用的值(设置所选像素)
- threshold_type:5个阈值操作之一。