1.二值化处理
# 手动二值化处理
# 设置阈值大小 threshold
thresh = 125
# 设置超过阈值像素值的最大值
maxval = 255
# THRESH_BINARY:超过阈值为maxval,否则为0
# THRESH_BINARY_INV:超过阈值为0,否则为maxval(相当于上个参数取反)
# THRESH_TRUNC:超过阈值为thresh,低于阈值灰度值不变
# THRESH_TOZERO:超过阈值灰度值不变,否则为0
# THRESH_TOZERO_INV:超过阈值为0,低于阈值灰度值不变
ret, thresh1 = cv2.threshold(img, thresh, maxval, cv2.THRESH_BINARY)
ret, thresh2 = cv2.threshold(img, thresh, maxval, cv2.THRESH_BINARY_INV)
ret, thresh3 = cv2.threshold(img, thresh, maxval, cv2.THRESH_TRUNC)
ret, thresh4 = cv2.threshold(img, thresh, maxval, cv2.THRESH_TOZERO)
ret, thresh5 = cv2.threshold(img, thresh, maxval, cv2.THRESH_TOZERO_INV)
titles = ['original image', 'Binary', 'binary-inv', 'trunc', 'tozero', 'tozero-inv']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
plt.subplot(2, 3, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()
2.自动二值化处理
img2 = cv2.imread('002.tif', 0)
# rows, cols = img2.shape
# Otsu阈值
ret1, thresh1 = cv2.threshold(img, 0, 255, cv2.THRESH_OTSU)
# Otsu可与其他二值化方式一起使用
ret2, thresh2 = cv2.threshold(blur, 0, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
# # Triangle阈值-很少用到
# ret3, thresh3 = cv2.threshold(img2, 0, 255, cv2.THRESH_TRIANGLE)
# ret4, thresh4 = cv2.threshold(blur, 0, 255, cv2.THRESH_TRIANGLE)
titles = ['original image', "Otsu's", "Otsu's+Binary"] # "Triangle", "Triangle-Otsu's"
images = [img, thresh1, thresh2] # thresh3, thresh4
for i in range(3):
plt.subplot(1, 3, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()
3.自适应二值化
# maxval为像素值的最大值默认设为255
# blockSize为计算像素阈值的像素邻域的大小:3、5、7。。。。、99
# C为从平均值或加权平均值中减去常数,一般设置为0-50
blockSize = 25
C = 5
# 高斯BINARY
thresh1 = cv2.adaptiveThreshold(img2, maxval, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, blockSize, C)
# 高斯BINARY_INV
thresh2 = cv2.adaptiveThreshold(img2, maxval, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, blockSize, C)
# 平均BINARY
thresh3 = cv2.adaptiveThreshold(img2, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, blockSize, C)
# 平均BINARY_INV
thresh4 = cv2.adaptiveThreshold(img2, maxval, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY_INV, blockSize, C)
titles = ['original image', "gaussian binary", "gaussian binary_inv", "mean binary", "mean binary_inv"]
images = [img2, thresh1, thresh2, thresh3, thresh4]
for i in range(5):
plt.subplot(2, 3, i+1)
plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([])
plt.yticks([])
plt.show()