图像处理中,二值图像是经常用到的处理图像,下面简单介绍一下opencv中的二值化处理
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('./klay.jpg')
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 其中127为设定的阈值,255为设定的最大阈值, 0为黑色 255为白色
# 像素小于阈值127设为0,大于127的为最大阈值255
ret, bw_image1 = cv.threshold(gray_image, 127, 255, cv.THRESH_BINARY)
# 像素小于阈值127设为最大阈值255,大于127的为0
ret, bw_image2 = cv.threshold(gray_image, 127, 255, cv.THRESH_BINARY_INV)
# 像素小于阈值127的保持不变,大于阈值设为最大阈值255
ret, bw_image3 = cv.threshold(gray_image, 127, 255, cv.THRESH_TRUNC)
# 像素值小于阈值设为0, 大于阈值127的保持不变
ret, bw_image4 = cv.threshold(gray_image, 127, 255, cv.THRESH_TOZERO)
# 像素值小于阈值的保持不变, 大于阈值127的设为0
ret, bw_image5 = cv.threshold(gray_image, 127, 255, cv.THRESH_TOZERO_INV)
# 大津法通过图像灰度信息自动获取最佳阈值
ret, bw_image6 = cv.threshold(gray_image, 127, 255, cv.THRESH_OTSU)
titles = ['image', 'gray_image', 'BINARY', 'BINARY_INV', 'TRUNC', 'TOZERO', 'TOZERO_INV', 'THRESH_OTSU']
images = [image, gray_image, bw_image1, bw_image2, bw_image3, bw_image4, bw_image5, bw_image6]
for i in range(len(images)):
plt.subplot(2, 4, i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]), plt.yticks([])
plt.show()
opencv自带一种局部自适应阈值分割,个人比较推荐,对于局部细节要求比较高的场景,应用的效果还是非常不错的
import cv2 as cv
import matplotlib.pyplot as plt
image = cv.imread('./klay.jpg')
gray_image = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
# 255为设定的最大阈值, 制定的自适应算法 ADAPTIVE_THRESH_MEAN_C 或 ADAPTIVE_THRESH_GAUSSIAN_C
# 15 表示邻域块大小,计算区域阈值,一般为3,5,7,9...
# 5 计算阈值过程中的需要减去的常量
bw_image = cv.adaptiveThreshold(gray_image, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 15, 5) # 局部自适应二值化
cv.imshow('', bw_image)
cv.waitKey(0)
cv.destroyAllWindows()
可以看出自适应阈值算法的细节更加丰富,效果更好