阈值处理——实例分析

上篇博客实现了一个阈值处理的例子,现在主要来讲解一相关程序;

首先谈谈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算法选择最佳阈值。
	  }

 

	  if (g_ThresholdType == 6)
	  {
		  if (srcImage.channels() == 3)
			  cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY);
		  g_ThresholdType = THRESH_OTSU + THRESH_BINARY_INV;  //阈值反二值化+Otsu算法选择最佳阈值。
	  }

 

	  if (g_ThresholdType == 7)
	  {
		  if (srcImage.channels() == 3)
			  cvtColor(srcImage, tmpImage, COLOR_BGR2GRAY);
		  g_ThresholdType = THRESH_TRIANGLE + THRESH_BINARY;          //阈值二值化+使用三角算法选择最佳阈值。	 
}
	  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); }

  

posted @ 2019-07-27 09:39  浮沉沉浮  阅读(902)  评论(0编辑  收藏  举报