阈值处理——实例分析
上篇博客实现了一个阈值处理的例子,现在主要来讲解一相关程序;
首先谈谈createTrackbar函数,也就是滑动条;
createTrackbar("阈值大小:", "【效果图】", &g_ThresholdValue, 255, OnThresholdMethod); createTrackbar("阈值类型:", //滑动名 "【效果图】", //在哪个窗口 &g_ThresholdType, //g_ThresholdType这个变量值等于滑动条位置
8, //最大值
OnThresholdMethod); // 调用回调函数 OnThresholdMethod(0, 0);
在Opencv中,createTrackbar函数可用于创建一个可以调整数值的滑动条。函数原型如下:
CV_EXPORTS int createTrackbar(const String& trackbarname, const String& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);
参数1:滑动条轨迹名
参数2:滑动条依附的窗口名
参数3:滑块的位置,创建时,滑块初始位置就是这个变量当前的值
参数4:轨迹的最大值
参数5:回调函数
参数6:默认0,用户传给回调函数的数据,如果第三个值为全局变量,忽略这个值.
如果使用第6个参数,则作为参数传给回调函数的usrdata
这个createTrackbar函数创建一个具有特定名称和范围的轨迹条(滚动条,或者说是滑块范围控制工具),指定一个和轨迹条位置同步的变量。而且要指定回调函数,在轨迹条位置改变的时候来调用这个回调函数。创建的轨迹条显示在指定的winname所代表的窗口上。
回调函数TrackbarCallback转定义如下
typedef void (*TrackbarCallback)(int pos, void* userdata);
参数1:其中第一个参数是跟踪栏位置
参数2:第二个参数是用户数据,如果回调函数是NULL指针,则不会调用回调函数,而只会更新值(比如窗口中的图像数据地址)
(*TrackbarCallback)为函数void (int pos,void* userdata)的别名
我们生活中大多数看到的彩色图片都是RGB类型,但是在进行图像处理时,需要用到灰度图、二值图、HSV、HSI等颜色制式,opencv提供了cvtColor()函数来实现这些功能。首先看一下cvtColor函数定义:
C++: void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0 );
1
参数解释:
. InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
. OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
. int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片,后面会详细将
. int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
本次实验是
函数的作用是将一个图像从一个颜色空间转换到另一个颜色空间
函数threshold()是对单通道的灰度图像进行阙值处理的(函数compare()也可以达到同样的效果)。
彩色图像可以使用cvtColor(strImage,grayImage,COLOR_RGB2GRAY)来变为灰度图像。
double threshold( InputArray src, OutputArray dst,double thresh, double maxval, int type );
第一个参数为输入的图像,Mat类型的即可。
第二个参数为输出图像,且和输入图像有同等大小和类型
第三个参数为设定阙值的具体值
第四个参数 maxval是当第五个参数类型为CV_THRESH_BINARY和CV_THRESH_BINARY_INV是的最大值
具体函数解析可参考博文:
原文:https://www.cnblogs.com/fcfc940503/p/11244607.html
或者:https://blog.csdn.net/keith_bb/article/details/53470170
前面博文回调函数代码解析;
void OnThresholdMethod(int, void*) { Mat tmpImage = srcImage.clone(); // 设置二值化的类型 //目前,Otsu或者Triangle算法仅支持8位单通道图像的实现 // 因此与这两个算法组合的时候,需要将图像转换为灰度图像 if (g_ThresholdType == 5) { if (srcImage.channels() == 3) cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY); g_ThresholdType = THRESH_OTSU + THRESH_BINARY; //阈值二值化+Otsu算法选择最佳阈值。 }
![](https://img2018.cnblogs.com/blog/1413304/201907/1413304-20190727092939250-1773558905.png)
if (g_ThresholdType == 6) { if (srcImage.channels() == 3) cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY); g_ThresholdType = THRESH_OTSU + THRESH_BINARY_INV; //阈值反二值化+Otsu算法选择最佳阈值。 }
![](https://img2018.cnblogs.com/blog/1413304/201907/1413304-20190727093016071-982863707.png)
if (g_ThresholdType == 7) { if (srcImage.channels() == 3) cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY); g_ThresholdType = THRESH_TRIANGLE + THRESH_BINARY; //阈值二值化+使用三角算法选择最佳阈值。
}
![](https://img2018.cnblogs.com/blog/1413304/201907/1413304-20190727093804133-1697889798.png)
if (g_ThresholdType == 8) { if (srcImage.channels() == 3) cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY); g_ThresholdType = THRESH_TRIANGLE + THRESH_BINARY_INV; //阈值二值化+使用三角算法选择最佳阈值。
}
// 二值化处理 threshold(tmpImage, dstImage, g_ThresholdValue, //阈值大小 255, g_ThresholdType); //阈值类型 imshow("【效果图】", dstImage); }