cvAdaptiveThreshold和cvThreshold的一些讨论

在http://www.opencv.org.cn/forum/viewtopic.php?f=10&t=3355 看到了一篇类似的帖子,正好看到这里,简单总结一下:


固定阈值化函数cvThreshold,其实它也有一种自适应阈值方法,那就是OSTU(大津法)!!只需要设定参数thresh_type的值为CV_THRESH_OTSU即可。

Otsu适用于直方图为双峰的图像,但是不均匀的照明等会导致不满足双峰条件,此时应采用动态阈值分割法,基本原理如下:局部区域中感兴趣的物体经常要比背景更亮或更暗,局部背景可以通过平滑处理估计,将图像与其局部背景进行比较。


再看看 cvAdaptiveThreshold用法:

cvAdaptiveThreshold( const CvArr* src, CvArr* dst, double max_value,
                                  int adaptive_method CV_DEFAULT(CV_ADAPTIVE_THRESH_MEAN_C),
                                  int threshold_type CV_DEFAULT(CV_THRESH_BINARY),
                                  int block_size CV_DEFAULT(3),
                                  double param1 CV_DEFAULT(5));

分析参数blockSize。这个参数相当重要,
1.要取奇数,如果取偶数运行后就会报错!!原因看源码,发现要做一个掩模,所以参数必须是奇数。OpenCV也做了一个检测,在函数adaptiveThreshold一开始就有CV_Assert( blockSize % 2 == 1 && blockSize > 1 )。

2.cvAdaptiveThreshold既可以做边缘提取,也可以实现二值化,是由你所选择的邻域所确定的,如果你所选择的邻域非常小(比如3×3),那么很显然阈值的“自适应程度”就非常高,这在结果图像中就表现为边缘检测的效果。如果邻域选择的比较大(比如31×31),那么阈值的“自适应程度”就比较低,这在结果图像中就表现为二值化的效果。

3.一般情况下,滤波器宽度应该大于被识别物体的宽度。block_size太小,无法代表背景,太大的话会影响到临近物体。

选定合适的block_size后,我们就可以选定一个更大的阈值param1,更好的抑制噪声

4.自适应二值化对于光照不均的文字,条码等,效果很好。

你可能感兴趣的:(cvAdaptiveThreshold和cvThreshold的一些讨论)