__author__ = "WSX" import cv2 as cv import numpy as np #-----------二值化(黑0和白 255)------------- #二值化的方法(全局閾值 局部閾值(自適應閾值)) # OTSU #cv.THRESH_BINARY 二值化 #cv.THRESH_BINARY_INV(黑白調換) #cv.THRES_TRUNC 截斷 def threshold(img): #全局閾值 gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY) #首先變為灰度圖 ret , binary = cv.threshold( gray , 0, 255 , cv.THRESH_BINARY |cv.THRESH_OTSU)#cv.THRESH_BINARY |cv.THRESH_OTSU 根據THRESH_OTSU閾值進行二值化 cv.THRESH_BINARY_INV(黑白調換) #上面的0 為閾值 ,當cv.THRESH_OTSU 不設置則 0 生效 #ret 閾值 , binary二值化圖像 print("閾值:", ret) cv.imshow("binary", binary) def own_threshold(img): #自己設置閾值100 全局 gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY) #首先變為灰度圖 ret , binary = cv.threshold( gray , 100, 255 , cv.THRESH_BINARY )#cv.THRESH_BINARY |cv.THRESH_OTSU 根據THRESH_OTSU閾值進行二值化 #上面的0 為閾值 ,當cv.THRESH_OTSU 不設置則 0 生效 #ret 閾值 , binary二值化圖像 print("閾值:", ret) cv.imshow("binary", binary) def local_threshold(img): #局部閾值 gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY) #首先變為灰度圖 binary = cv.adaptiveThreshold( gray ,255 , cv.ADAPTIVE_THRESH_GAUSSIAN_C , cv.THRESH_BINARY, 25 , 10,)#255 最大值 #上面的 有兩種方法ADAPTIVE_THRESH_GAUSSIAN_C (帶權重的均值)和ADAPTIVE_THRESH_MEAN_C(和均值比較) #blockSize 必須為奇數 ,c為常量(每個像素塊均值 和均值比較 大的多余c。。。少於c) #ret 閾值 , binary二值化圖像 cv.imshow("binary", binary) def custom_threshold(img): #自己計算均值二值化 gray = cv.cvtColor(img , cv.COLOR_BGR2GRAY) #首先變為灰度圖 h ,w = gray.shape[:2] m = np.reshape( gray ,[1 ,w+h]) mean = m.sum() / w*h #求出均值 binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY ) cv.imshow("binary", binary) def main(): img = cv.imread("1.JPG") cv.namedWindow("Show", cv.WINDOW_AUTOSIZE) cv.imshow("Show", img) #own_threshold(img) own_threshold(img) cv.waitKey(0) cv.destroyAllWindows() main()