1.什么是圖像二值化
彩色圖像: 有blue,green,red三個通道,取值范圍均為0-255
灰度圖:只有一個通道0-255,所以一共有256種顏色
二值圖像:只有兩種顏色,黑色和白色,二值化就是把圖像的像素轉變為0或者255,只有這兩個像素值。0白色 1黑色 。0是黑色,255是白色。
2.圖像二值化
(1)先獲取閾值
(2)根據閾值去二值化圖
(3)threshold函數
ret, dst = cv2.threshold(src, thresh, maxval, type)
- src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
- dst: 輸出圖
- thresh: 閾值
- maxval: 當像素值超過了閾值(或者小於閾值,根據type來決定),所賦予的值
- type:二值化操作的類型,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
(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)局部閾值 -代碼實現
自適應閾值二值化函數根據圖片一小塊區域的值來計算對應區域的閾值,從而得到也許更為合適的圖片。
dst = cv2.adaptiveThreshold(src, maxval, thresh_type, type, Block Size, C)
- src: 輸入圖,只能輸入單通道圖像,通常來說為灰度圖
- dst: 輸出圖
- maxval: 當像素值超過了閾值(或者小於閾值,根據type來決定),所賦予的值
- thresh_type: 閾值的計算方法,包含以下2種類型:cv2.ADAPTIVE_THRESH_MEAN_C; cv2.ADAPTIVE_THRESH_GAUSSIAN_C.
- type:二值化操作的類型,與固定閾值函數相同,包含以下5種類型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV.
- Block Size: 圖片中分塊的大小,必須為奇數
- C :閾值計算方法中的常數項
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)自己計算閾值-代碼實現
圖像的長寬以及灰度、RGB圖像的像素原理分布
https://blog.csdn.net/qq_29540745/article/details/70256722
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://www.cnblogs.com/ssyfj/p/9272615.html