OpenCV_Python —— (7)二值化Thresholding

二值化就是把圖片傳換成只有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()

在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章