python實現opencv影象二值化
阿新 • • 發佈:2020-08-28
1.什麼是影象二值化
彩色影象: 有blue,green,red三個通道,取值範圍均為0-255
灰度圖:只有一個通道0-255,所以一共有256種顏色
二值影象:只有兩種顏色,黑色和白色,二值化就是把影象的畫素轉變為0或者255,只有這兩個畫素值。0白色 1黑色 。0是黑色,255是白色。
2.影象二值化
(1)先獲取閾值
(2)根據閾值去二值化圖
(3)threshold函式
原型:threshold(src,thresh,maxval,type,dst=None)。
作用:將影象的每個畫素點進行二值化。
引數:thresh,閾值(最小值)。maxval,二值化的最大取值。
type,二值化型別,一般設為0,也可以取以下的值:
(4)全域性閾值 -程式碼實現
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 #影象二值化 0白色 1黑色 7 #全域性閾值 8 def threshold_image(image): 9 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 10 cv.imshow("原來", gray) 11 12 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全域性自適應閾值 引數0可改為任意數字但不起作用 13 print("閾值:%s" % ret) 14 cv.imshow("OTSU", binary) 15 16 ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全域性自適應閾值, 引數0可改為任意數字但不起作用,適用於單個波峰 17 print("閾值:%s" % ret) 18 cv.imshow("TRIANGLE", binary) 19 20 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY)#自定義閾值為150,大於150的是白色 小於的是黑色 21 print("閾值:%s" % ret) 22 cv.imshow("自定義", binary) 23 24 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_BINARY_INV)# 自定義閾值為150,大於150的是黑色 小於的是白色 25 print("閾值:%s" % ret) 26 cv.imshow("自定義反色", binary) 27 28 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TRUNC)# 截斷 大於150的是改為150 小於150的保留 29 print("閾值:%s" % ret) 30 cv.imshow("截斷1", binary) 31 32 ret, binary = cv.threshold(gray, 150, 255, cv.THRESH_TOZERO)# 截斷 小於150的是改為150 大於150的保留 33 print("閾值:%s" % ret) 34 cv.imshow("截斷2", binary) 35 36 src = cv.imread("C://1.jpg") 37 threshold_image(src) 38 cv.waitKey(0) 39 cv.destroyAllWindows()
函式threshold()的引數說明:
cv.THRESH_BINARY | cv.THRESH_OTSU)#大律法,全域性自適應閾值 引數0可改為任意數字但不起作用
cv.THRESH_BINARY | cv.THRESH_TRIANGLE)#TRIANGLE法,,全域性自適應閾值, 引數0可改為任意數字但不起作用,適用於單個波峰
cv.THRESH_BINARY)# 自定義閾值為150,大於150的是白色 小於的是黑色
cv.THRESH_BINARY_INV)# 自定義閾值為150,大於150的是黑色 小於的是白色
cv.THRESH_TRUNC)# 截斷 大於150的是改為150 小於150的保留
cv.THRESH_TOZERO)# 截斷 小於150的是改為150 大於150的保留
(5)區域性閾值 -程式碼實現
1 #區域性閾值 2 def local_image(image): 3 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 4 cv.imshow("原來", gray) 5 binary1 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_MEAN_C, cv.THRESH_BINARY, 25, 10) #blocksize必須為奇數 6 cv.imshow("區域性1", binary1) 7 binary2 = cv.adaptiveThreshold(gray, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)#高斯處理 8 cv.imshow("區域性2", binary2)
(6)自己計算閾值-程式碼實現
1 # -*- coding=GBK -*- 2 import cv2 as cv 3 import numpy as np 4 5 6 #求出影象均值作為閾值來二值化 7 def custom_image(image): 8 gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY) 9 cv.imshow("原來", gray) 10 h, w = gray.shape[:2] 11 m = np.reshape(gray, [1, w*h])#化為一維陣列 12 mean = m.sum() / (w*h) 13 print("mean: ", mean) 14 ret, binary = cv.threshold(gray, mean, 255, cv.THRESH_BINARY) 15 cv.imshow("二值", binary) 16 17 18 src = cv.imread("C://1.jpg") 19 custom_image(src) 20 cv.waitKey(0) 21 cv.destroyAllWindows()
參考: