利用python+opencv进行自适应阈值分割(附代码)

版权声明:本文为博主原创文章,转载请附源链接。


前面博客所讲的简单阈值分割是一种全局分割,但是当一幅图上面的不同部分具有不同的亮度的时候,此时需要采取自适应阈值分割。就是对图像中的各个部分进行分割,即采用邻域分割,在一个邻域范围内进行图像阈值分割。

opencv中采用cv2.adaptiveThreshold()函数进行自适应阈值分割。

Adaptive Method- 指定计算阈值的方法

cv2.ADPTIVE_THRESH_MEAN_C:阈值取邻域的平均值

cv2.ADPTIVE_THRESH_GAUSSIAN_C:阈值取自邻域的加权和平均值,权重分布为一个高斯函数分布

block size:邻域大小,用来计算阈值的区域大小

C:这是一个常数,阈值等于平均值或者加权平均值减去这个常数

简单阈值分割与自适应阈值分割对比代码如下所示:

# -*- coding: utf-8 -*-
import cv2
import numpy as np
from matplotlib import pyplot as plt

img=cv2.imread('4.jfif',0) #0是第二个参数,将其转为灰度图

img = cv2.medianBlur(img,5)
ret,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)

#11 为 邻域大小,   2为C值,常数
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,\
cv2.THRESH_BINARY,11,2)
th3 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,\
cv2.THRESH_BINARY,11,2)

titles = ['Original Image', 'Global Thresholding (v = 127)',
'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [img, th1, th2, th3]
for i in xrange(4):
    plt.subplot(2,2,i+1),plt.imshow(images[i],'gray')
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

运行结果如下所示:
利用python+opencv进行自适应阈值分割(附代码)_第1张图片

左上角为原图像,右上角为简单阈值分割(全局分割);
左下角为邻域平均值分割,噪声较多,右下角为邻域加权平均值分割,采用高斯函数分布,效果较好。

你可能感兴趣的:(opencv)