在什麼情境下會用到二值化影像呢?,在影像處理中,我們想要求一些特定的數值,例如圓的直徑,或物體的尺寸,等等。
黑為0,白為1
cv2.threshold
是OpenCV 中用於影像二值化的函式retval, threshold_image = cv2.threshold(src, thresh, maxval, type[, dst])
src
: 輸入的灰度影像,即要進行二值化處理的原始影像。thresh
: 二值化的閾值,超過這個閾值的像素值將被分為高於閾值或低於閾值的兩個類別,具體取值根據不同的應用需求。maxval
: 超過閾值的像素值將被賦予的新值,通常是最大值,例如 255(白色)。type
: 二值化操作的類型,有不同的選項,例如:cv2.THRESH_BINARY:
大於閾值的像素賦予 maxval,小於閾值的像素賦予 0。cv2.THRESH_BINARY_INV:
與 cv2.THRESH_BINARY 相反,大於閾值的像素賦予 0,小於閾值的像素賦予 maxval。cv2.THRESH_TRUNC:
大於閾值的像素賦予閾值,小於閾值的像素保持不變。cv2.THRESH_TOZERO:
大於閾值的像素保持不變,小於閾值的像素賦予 0。cv2.THRESH_TOZERO_INV
: 與 cv2.THRESH_TOZERO 相反,大於閾值的像素賦予 0,小於閾值的像素保持不變。dst
(選用): 輸出的二值化影像。如果未提供,則函數會修改 src
本身。cv2.threshold
的返回值 retval
是實際使用的閾值,根據不同的二值化方法,retval
可能與指定的閾值 thresh
有所不同。threshold_image
則是二值化後的影像
在這個例子中,我們使用 cv2.THRESH_BINARY
進行二值化,閾值 thresh_value
為 128,大於 128 的像素賦予 255(白色),小於等於 128 的像素賦予 0(黑色)。
import cv2
# 讀取灰度影像
image = cv2.imread('path/to/your/image.jpg', cv2.IMREAD_GRAYSCALE)
# 二值化
thresh_value = 128
_, binary_image = cv2.threshold(image, thresh_value, 255, cv2.THRESH_BINARY)
# 顯示原始影像和二值化後的影像
cv2.imshow('Original Image', image)
cv2.imshow('Binary Image', binary_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
Otsu's 方法是一種自動計算二值化閾值的算法,它基於影像的灰度分佈,試圖找到一個最佳的閾值,以最大程度地區分前景和背景。
cv2.THRESH_OTSU
被用於 cv2.threshold
函數的 type
參數中。這樣,閾值 thresh
的值將根據 Otsu's 方法自動計算
# 使用 Otsu's 方法進行自動二值化
_, binary_image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
在使用 cv2.THRESH_OTSU
時,你無需手動指定閾值 thresh
,而是將 thresh
參數設為 0。cv2.threshold
函數會根據 Otsu's 方法計算最適合的閾值。