本篇將介紹使用OpenCV Python對於圖像上的二值化操作,二值化主要用途包括圖像分割、物體偵測、文字識別等。這種轉換可以幫助檢測圖像中的物體或特定特徵,並提取有用的信息。透過程式碼的說明,讓各位了解OpenCV Python於圖像處理上的基本操作。
► 二值化定義
將一幅灰度圖像轉換為黑白圖像的過程。它的目標是將灰度圖像中的每個像素點分為兩個類別:一個是前景(通常是物體或感興趣的區域),另一個是背景。二值化後的圖像中只包含兩種值,通常是0和255(或1),分別表示黑色(背景)和白色(前景)。
►固定閾值二值化(Thresholding)
將圖像的每個像素值與一個固定閾值進行比較,將像素值分為兩個類別:大於閾值的設為一個值(通常是255),小於閾值的設為另一個值(通常是0)。
cv2.THRESH_BINARY |
# 如果大於 127 就等於 255,反之等於 0 |
cv2.THRESH_BINARY_INV |
# 如果大於 127 就等於 0,反之等於 255 |
cv2.THRESH_TRUNC |
# 如果大於 127 就等於 127,反之數值不變 |
cv2.THRESH_TOZERO |
# 如果大於 127 數值不變,反之數值等於 0 |
cv2.THRESH_TOZERO_INV |
# 如果大於 127 等於 0,反之數值不變 |
►自適應閾值二值化(Adaptive Thresholding)
自適應閾值二值化允許根據圖像的局部區域調整閾值。它將圖像分為許多小區域,並為每個區域自動計算閾值。這對於處理不均勻光照的圖像特別有用。
►Otsu's 二值化
►TRIANGLE 二值化
TRIANGLE 二值化是另一種自動選擇閾值的方法,通常適用於單峰分佈的圖像。它根據直方圖的形狀選擇閾值。
►選擇適當的二值化方法和閾值
在OpenCV中選擇適當的二值化方法和閾值通常取決於圖像特性和應用需求。
可以先分析圖像的特性
- 圖像的亮度分佈是單峰分佈還是多峰分佈?
- 圖像是否受到噪聲的影響?
- 圖像中的物體是深色物體對比亮背景,還是亮色物體對比暗背景?
- 如果圖像的亮度分佈相對均勻,可以使用固定閾值二值化進行二值化操作,通過觀察圖像直方圖來估計一個適當的閾值。
- 如果圖像的光照不均勻或受到陰影影響,可以使用自適應閾值二值化,自適應閾值二值化,可以在不同區域使用不同的閾值,以適應局部光照變化。
- 如果要自動選擇閾值,可以使用Otsu's 二值化或TRIANGLE 二值化方法根據圖像的灰度分佈自動選擇最佳閾值。
以上方的範例圖片進行直方圖顯示,範例圖片偏向單峰分佈,透過TRIANGLE 二值化可以很明顯的前後景區分出來。
►小結
透過以上講解,搭配程式碼進行範例講解,相信各位對於圖像上的二值化操作能有更深刻的理解,期待下一篇博文吧!
►Q&A
問題一:二值化為甚麼要灰度圖?
二值化通常應用在灰度圖像上,而不是彩色圖像,是因為灰度圖像只包含亮度信息,它是一種單通道圖像,每個像素點的值表示亮度強度,而不考慮顏色信息。在進行二值化時,我們主要關心的是像素的亮度值是否大於或小於閾值,因此使用灰度圖像更簡單且具有優勢。
問題二:在OpenCV中如何評估和調整二值化的效果?
可以使用OpenCV來將原始圖像、二值化結果和任何後處理的圖像進行可視化,以便比較和分析,或是透過評估指標IoU(Intersection over Union)或Dice係數,用於評估分割的準確性。
問題三:如何選擇適當的閾值和二值化方法?
選擇適當的閾值和二值化方法取決於影像的特性和應用需求。您可以通過觀察影像的直方圖來估計閾值,或者使用自適應閾值方法。不同的應用可能需要不同的閾值和二值化方法,您可以通過試驗不同的組合來找到最適合的選擇。
問題四:如何處理彩色影像的二值化?
對於彩色影像,通常需要將其轉換為灰度影像,然後進行二值化處理。可以使用cv2.cvtColor將彩色影像轉換為灰度影像,然後選擇適當的二值化方法進行處理。在某些情況下,也可以分別處理每個通道的灰度影像,然後組合它們以獲得最終的二值化結果。
問題五:自適應閾值二值化的優勢是什麼?
自適應閾值二值化能夠應對不同區域的光照變化,使閾值能夠根據局部影像特性自動調整。這使其適用於具有不均勻照明的影像,例如文件掃描或工業檢測。
►參考資料
評論