阈值分割方法总结

阈值是界限的意思,阈值分割就是以一个合适的像素值作为界限将图像处理成高对比度、容易识别的图像的一种方法。
threshold()

double cv::threshold(
    cv::InputArray src, // 输入图像
    cv::OutputArray dst, // 输出图像
    double thresh, // 阈值
    double maxValue, // 向上最大值
    int thresholdType // 阈值化操作的类型 
)

在这里插入图片描述
举个例子理解下thresholdType,拿第一种方法为例。像素值如果大于阈值,则把像素值变成255,否则,变成0.这样以来,就把原图变成黑白两色,对比度明显。

threshold(image, t_image,120, 255,CV_THRESH_BINARY); 

自适应阈值分割

void cv::adaptiveThreshold(  
    cv::InputArray src, // 输入图像  
    cv::OutputArray dst, // 输出图像  
    double maxValue, // 向上最大值  
    int adaptiveMethod, // 自适应方法,平均或高斯  
    int thresholdType // 阈值化类型  
    int blockSize, // 块大小  
    double C // 常量  
); 

adaptiveThreshold()支持两种自适应方法,cv::ADAPTIVE_THRESH_MEAN_C(平均)和cv::ADAPTIVE_THRESH_GAUSSIAN_C(高斯)。

 adaptiveThreshold(image, src, 255, ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,5,20);

自适应阈值不用自己选择,该函数根据图像情况自己设定。
在这里插入图片描述
该图是经canny检测之后的阈值分割图。

阈值分割还有一种方法,直接说明:

Mat image = imread("D:\\program\\bu1.png",0);//读入模板图
	imshow("原图",image);
	waitKey(0);
	Mat dstImg(image.size(), CV_8UC3, Scalar::all(0));//纯黑图像

    int u1 = image.rows;//阈值化处理
	int u2 = image.cols;
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			
	        sum = sum + image.at<uchar>(i, j);
		}
	}
	int u = u1*u2;
	int average = (int)sum/u*2;
	threshold(image, t_image, average, 255,CV_THRESH_BINARY); 
	Canny(src,t_image,50,50);  
	imshow("阈值分割图",t_image);
	waitKey(0);

该方法简单明了,阈值取值适中,不错。


版权声明:本文为weixin_43491924原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。