cv2.threshold()函數的作用是將一幅灰度圖二值化,基本用法如下:
#ret:暫時就認為是設定的thresh閾值,mask:二值化的圖像
ret,mask = cv2.threshold(img2gray,175,255,cv2.THRESH_BINARY)
plt.imshow(mask,cmap='gray')
上面代碼的作用是,將灰度圖img2gray中灰度值小於175的點置0,灰度值大於175的點置255。
具體用法如下:
threshold(src, thresh, maxval, type[, dst])->ret,dst
src::灰度圖
thresh:閾值
maxval:最大值
type:閾值類型
對於最后一個參數,常見的閾值類型有:
THRESH_BINARY=0,THRESH_BINARY_INV,THRESH_TRUNC,THRESH_TOZERO,THRESH_TOZERO_INV,THRESH_OTSU,THRESH_TRIANGLE,THRESH_MASK
他們的作用參見下表:
threshold函數有兩個返回值,其中第二個返回值(這里是mask)是二值化后的灰度圖。當我們指定了閾值參數thresh,第一個返回值ret就是我們指定的thresh。換句話說,我們可以不指定閾值參數thresh。
通常情況,我們一般不知道設定怎樣的閾值thresh才能得到比較好的二值化效果,只能去試。如對於一幅雙峰圖像(理解為圖像直方圖中存在兩個峰),我們指定的閾值應盡量在兩個峰之間的峰谷。這時,就可以用第四個參數THRESH_OTSU,它對一幅雙峰圖像自動根據其直方圖計算出合適的閾值(對於非雙峰圖,這種方法得到的結果可能不理想)。
對於雙峰圖,我們需要多傳入一個參數cv2.THRESH_OTSU,並且把閾值thresh設為0,算法會找到最優閾值,並作為第一個返回值ret返回。
cv2.THRESH_OTSU參數用法如下: