文章目录

  • 阈值分割技术
  • 代码
  • 总结
  • 参考

图像阈值分割是根据图像灰度值信息提取前景。它是将小于阈值的像素赋予一个新值,大于阈值的像素赋予另一个新值。

阈值分割技术

1.固定阈值化:一副图像使用一个阈值。

cv2.threshold(),有两个返回值,第一个为retVal,第二个为阈值化结果图像。第一个参数是原始图像,第二个参数是设定的阈值,第三个参数是当像素值大于设定的阈值时被赋予的新值,它由第四个参数决定。第四个参数为opencv给定的阈值赋值方法,它包括cv2.THRESH_BINARY

cv2.THRESH_BINARY_INV

cv2.THRESH_TRUNC

cv2.THRESH_TOZERO

cv2.THRESH_TOZERO_INV

五种赋值方法对应的图如下:

opencv sobl双阈值 设置_阈值分割

2.自适应阈值化:阈值由图像不同的区域计算得到,所以一副图像上的不同区域使用不同的阈值。
cv2.adaptiveThreshold(),只有一个返回值,第一个参数为原始图像;第二个参数为最大像素值;第三个参数为计算阈值的方法:cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 阈值取邻域的加权和;cv2.ADAPTIVE_THRESH_MEAN_C, 阈值取邻域的平均值;
第四个参数为BlockSize 为邻域大小;
第五个参数为C为常数,最终的阈值为第三个参数计算的阈值减去C。
3.Otus阈值化
cv2.threshold()函数中传入cv2.THRESH_OTUS,
Otus算法会自动找到最优的阈值,最优阈值即是返回值retVal。如果不使用Otus法,retVal为设定的固定阈值。

代码

import cv2
from matplotlib import pyplot as plt
# 读取图像
img = cv2.imread(r'F:\OPENCV\Opencv\flower.jfif', cv2.IMREAD_COLOR)
# opencv读入的图像通道顺序为BGR, matplotlib的顺序为RGB,matplotlib正确显示图像,就需要把OPENCV读入图像的通道顺序改变为RGB
# cv2.split()通道分离
b, g, r = cv2.split(img)
# cv2.merge()通道合并
src = cv2.merge([r, g, b])
# 灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 直方图均衡化
# equal_img = cv2.equalizeHisr(gray_img)
# 固定阈值化
ret1, BINARY = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
ret2, BINARY_INV = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)
ret3, TRUNC = cv2.threshold(gray, 127, 255, cv2.THRESH_TRUNC)
ret4, TOZERO = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO)
ret5, TOZERO_INV = cv2.threshold(gray, 127, 255, cv2.THRESH_TOZERO_INV)
# 自适应阈值化
adaptive_gaussian = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 25, 3)
adaptive_mean = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 25, 3)

# Otus阈值化
ret7, thresh7 = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)

titles = ['img', 'src', 'gray', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV', 'adaptive(gaussian)', 'adaptive(mean)', 'otus']
images = [img, src, gray, BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV, adaptive_gaussian, adaptive_mean, thresh7]
# figzise表示figure的宽、长
plt.figure(figsize=(6, 6))
for i in range(len(images)):
    plt.subplot(4, 3, i + 1)
    plt.imshow(images[i], "gray")
    plt.title(titles[i],)
    plt.xticks([])
    plt.yticks([])
# dpi指定图像的清晰度, bbox_inches为图片保存大小的情况
plt.savefig(r'F:\OPENCV\Opencv\flower.png', dpi=200, bbox_inches='tight')
plt.show()

结果显示

opencv sobl双阈值 设置_邻域_02

总结

阈值化是一个不断调参的过程,全局阈值化时可以根据一副图像的灰度直方图找的最佳阈值,最佳阈值位于灰度图像峰峰值之间。在光照不均匀或灰度分布不均匀的情况下,可使用自适应阈值化。

参考

1.OpenCV-Python官方教程