OpenCV中图像自适应阈值二值化函数:
void cvAdaptiveThreshold(
CvArr* src,
CvArr* dst,
double max_val,
int adaptive_method = CV_ADAPTIVE_THRESH_MEAN_C,
int threshold_type = CV_THRESH_BINARY,
int block_size = 3,
double param1 = 5
);
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
输入图像为 src , 输出为 dst
所以这个方法大概就是 localized 的 cvThreshold 版本了,参数的理解:
block_size : 既然要局部化,那肯定要设定多大的 block ,在这个区域内进行计算,只能设定为奇数,这跟一般的OpenCV中的窗口参数是一样的,因为这样可以保持对称性;
adaptive_method:这个呢就是我们在这个block中计算均值啊std啊什么的所要加的窗了,顾名思义,默认应该是均值,还有一个是加高斯窗的;个人感觉效果都差不多,没有什么本质区别。
threshold_type:这是啥?看上面那个代码嘛,看到没有,两个选项,基本上效果出来是相反的(黑白色),懂了吗??仔细看看
max_value:我之前以为是什么阈值,其实并不是。它是满足条件后的赋值值,比如说你设置为255,那么这个点满足条件后: src( x , y ) > T( x , y ),那么这个点呢就设定为255或者0,根据threshold_type来定,懂了吗?姐
param1:那么就剩下这么一个参数了,
对方法 CV_ADAPTIVE_THRESH_MEAN_C,先求出块中的均值,再减掉param1
对方法 CV_ADAPTIVE_THRESH_GAUSSIAN_C ,先求出块中的加权和(gaussian), 再减掉param1
这个参数感觉是调节这个背景色和前景色比例的问题的,然后据网上说:
T( x , y ) = mean( x , y ) - param1
看到这个式子了吗,试想一下,如果我们拿到一幅图像,是白色背景(趋近255),黑色的线条(≈0),当然这是理想情况,那这种情况下,在一个localized block里面,可以想象由于黑色的部分很少,线条嘛。所以它的mean 可能值是比较大的(可能达到200都不一定),这样呢,可以考虑减去一个 param1 就可以拉低这个T,使得我们在二值化时分割性更加好;反之,黑色背景,白色线条可以考虑减去一个负数的 param1??
当然!我觉得这都不是好的方案,只是一个统一性的预处理的东西,而且对参数相当敏感。
but right now we should live with it!
public static void cvAdaptiveThreshold( IntPtr src, IntPtr dst, double maxValue, ADAPTIVE_THRESHOLD_TYPE adaptiveType, THRESH thresholdType, int blockSize, double param1 )
Parameters
src (IntPtr)
Source array (single-channel, 8-bit of 32-bit floating point).
dst (IntPtr)
Destination array; must be either the same type as src or 8-bit.
maxValue (Double)
Maximum value to use with CV_THRESH_BINARY and CV_THRESH_BINARY_INV thresholding types
adaptiveType (ADAPTIVE_THRESHOLD_TYPE)
Adaptive_method
thresholdType (THRESH)
Thresholding type
blockSize (Int32)
The size of a pixel neighborhood that is used to calculate a threshold value for the pixel: 3, 5, 7, ...
param1 (Double)
Constant subtracted from mean or weighted mean. It may be negative.