OpenCv 阈值分割

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()

OpenCv 阈值分割_第1张图片
#图和代码,是我抄的
关于这几种阈值方式,官方文档给出这样一个东西:
OpenCv 阈值分割_第2张图片
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()

OpenCv 阈值分割_第3张图片
#同样代码和图是我抄的

总结一下:

cv2.threshold()用来进行固定阈值分割。固定阈值不适用于光线不均匀的图片,所以用 cv2.adaptiveThreshold()进行自适应阈值分割。

你可能感兴趣的:(opencv,python)