主要讨论阈值分割问题。
目标
-
了解并会使用固定阈值、自适应阈值和Otsu阈值法"二值化"图像
-
学习OpenCV函数:
cv2.threshold()
,cv2.adaptiveThreshold()
import cv2
import matplotlib.pyplot as plt
import argparse
ap = argparse.ArgumentParser()
ap.add_argument("-i","--image",required =True, help="Path to the image")
args = vars(ap.parse_args())
image = cv2.imread(args["image"],0)
# img=cv2.imread('gradient.jpg',0)
ret,th=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
cv2.imshow('thres',th)
cv2.waitKey(0)
#cv2.threshold(src_gray,dst,threshold_value,max_BINARY,threshold_type)
#Src_gray:输入的灰度图像地址
#dst 输出图像的地址
#threshold_value 进行阈值操作时阈值的大小
#max_BINARY_value 设定的最大灰度值
#threshold_type 阈值的类型
ret,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
ret,th2=cv2.threshold(img,127,255,cv2.THRESH_BINARY_INV)
ret,th3=cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
ret,th4=cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
ret,th5=cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
titles=['Original','BINARY','BINARY_INV','TRUNC','TOZERO','TO_ZERO_INV']
images=[img,th1,th2,th3,th4,th5]
for i in range(6):
plt.subplot(2,3,i+1)
plt.imshow(images[i],'gray')
plt.title(titles[i],fontsize=8)
plt.xticks([])
plt.yticks([])
plt.show()
#cv2.adaptiveTreshold(image,max_BINARY,Adaptive_Method,threshold_type,Block_Size,C)
#max_BINARY_value 设定最大灰度值
#threshold_type 阈值的类型
#adaptive method 制定计算阈值的方法
#block_size 领域的大小
#c 常熟,阈值就等于的平均值或者平均值减去这个常数
#这个值是一个从平均值中减去的整数,使得我们可以微调我们的阈值
# img=cv2.imread('sudoku.jpg',0)
ret,th1=cv2.threshold(img,127,255,cv2.THRESH_BINARY)
print(ret)
th2=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,4)
th3=cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,17,6)
titles=['Original','Global(v=127','Adaptive Mean','Adaptive_Gaussian']
images=[img,th1,th2,th3]
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.title(titles[i],fontsize=8)
plt.xticks([])
plt.yticks([])
plt.show()
#Otsu
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
plt.subplot(131), plt.imshow(image, "gray")
plt.title("source image"), plt.xticks([]), plt.yticks([])
plt.subplot(132), plt.hist(image.ravel(), 256)
plt.title("Histogram"), plt.xticks([]), plt.yticks([])
ret1, th1 = cv2.threshold(gray, 0, 255, cv2.THRESH_OTSU) #方法选择为THRESH_OTSU
plt.subplot(133), plt.imshow(th1, "gray")
plt.title("OTSU,threshold is " + str(ret1)), plt.xticks([]), plt.yticks([])
plt.show()
注意:这里的ret值是一样的。