《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化

6.7 阈值化

· 最简单的图像切割方法,剔除图像中像素高于或低于一定值的像素,用图像中每一个像素点的灰度值与选取的与之进行比较,做出判断
· 涉及函数:Threshold()函数(基本阈值操作)和adaptiveThreshold()函数
· 基本思想:给定一个数组和一个阈值,根据数组中的每一个元素的值是高于还是低于阈值而进行一些处理

6.7.1 固定阈值操作:Threshold()函数

1.作用:对单通道数组应用固定阈值操作,对灰度图像进行阈值操作得到二值图像,可去掉噪声(如过滤很小或很大像素值的图像点)
2.函数原型

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

3.参数说明
(1)输入数组,单通道,8或32位浮点类型
(2)结果数组
(3)阈值值
(4)当type取CV_THRESH_BINARY或CV_THRESH_BINARY_INV时阈值类型时的最大值
(5)阈值类型,Threshold()函数中阈值类型选项对应的操作(标识符依次为0,1,2,3,4):
《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化

6.7.2 自适应阈值操作:adaptiveThreshold()函数

1.作用:对矩阵采用自适应阈值操作
2.函数原型

void adaptiveThreshold(InputArray src, OutputArray dst, double maxValue, int adaptiveMexthod, int thresholdType, int blockSize, double C)

3.参数说明
(1)输入图像
(2)结果图像
(3)给像素赋的满足条件的非零值
(4)指定要使用的自适应阈值算法,可取值:ADAPTIVE_THRESH_MEAN_C或ADAPTIVE_THRESH_GAUSSIAN_C
(5)阈值类型,可取值:THRESH_BINARY或THRESH_BINARY_INV
《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化
(6)计算阈值大小的一个像素的邻域尺寸,取值3,5,7等
(7)减去平均或加权平均值后的常数值,通常为正数

6.7.3 综合示例

#include<opencv2/opencv.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace cv;
#define WINDOW_NAME "【程序窗口】"
//全局变量
Mat g_srcImage, g_dstImage, g_grayImage;
int g_nThresholdValue = 100;
int g_nThresholdType = 3;
//全局函数
static void ShowHelpText();
void on_Threshold(int, void*);
//滑动条操作说明
static void ShowHelpText()
{
	printf("--------------------------------------------------------------------\n");
	printf("欢迎来到OpenCV阈值化示例程序~\n");
	printf("滑动条操作说明:\n");
	printf("\t\t键盘按键[ESC]-退出程序\n");
	printf("\t\t滑动条模式0-二进制阈值\n");
	printf("\t\t滑动条模式1-反二进制阈值\n");
	printf("\t\t滑动条模式2-截断阈值\n");
	printf("\t\t滑动条模式3-反阈值化为0\n");
	printf("\t\t滑动条模式4-阈值化为0\n");
	printf("--------------------------------------------------------------------\n");
}
int main()
{
	//键盘操作说明
	ShowHelpText();

	//[1]载入原图
	g_srcImage = imread("love.jpg");
	if (!g_srcImage.data)
	{
		printf("载入原图失败~!\n");
		return false;
	}
	//[2]留存一份灰度图
	cvtColor(g_srcImage, g_grayImage, COLOR_BGR2GRAY);
	//[3]创建并显示窗口
	namedWindow(WINDOW_NAME, WINDOW_AUTOSIZE);
	imshow(WINDOW_NAME, g_srcImage);
	//[4]创建滑动条控制阈值
	createTrackbar("模式", WINDOW_NAME, &g_nThresholdType, 4, on_Threshold);
	createTrackbar("参数值", WINDOW_NAME, &g_nThresholdValue, 255, on_Threshold);
	//[5]初始化自定义的阈值回调函数
	on_Threshold(0, 0);
	//[6]轮询等待用户按键
	while (1)
	{
		int key = waitKey(9);
		if ((char)key == 27) break;
	}
	return 0;
}
void on_Threshold(int, void*)
{
	//调用阈值函数
	threshold(g_srcImage, g_dstImage, g_nThresholdValue, 255, g_nThresholdType);
	//更新效果图
	imshow(WINDOW_NAME, g_dstImage);
}

运行效果:
《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化
《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化
《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化《OpenCV3编程入门》学习笔记6 图像处理(七)阈值化