【拜小白opencv】21-固定阈值化:Threshold()函数

常言道“温故而知新”,写此文章就是对自己目前学习内容的小小的总结与记录。

本文力求用最简洁的语言,详细的代码将此部分内容讲解清楚,但由于博主同样是刚刚接触OpenCV,或许表达上有些瑕疵,还望读者能够指教探讨,大家共同进步。

博主机器配置为:VS2013+opencv2.4.13+Win-64bit。

若本文能给读者带来一点点启示与帮助,我就很开心了。

===========================分割线========================


1-Threshold()函数--固定阈值化操作

OpenCV提供了阈值化函数threshold(),是对单通道数组应用固定阈值操作。该函数的典型应用是对灰度图像进行阈值操作得到二值图像,有5种阈值化类型参数可供选择,下面来看看threshold()函数的定义:

double threshold( InputArray src, OutputArray dst, double thresh, double maxval, int type );

参数说明:
  • 第一个参数:InputArray类型的src,输入数组,填单通道,8位或32位浮点类型Mat即可。即为输入图像。
  • 第二个参数:函数运算后的结果存放在这。即为输出图像(与输入图像同样的尺寸和类型)。
  • 第三个参数:double类型的thresh,阈值的具体值。根据需要自行设置。
  • 第四个参数:表示预设最大值,使用THRESH_BINARY或THRESH_BINARY_INV类型。
  • 第五个参数:int类型的type,表示阈值化处理的类型。具体有5类,见下文。

================================分割线====================

2-阈值化的类型

Threshold()函数有5种阈值化类型,为了解释阈值分割的过程,我们来看一个简单有关像素灰度的图片,该图如下。该图中的蓝色水平线代表着具体的一个阈值。
【拜小白opencv】21-固定阈值化:Threshold()函数_第1张图片


---------------------------------------------------------------------------------------------------------------------------

2-1阈值类型1:二进制阈值化--THRESH_BINARY

  • 该阈值化类型如下式所示:


  • 解释:在运用该阈值类型的时候,先要选定一个特定的阈值量,比如:125,这样,新的阈值产生规则可以解释为大于125的像素点的灰度值设定为最大值(如8位灰度值最大为255),灰度值小于125的像素点的灰度值设定为0。

                        【拜小白opencv】21-固定阈值化:Threshold()函数_第2张图片
---------------------------------------------------------------------------------------------------------

2-2阈值类型2:反二进制阈值化--THRESH_BINARY_INV


  • 该阈值类型如下式所示:


  • 解释:该阈值化与二进制阈值化相似,先选定一个特定的灰度值作为阈值,不过最后的设定值相反。(在8位灰度图中,例如大于阈值的设定为0,而小于该阈值的设定为255)。

                         【拜小白opencv】21-固定阈值化:Threshold()函数_第3张图片
----------------------------------------------------------------------------------------------------------

2-3阈值类型3:截断阈值化--THRESH_TRUNC

  • 该阈值化类型如下式所示:


  • 解释:同样首先需要选定一个阈值,图像中大于该阈值的像素点被设定为该阈值,小于该阈值的保持不变。(例如:阈值选取为125,那小于125的阈值不改变,大于125的灰度值(230)的像素点就设定为该阈值)。

                        【拜小白opencv】21-固定阈值化:Threshold()函数_第4张图片
----------------------------------------------------------------------------------------------------------

2-4阈值类型4:阈值化为0--THRESH_TOZERO

  • 该阈值类型如下式所示:


  • 解释:先选定一个阈值,然后对图像做如下处理:1 像素点的灰度值大于该阈值的不进行任何改变;2 像素点的灰度值小于该阈值的,其灰度值全部变为0。

                         
------------------------------------------------------------------------------------------------------------

2-5阈值类型5:反阈值化为0--THRESH_TOZERO_INV

  • 该阈值类型如下式所示:


  • 解释:原理类似于0阈值,但是在对图像做处理的时候相反,即:像素点的灰度值小于该阈值的不进行任何改变,而大于该阈值的部分,其灰度值全部变为0。

                         【拜小白opencv】21-固定阈值化:Threshold()函数_第5张图片
---------------------------------------------------------------------------------------------------------------

对应在函数里的第五个参数标识符:
  • 0:二进制阈值化----THRESH_BINARY
  • 1:反二进制阈值化----THRESH_BINARY_INV
  • 2:截断阈值化:大于该阈值的像素点被设定为该阈值----THRESH_TRUNC
  • 3:阈值化为0:低于阈值被设置为0----THRESH_TOZERO
  • 4:反阈值化为0:超过阈值被设置为0----THRESH_TOZERO_INV
  • 8:OTSU阈值化----CV_THRESH_OTSU
这个OTSU是OpenCV里已经实现好的,用起来比上一篇文章方便。 【拜小白opencv】20-OTSU阈值化实现;OTSU最大类间方差法
===============================分割线=============================

3-代码演示

#include             
#include             
#include            
#include           
using namespace std;
using namespace cv;

int main()
{
	//------------【1】读取源图像并检查图像是否读取成功------------  
	Mat srcImage = imread("D:\\OutPutResult\\ImageTest\\build.jpg");
	if (!srcImage.data)
	{
		cout << "读取图片错误,请重新输入正确路径!\n";
		system("pause");
		return -1;
	}
	imshow("【源图像】", srcImage);
	//------------【2】灰度转换------------  
	Mat srcGray;
	cvtColor(srcImage, srcGray, CV_RGB2GRAY);
	imshow("【灰度图】", srcGray);
	//------------【3】初始化相关变量---------------
	Mat dstImage;	//创建输出图像
	int thresholdValue = 125; //初始化阈值参数
	const int maxVal = 255; //预设最大值
	int thresholdType = 4;	//阈值类型
	/*
		阈值类型有如下几种:
		0:二进制阈值化--THRESH_BINARY
		1:反二进制阈值化--THRESH_BINARY_INV
		2:截断阈值化:大于该阈值的像素点被设定为该阈值--THRESH_TRUNC
		3:阈值化为0:低于阈值被设置为0--THRESH_TOZERO
		4:反阈值化为0:超过阈值被设置为0--THRESH_TOZERO_INV
		8:OTSU阈值化--CV_THRESH_OTSU
	*/
	//-----------【4】固定阈值化操作-----------------------
	threshold(srcGray, dstImage, thresholdValue, maxVal, thresholdType);

	imshow("【阈值化后图像】", dstImage);
	waitKey(0);
	return 0;
}


===============================分割线========================

4-显示结果

为了观察五种阈值的效果,做了5次实验。 阈值设置为 int thresholdValue = 125; 
当代码中 int thresholdType = 0; 时,即为二进制阈值化,结果如下:

【拜小白opencv】21-固定阈值化:Threshold()函数_第6张图片

当代码中  int thresholdType = 1;   时,即为 二进制阈值化 ,结果如下:
【拜小白opencv】21-固定阈值化:Threshold()函数_第7张图片

当代码中  int thresholdType = 2;   时,即为 截断阈值化 ,结果如下:
【拜小白opencv】21-固定阈值化:Threshold()函数_第8张图片

当代码中 int thresholdType = 3; 时,即为阈值化为0,结果如下:
【拜小白opencv】21-固定阈值化:Threshold()函数_第9张图片

当代码中 int thresholdType = 4; 时,即为反阈值化为0,结果如下:
【拜小白opencv】21-固定阈值化:Threshold()函数_第10张图片

=============================分割线============================

5-程序说明

Threshold()函数使用很简单,没什么难点,根据自己需要设置阈值初始值,选择好阈值的类型。
下一节,将介绍另一种阈值方法,自适应阈值adaptiveThreshold()函数。

========================END========================

参考文章:基本的阈值操作

你可能感兴趣的:(【拜小白OpenCV】,一步步学习OpenCV2)