图像预处理——自适应二值化

图像预处理——自适应二值化


adaptiveThreshold函数 OpenCV源码解析

 

adaptiveThreshold函数在OpenCV中的源码为

void cv::adaptiveThreshold( InputArray _src, OutputArray _dst, double maxValue,
	int method, int type, int blockSize, double delta )
{
	Mat src = _src.getMat();
	CV_Assert( src.type() == CV_8UC1 );
	CV_Assert( blockSize % 2 == 1 && blockSize > 1 );  //blockSize用来计算阈值的象素邻域大小,必须是奇数: 3, 5, 7, ...
	Size size = src.size();

	_dst.create( size, src.type() );
	Mat dst = _dst.getMat();

	if( maxValue < 0 )
	{
		dst = Scalar(0);
		return;
	}

	Mat mean;

	if( src.data != dst.data )
		mean = dst;

	if( method == ADAPTIVE_THRESH_MEAN_C )
		boxFilter( src, mean, src.type(), Size(blockSize, blockSize),
		Point(-1,-1), true, BORDER_REPLICATE );
	else if( method == ADAPTIVE_THRESH_GAUSSIAN_C )
		GaussianBlur( src, mean, Size(blockSize, blockSize), 0, 0, BORDER_REPLICATE ); //高斯平滑
	else
		CV_Error( CV_StsBadFlag, "Unknown/unsupported adaptive threshold method" );

	int i, j;
	uchar imaxval = saturate_cast<uchar>(maxValue);
	int idelta = type == THRESH_BINARY ? cvCeil(delta) : cvFloor(delta);
	uchar tab[768];

	if( type == CV_THRESH_BINARY )
		for( i = 0; i < 768; i++ )
			tab[i] = (uchar)(i - 255 > -idelta ? imaxval : 0);
	else if( type == CV_THRESH_BINARY_INV )
		for( i = 0; i < 768; i++ )
			tab[i] = (uchar)(i - 255 <= -idelta ? imaxval : 0);
	else
		CV_Error( CV_StsBadFlag, "Unknown/unsupported threshold type" );

	if( src.isContinuous() && mean.isContinuous() && dst.isContinuous() )
	{
		size.width *= size.height;
		size.height = 1;
	}

	for( i = 0; i < size.height; i++ )
	{
		const uchar* sdata = src.data + src.step*i;
		const uchar* mdata = mean.data + mean.step*i;
		uchar* ddata = dst.data + dst.step*i;

		for( j = 0; j < size.width; j++ )
			ddata[j] = tab[sdata[j] - mdata[j] + 255];
	}
}


解析:

src
输入图像.
dst
输出图像.
max_value
使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值.
adaptive_method
自适应阈值算法使用:CV_ADAPTIVE_THRESH_MEAN_C 或 CV_ADAPTIVE_THRESH_GAUSSIAN_C (见讨论).
threshold_type
取阈值类型:必须是下者之一
  • CV_THRESH_BINARY,
  • CV_THRESH_BINARY_INV
block_size
用来计算阈值的象素邻域大小: 3, 5, 7, ...
param1
与方法有关的参数。对方法 CV_ADAPTIVE_THRESH_MEAN_C 和 CV_ADAPTIVE_THRESH_GAUSSIAN_C, 它是一个从均值或加权均值提取的常数(见讨论), 尽管它可以是负数。

函数 cvAdaptiveThreshold 将灰度图像变换到二值图像,采用下面公式:

threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)>T(x,y)
           0, otherwise

threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)>T(x,y)
           max_value, otherwise

其中 TI 是为每一个象素点单独计算的阈值

对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1。

对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1。

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值