(ง •_•)ง[Python3 OpenCV4]5.阈值分割

文章目录

  • 接口文档
  • 使用固定阈值
  • 自适应阈值
  • Otsu阈值法”二值化”图像

接口文档

  • cv2.threshold() 固定阈值分割
  • cv2.adaptiveThreshold() 自适应阈值分割
  • cv2.ThresholdTypes() Otsu阈值

使用固定阈值

import matplotlib.pyplot as plt
import cv2


# 灰度图读入
img = cv2.imread('gradient.png', 0)
# 应用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()

原图:
(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第1张图片
结果:

(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第2张图片

(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第3张图片

(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第4张图片

  • THRESH_BINARY 二进制阈值化

  • THRESH_BINARY_INV 反二进制阈值化

  • THRESH_TRUNC 截断阈值化

  • THRESH_TOZERO 阈值化为0

  • THRESH_TOZERO_INV 反阈值化为0

  • 二进制阈值化
    首先指定一个阈值量即像素的灰度值,遍历图像中像素值,大于这个阈值的像素均设置为最大像素值(如8位灰度值最大为255),灰度值小于设定阈值的像素点像素值重新赋值为0.

  • 反二进制阈值化
    与二进制阈值化相同的是也要首先指定一个阈值,不同的是在对图像进行阈值化操作时正好与二进制阈值化相反,当图像像素点超过这个阈值的时候像素点重新赋值为0,当像素值低于该阈值时即赋值为最大值

  • 截断阈值化
    根据给定的像素值阈值,图像中大于该阈值的像素点被重新设置为该阈值,而小于该阈值的像素值保持不变

  • 阈值化为0
    与截断阈值化不同,阈值化为0类型像素点的灰度值如果大于该阈值则像素值不变,如果像素点的灰度值小于该阈值,则像素值设置为0.

  • 反阈值化为0
    其原理类似于阈值化为0类型只不过在对图像进行操作时相反,像素值大于该阈值的像素重新赋值为0,而小于该阈值的像素值则保持不变

自适应阈值

在图像阈值化操作中,更关注的是从二值化图像中,分离目标区域和背景区域,但是仅仅通过设定固定阈值很难达到理想的分割效果。而自适应阈值,则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值。这样做的好处:

  1. 每个像素位置处的二值化阈值不是固定不变的,而是由其周围邻域像素的分布来决定的。
  2. 亮度较高的图像区域的二值化阈值通常会较高,而亮度低的图像区域的二值化阈值则会相适应的变小。
  3. 不同亮度、对比度、纹理的局部图像区域将会拥有相对应的局部二值化阈值。
import matplotlib.pyplot as plt
import cv2


# 灰度图读入
img = cv2.imread('timg.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()

(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第5张图片

  • 参数1:要处理的原图
  • 参数2:最大阈值,一般为255
  • 参数3:小区域阈值的计算方式
    • ADAPTIVE_THRESH_MEAN_C:
      小区域内取均值,阈值T(x,y)是(x,y)减去C的块大小×块大小邻域的平均值
    • ADAPTIVE_THRESH_GAUSSIAN_C:
      小区域内加权求和,权重是个高斯核。阈值T(x,y)是(x,y)减去C的块大小×块大小邻域的加权和(与高斯窗口的互相关)。默认sigma(标准偏差)用于指定的块大小。见getGaussianKernel
  • 参数4:阈值方式(跟前面讲的那5种相同)
  • 参数5:小区域的面积,如11就是11*11的小块
  • 参数6:最终阈值等于小区域计算出的阈值再减去此值

阈值计算方式
(ง •_•)ง[Python3 OpenCV4]5.阈值分割_第6张图片

Otsu阈值法”二值化”图像

OTSU算法是由日本学者OTSU于1979年提出的一种对图像进行二值化的高效算法。
前景:用n1,csum,m1来表示在当前阈值下的前景的点数,质量矩,平均灰度
背景:用n2, sum-csum,m2来表示在当前阈值下的背景的点数,质量矩,平均灰度

你可能感兴趣的:(#,[,python3-opencv4,])