二值化就是把圖片傳換成只有white和black這兩種顏色。通過Thresholding,可以讓圖片中感興趣的顏色變成主角–white,其餘的顏色全部隱藏–black。另外,二值化後的圖片也便於計算機進行分析,因爲邊緣輪廓十分清晰,所以計算機可以輕鬆找到邊界線。然而,在找邊界這方面,Thresholding並不是特別好的算法,有些時候遇到某些特殊圖片效果也不好。
# 需要轉換成灰度圖才能二值化
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
5種二值化方式
# 返回值:
# ret1:閾值的大小
# thresh1 二值化後的圖
# 輸入參數:
# 輸入圖像
# 閾值
# 閾值後的最大值
# 閾值化方法
ret1,thresh1 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)
ret2,thresh2 = cv2.threshold(gray,127,255,cv2.THRESH_BINARY_INV)
ret3,thresh3 = cv2.threshold(gray,127,255,cv2.THRESH_TRUNC)
ret4,thresh4 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
ret5,thresh5 = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO_INV)
自動選擇閾值Otsu’s Method
ret1,thresh1 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY | cv2.THRESH_OTSU)
ret2,thresh2 = cv2.threshold(gray,0,255,cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)
自適應閾值 Adaptive Thresholding
在前面的部分我們使用是全局閾值,整幅圖像採用同一個數作爲閾值。當時這種方法並不適應與所有情況,尤其是當同一幅圖像上的不同部分的具有不同亮度時。這種情況下我們需要採用自適應閾值。此時的閾值是根據圖像上的每一個小區域計算與其對應的閾值。因此在同一幅圖像上的不同區域採用的是不同的閾值,從而使我們能在亮度不同的情況下得到更好的結果。
Adaptive Method- 指定計算閾值的方法。 |
---|
cv2.ADPTIVE_THRESH_MEAN_C:閾值取自相鄰區域的平均值 |
cv2.ADPTIVE_THRESH_GAUSSIAN_C:閾值取值相鄰區域的加權和,權重爲一個高斯窗口。 |
• Block Size - 鄰域大小(用來計算閾值的區域大小)。 |
• C - 這就是是一個常數,閾值就等於平均值或者加權平均值減去這個常數。 |
# 變灰度圖
image = cv2.cvtColor(image,cv2.COLOR_RGB2GRAY)
# 中值濾波
image = cv2.medianBlur(image,5)
# 普通二值化
ret,th1 = cv2.threshold(image,127,255,cv2.THRESH_BINARY)
# 平均值閾值
th2 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,11,3)
# 高斯閾值
th3 = cv2.adaptiveThreshold(image,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,11,3)
titles = ['original', 'Global Thresholding', 'Adaptive Mean Thresholding', 'Adaptive Gaussian Thresholding']
images = [image, th1, th2, th3]
plt.figure(figsize=(10,5))
for i in range(4):
plt.subplot(2,2,i+1)
plt.imshow(images[i],'gray')
plt.axis('off')
plt.title(titles[i])
plt.show()