OpenCV:threshold() vs adaptiveThreshold()

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sss_369/article/details/84168481

1. 直接阈值化threshold()

调用方法:

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

基本思想:给定一个输入数组和一个阈值,数组中的每个元素将根据其与阈值之间的大小发生相应的改变。

【注】:每种阈值化操作类型,对应着源图像每点的像素值与阈值之间的比较操作,根据源图像像素值与阈值间的大小关系,目标像素可能被置0、原像素值、或者设定的最大值maxValue。

                             

示例:

void test_threshold()
{
	cv::Mat src = cv::imread("lena.jpg", cv::IMREAD_GRAYSCALE);
	cv::Mat dst;
 
	double thresh = 100;
	int maxVal = 255;
	cv::threshold(src, dst, thresh, maxVal, cv::THRESH_BINARY);
 
	cv::imshow("threshold", dst);
	cv::waitKey(0);
 
	return;
}

2. 自适应阈值adaptiveThreshold()

调用方法:

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

adaptiveThreshold()支持两种自适应方法:

ADAPTIVE_THRESH_MEAN_C(平均)和ADAPTIVE_THRESH_GAUSSIAN_C(高斯);

通过计算每个像素周围bxb大小像素块的加权均值并减去常量C得到。

如果使用平均的方法,则所有像素周围的权值相同;

如果使用高斯的方法,则(x,y)周围的像素的权值则根据其到中心点的距离通过高斯方程得到;

示例:

void test_adaptive_threshold()
{
	cv::Mat src = cv::imread("chessboard.png", cv::IMREAD_GRAYSCALE);
	cv::Mat dst;
 
	int maxVal = 255;
	int blockSize = 41;
	double C = 0;
	cv::adaptiveThreshold(src, dst, maxVal, cv::ADAPTIVE_THRESH_MEAN_C, cv::THRESH_BINARY, blockSize, C);
 
	cv::imshow("threshold", dst);
	cv::waitKey(0);
 
	return;
}

参考文章:

1. https://blog.csdn.net/guduruyu/article/details/68059450

猜你喜欢

转载自blog.csdn.net/sss_369/article/details/84168481