OpenCv
阈值分割
通俗理解为,设立一个阈值(其实就是分界线)将一张图分成两半。
import cv2
#引入cv2
img = cv2.imread('huidutu.jpg', 0)
#读取灰度图
ret, th = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 阈值分割
cv2.imshow('thresh', th)
#显示图片
cv2.waitKey(0)
threshold()用于实现阈值分割,ret是return value缩写,代表当前的阈值。
关于函数的参数:
官方文档参数如下
src:要处理的原图,一般为灰度图
thresh:阈值
maxval:最大阈值一般为255
type:阈值方式,最主要有五种
import matplotlib.pyplot as plt
# 应用5种不同的阈值方法
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
ret, th2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
ret, th3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
ret, th4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
ret, th5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
titles = ['Original', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV']
images = [img, th1, th2, th3, th4, th5]
# 使用Matplotlib显示
for i in range(6):
plt.subplot(2, 3, i + 1)
plt.imshow(images[i], 'gray')
plt.title(titles[i], fontsize=8)
plt.xticks([]), plt.yticks([]) # 隐藏坐标轴
plt.show()
#图和代码,是我抄的
关于这几种阈值方式,官方文档给出这样一个东西:
THRESH_BINARY:如果这个像素点的值大于阈值则将该像素点变成你设置的maxval,其他的变成0,其他方式类比这个理解
但是对于明暗分布不均的图片,threshold()并不适用,这就引入adaptiveThreshold()。
他每次回选取图片的一小部分进行计算阈值,每一块区域的阈值都不相同。
官方给的参数如下:
观察和threshold()相比多了adaptiveMethod、blockSize、C参数
adaptiveMethod:一块小区域的计算阈值的方式
ADAPTIVE_THRESH_MEAN_C
:小区域内取均值ADAPTIVE_THRESH_GAUSSIAN_C
:小区域内加权求和,权重是个高斯核blockSize:顾名思义就是小区域的面积,比如传入10,则小面积块为10*10
C:最后的结果再减去这个值
# 自适应阈值对比固定阈值
img = cv2.imread('yizhangtu.jpg', 0)
# 固定阈值
ret, th1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 自适应阈值
th2 = cv2.adaptiveThreshold(
img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 4)
th3 = cv2.adaptiveThreshold(
img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 17, 6)
titles = ['Original', 'Global(v = 127)', 'Adaptive Mean', 'Adaptive Gaussian']
images = [img, 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.threshold()
用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()
进行自适应阈值分割。