文章目录
- 阈值分割技术
- 代码
- 总结
- 参考
图像阈值分割是根据图像灰度值信息提取前景。它是将小于阈值的像素赋予一个新值,大于阈值的像素赋予另一个新值。
阈值分割技术
1.固定阈值化:一副图像使用一个阈值。
cv2.threshold(),有两个返回值,第一个为retVal,第二个为阈值化结果图像。第一个参数是原始图像,第二个参数是设定的阈值,第三个参数是当像素值大于设定的阈值时被赋予的新值,它由第四个参数决定。第四个参数为opencv给定的阈值赋值方法,它包括cv2.THRESH_BINARY
cv2.THRESH_BINARY_INV
cv2.THRESH_TRUNC
cv2.THRESH_TOZERO
cv2.THRESH_TOZERO_INV
五种赋值方法对应的图如下:
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()
结果显示
总结
阈值化是一个不断调参的过程,全局阈值化时可以根据一副图像的灰度直方图找的最佳阈值,最佳阈值位于灰度图像峰峰值之间。在光照不均匀或灰度分布不均匀的情况下,可使用自适应阈值化。
参考
1.OpenCV-Python官方教程