一:什么是二值圖像
彩色圖像:三個通道0-255,0-255,0-255,所以可以有2^24位空間 灰度圖像:一個通道0-255,所以有256種顏色 二值圖像:只有兩種顏色,黑和白,1白色,0黑色
二:圖像二值化
(一)先獲取閾值
(二)根據閾值去二值化圖像
(三)OpenCV中的二值化方法
四)補充閾值類型
原灰度圖像的像素值
1.THRESH_BINARY:過門限的值為最大值,其他值為0
2.THRESH_BINARY_INV:過門限的值為0,其他值為最大值
3.THRESH_TRUNC:過門限的值為門限值,其他值不變
4.THRESH_TOZERO:過門限的值不變,其他設置為0
5.THRESH_TOZERO_INV:過門限的值為0,其他不變
三:代碼實現全局閾值
cv.threshold( src, thresh, maxval, type[, dst] )
參數說明:
src:原圖像。
dst:結果圖像。
thresh:當前閾值。
maxVal:最大閾值,一般為255.
thresholdType:閾值類型,主要有下面幾種:
1 enum ThresholdTypes { 2 THRESH_BINARY = 0, 3 THRESH_BINARY_INV = 1, 4 THRESH_TRUNC = 2, 5 THRESH_TOZERO = 3, 6 THRESH_TOZERO_INV = 4, 7 THRESH_MASK = 7, 8 THRESH_OTSU = 8, 9 THRESH_TRIANGLE = 16 10 };
(一)全局閾值使用THRESH_OTSU大津法
1 def threshold_demo(image): 2 gray = cv.cvtColor(image,cv.COLOR_RGB2GRAY) #要二值化圖像,要先進行灰度化處理 3 ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_OTSU) 4 print("threshold value: %s"%ret) #打印閾值,前面先進行了灰度處理0-255,我們使用該閾值進行處理,低於該閾值的圖像部分全為黑,高於該閾值則為白色 5 cv.imshow("binary",binary) #顯示二值化圖像
threshold value: 140.0 #獲取的閾值是140
(二)全局閾值使用THRESH_TRIANGLE(三角形算法)
ret, binary = cv.threshold(gray,0,255,cv.THRESH_BINARY | cv.THRESH_TRIANGLE)
threshold value: 67.0
(三)上面使用大津法和三角形算法都是自動去獲取閾值,下面我們自己直接指定閾值
(1)THRESH_BINARY_INV大於閾值的都為0
ret, binary = cv.threshold(gray,127,255,cv.THRESH_BINARY_INV)
threshold value: 127.0
(2)THRESH_TRUNC截斷大於127的值都為127
ret, binary = cv.threshold(gray,127,255,cv.THRESH_TRUNC)
(3)THRESH_TOZERO小於閾值的都為0和(1)相反
ret, binary = cv.threshold(gray,127,255,cv.THRESH_TOZERO)