小言_互联网的博客

在OpenCV里实现自适应阈值分割

548人阅读  评论(0)

在图片处理过程中,针对铺前进行二值化等操作的时候,我们希望能够将图片相应区域内所有的信息提供保留。实验室环境下,相应的素材是模板化的,但是将实验室方法应用于现实环境中时,我们会发现光影环境对于效果的影响其实是很大的。在这种情况下进行处理,会使得结果不如人意:一块黑,一块白,且黑的区域的特征无法提取。这时候自适应阈值算法尤为重要。与全局阈值不同,它更加注重上下文关系,将原本图片分割成更小的区域进行判断,极大地降低了阴影对于图片本身的影响。在不均匀照明或者灰度值分布不均的情况下,如果使用全局阈值分割,那么得到的分割效果往往会很不理想,如下面这个例子:

左图是一个原图,右图是使用全局阈值处理后的图片,可以看到输出图片的左下角根据不清楚。像这样的图片,就需要使用新的方法—自适应阈值分割。在OpenCV里提供下面的函数:

其中参数解释如下:

src 8位单通道的图像数据

dst 输出图像,大小和类型与输入图像一样。

maxValue 满足阈值的元素设置最大值。

adaptiveMethod 自适应阈值算法选择:ADAPTIVE_THRESH_MEAN_C和ADAPTIVE_THRESH_GAUSSIAN_C。在这里边界默认采用BORDER_REPLICATE | BORDER_ISOLATED处理。

thresholdType 阈值分割的方式,这里只能从THRESH_BINARY或THRESH_BINARY_INV里二选一。

blockSize 计算平滑窗口的大小,需要为奇数:3,5,7等等。

C 均值或权重值减去的参数,一般设置为正值,也可以是0或负数。

 

ADAPTIVE_THRESH_MEAN_C,为局部邻域块的平均值。该算法是先求出块中的均值,再减去常数C。

ADAPTIVE_THRESH_GAUSSIAN_C ,为局部邻域块的高斯加权和。该算法是在区域中(x,y)周围的像素根据高斯函数按照他们离中心点的距离进行加权计算, 再减去常数C。

可以使用下面的例子来理解该函数的使用:

#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import cv2
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

#图片的路径
imgname = "imgAd1.png"

#读取图片
image = cv2.imread(imgname, cv2.IMREAD_GRAYSCALE)

#图片的高度和宽度
h,w = image.shape[:2]
print('imagesize={}-{}'.format(w,h))

# 固定阈值
retval, th1 = cv2.threshold(image, 109, 255, cv2.THRESH_BINARY)
# 自适应阈值
th2 = cv2.adaptiveThreshold(
    image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4)
th3 = cv2.adaptiveThreshold(
    image, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 17, 6)

titles = ['原图', '全局阈值(v = 109)', '自适应平均值', '自适应高斯']
images = [image, th1, th2, th3]

for i in range(4):
    plt.subplot(2, 2, i + 1), plt.imshow(images[i], 'gray')
    plt.title(titles[i], fontsize=8)
    plt.xticks([]), plt.yticks([])
plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

结果输出如下:

从上面结果看来,经过自适应处理之后的图像,更加清晰,这样的图片适合后面更进一步处理,比如图像识别。

https://blog.csdn.net/caimouse/article/details/51749579


转载:https://blog.csdn.net/caimouse/article/details/101509175
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场