在本文中,一种用于对象分割的基本技术称为Thresholding 。
但是,在进一步详细介绍之前,下面是OpenCV的简要概述。
OpenCV (开源计算机视觉)是一个跨平台的,具有编程功能的开源库,旨在在广泛的领域中执行实时计算机视觉任务,例如:
- 面部识别
- 虹膜识别系统
- 手势识别
- 人机交互(HCI)
- 移动机器人
- 对象识别
- 细分与识别
- 立体视立体视觉:2台摄像机的深度感知
- 增强现实
它还包括一个强大的统计机器学习库,该库包含许多用于支持上述领域的不同分类器。
要使用OpenCV,只需导入或包含所需的库,然后开始使用无数可用功能。
阈值处理是一种非常流行的分割技术,用于将对象与背景分离。在下面的文章中,我描述了用于阈值灰度图像(8位)的各种技术。
阈值处理涉及将图像的每个像素值(像素强度)与指定的阈值进行比较。这会将输入图像的所有像素分为2组:
- 强度值低于阈值的像素。
- 强度值大于阈值的像素。
现在,根据不同的细分类型,为这两个组赋予不同的值。
OpenCV使用以下函数在灰度(8位)图像上支持5种不同的阈值方案:
双阈值(InputArray src,OutputArray dst,双阈值,双maxval,int类型)
参数:
*在下面的阈值类型列表中。
输入图像
在完成阈值处理之前,首先将输入的RGB图像转换为灰度图像。
阈值类型
- 二进制阈值(整数类型= 0)
在较早获得的两个组中,具有像素强度大于设置的阈值的成员的组被分配“ Max_Value”,或者在灰度的情况下,值为255(白色)。
其余组的成员的像素强度设置为0(黑色)。如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中的像素强度值将设置为“ maxVal”。
- 反向二进制阈值(整数类型= 1)
Inv。二进制阈值与二进制阈值相同。唯一的本质区别是,在Inv.Binary阈值处理中,像素强度大于设置的阈值的组被分配为“ 0”,而强度小于阈值的其余像素被设置为“ maxVal”。
如果源图像中(x,y)处的像素强度值大于阈值,则将最终图像中的像素强度值设置为“ 0”,否则将其设置为“ maxVal”。
- 截断阈值(int类型= 2)
具有大于设置阈值的像素强度的组被截断为设置阈值,或者换句话说,将像素值设置为与设置阈值相同。
所有其他值保持不变。如果源图像中(x,y)处的像素强度值大于阈值,则将最终图像中的值设置为“阈值”,否则保持不变。
- 阈值为零(整数类型= 3)
一种非常简单的阈值化技术,其中对于像素强度值小于该阈值的组中的所有像素,我们将像素强度设置为“ 0”。
如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中(x,y)处的像素强度值不会改变。所有其余像素均设置为“ 0”。
- 阈值为零,反转(int type = 4)
与先前的技术相似,对于像素强度值大于阈值的组中的所有像素,此处我们将像素强度设置为“ 0”。
如果源图像中(x,y)处的像素强度值大于阈值,则最终图像中(x,y)处的像素强度值将设置为’0’。所有剩余的像素值均保持不变。
要编译OpenCV程序,您需要在系统上安装OpenCV库。我将在未来几天内发布相同的简单教程。
如果您已经安装了OpenCV,请使用您选择的输入图像运行以下代码。
// CPP program to demonstrate segmentation
// thresholding.
#include
#include
#include
#include
using namespace cv;
int main(int argc, char** argv)
{
if (argc != 2)
{
cout << " Usage: "
" " << endl;
return -1;
}
int threshold_value = 0;
// Valid Values: 0, 1, 2, 3, 4
int threshold_type = 2;
// maxVal, useful for threshold_type 1 and 2
int maxVal = 255;
// Source image
Mat src = imread(argv[1], 1);
cvNamedWindow("Original", CV_WINDOW_NORMAL);
imshow("Original", src);
Mat src_gray, dst;
// Convert the image to GrayScale
cvtColor(src, src_gray, CV_BGR2GRAY);
// Create a window to display results
cvNamedWindow("Result", CV_WINDOW_NORMAL);
createTrackbar("Threshold", "Result",
&threshold_value, 255);
while (1)
{
threshold(src_gray, dst, threshold_value,
maxVal, threshold_type);
imshow("Result", dst);
waitKey(1);
}
}