在文章“opencv-python图像二值化函数cv2.threshold函数详解及参数cv2.THRESH_OTSU使用”中介绍了二值化函数threshold(),但它使用的是全局阈值,即整幅图像使用同一个阈值。但有时这种做法效果不理想,需要采用自适应的阈值,即图像不同区域采用不同的阈值。opencv-python中使用adaptiveThreshold()函数。
adaptiveThreshold()函数用法:
adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst]) -> dst
src:图像
maxValue:设置的最大值
adaptiveMethod:指定的阈值计算方法,有cv2.ADAPTIVE_THRESH_MEAN_C:阈值取自相邻区域的平均值;cv2.ADAPTIVE_THRESH_GAUSSIAN_C:阈值取自相邻区域的加权和,权重为一个高斯窗口。
thresholdType:跟threshold()方法中一样,有cv2.THRESH_BINARY、cv2.THRESH_BINARY_INV等值
blockSize:邻域大小
C:一个常数,阈值等于平均值或加权平均值减去该常数
函数返回一个二值图像。
下面是一个例子:
对于上图,若直接使用cv2.threshold()函数:
ret,th0 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
可以看到效果并不好。
使用自适应阈值的cv2.adaptiveThreshold函数:
th1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,5)
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,5)
上面两行代码分别使用平均值阈值和加权阈值的自适应阈值方法进行二值化,窗口大小为11,常数c等于5。效果如下:
效果比cv2.threshold()好得多。
参考资料:《OpenCV-Python 中文教程》段力辉 译