1. 程式人生 > 實用技巧 >python實現opencv影象二值化

python實現opencv影象二值化

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()

參考:

https://blog.csdn.net/u011321546/article/details/79593195

https://blog.csdn.net/Vici__/article/details/100714822#15%E3%80%81%E4%BA%8C%E5%80%BC%E5%8C%96%EF%BC%88cv2.threshold%EF%BC%89

https://www.cnblogs.com/ssyfj/p/9272615.html