OpenCV:固定阈值分割、自动阈值分割
固定阈值分割
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('影子.jpg', 0) #0表示读取为灰度图
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度图
'''
对像素数量进行统计
1:输入图像.2。待计算的通道;3.Mask,没使用,用None;4.横坐标份数;5.要统计的像素范围
'''
hist = cv2.calcHist([img], [0], None, [256], [0, 300])
plt.plot(hist)
plt.show()
'''固定阈值分割'''
r1, img1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY) #大于阈值变为255,小于阈值变为0
r2, img2 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV) #大于阈值变为0,小于阈值变为255
r3, img3 = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC) #大于阈值变为阈值,小于阈值保持不变
r4, img4 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO) #大于阈值保持不变,小于阈值变为0
r5, img5 = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV) #大于阈值变为0,小于阈值保持不变
cv2.imshow('原图', img)
cv2.imshow('大于阈值变为255', img1)
cv2.imshow('大于阈值变为0', img2)
cv2.imshow('大于阈值变为阈值', img3)
cv2.imshow('大于阈值保持不变', img4)
cv2.imshow('小于阈值保持不变', img5)
cv2.waitKey(0)
cv2.destroyAllWindows()
自动阈值分割
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('影子.jpg', 0) #0表示读取为灰度图
# img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) #灰度图
'''自动阈值分割 :自适应阈值法、Otsu大津法'''
img_Z_M = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 9, 4)
img_Z_G = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 9, 4)
'''cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
src:输入图像
maxValue:最大阈值,一般为255
adaptiveMethod:小区域阈值计算方法
cv2.ADAPTIVE_THRESH_MEAN_C:小区域平均值
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:小区域通过高斯核加权求和
thresholdType:方式,同上5种
blockSize:小区域面积,奇数。例:5代表5*5
C:小区域阈值计算值减去此值为最终阈值结果
'''
'''cv2.THRESH_OTSU;大津法'''
r_D, img_D = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
img_G = cv2.GaussianBlur(img, (3, 3), 0)
r_G_D, img_G_D = cv2.threshold(img_G, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) #0为初始阈值,从0开始计算
cv2.imshow('原图', img)
cv2.imshow('自适应阈值(均值)', img_Z_M)
cv2.imshow('自适应阈值(高斯)', img_Z_G)
cv2.imshow('大津法', img_D)
cv2.imshow('高斯大津法', img_G_D)
hist_0 = cv2.calcHist([img], [0], None, [256], [0, 300])
hist_1 = cv2.calcHist([img_G], [0], None, [256], [0, 300])
plt.subplot(2, 1, 1)
plt.plot(hist_0, 'b')
plt.subplot(2, 1, 2)
plt.plot(hist_1, 'r')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
https://www.bilibili.com/video/BV1vr4y1E7fW/?spm_id_from=333.788&vd_source=b89ce2a9b55dab86caa0ee60b66c9f86
https://www.bilibili.com/video/BV1pB4y1p7Ak/?p=15&spm_id_from=pageDriver&vd_source=b89ce2a9b55dab86caa0ee60b66c9f86