Python OpenCV 影像處理:影像二值化

► 前言

本篇將介紹使用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中選擇適當的二值化方法和閾值通常取決於圖像特性和應用需求。

可以先分析圖像的特性

  • 圖像的亮度分佈是單峰分佈還是多峰分佈?
  • 圖像是否受到噪聲的影響?
  • 圖像中的物體是深色物體對比亮背景,還是亮色物體對比暗背景?
  1. 如果圖像的亮度分佈相對均勻,可以使用固定閾值二值化進行二值化操作,通過觀察圖像直方圖來估計一個適當的閾值。
  2. 如果圖像的光照不均勻或受到陰影影響,可以使用自適應閾值二值化,自適應閾值二值化,可以在不同區域使用不同的閾值,以適應局部光照變化。
  3. 如果要自動選擇閾值,可以使用Otsu's 二值化或TRIANGLE 二值化方法根據圖像的灰度分佈自動選擇最佳閾值。

以上方的範例圖片進行直方圖顯示,範例圖片偏向單峰分佈,透過TRIANGLE 二值化可以很明顯的前後景區分出來。





小結

透過以上講解,搭配程式碼進行範例講解,相信各位對於圖像上的二值化操作能有更深刻的理解,期待下一篇博文吧!

Q&A

 問題一:二值化為甚麼要灰度圖?

二值化通常應用在灰度圖像上,而不是彩色圖像,是因為灰度圖像只包含亮度信息,它是一種單通道圖像,每個像素點的值表示亮度強度,而不考慮顏色信息。在進行二值化時,我們主要關心的是像素的亮度值是否大於或小於閾值,因此使用灰度圖像更簡單且具有優勢。

問題二:在OpenCV中如何評估和調整二值化的效果?

可以使用OpenCV來將原始圖像、二值化結果和任何後處理的圖像進行可視化,以便比較和分析,或是透過評估指標IoU(Intersection over Union)或Dice係數,用於評估分割的準確性。

問題三:如何選擇適當的閾值和二值化方法?

選擇適當的閾值和二值化方法取決於影像的特性和應用需求。您可以通過觀察影像的直方圖來估計閾值,或者使用自適應閾值方法。不同的應用可能需要不同的閾值和二值化方法,您可以通過試驗不同的組合來找到最適合的選擇。

問題四:如何處理彩色影像的二值化?

對於彩色影像,通常需要將其轉換為灰度影像,然後進行二值化處理。可以使用cv2.cvtColor將彩色影像轉換為灰度影像,然後選擇適當的二值化方法進行處理。在某些情況下,也可以分別處理每個通道的灰度影像,然後組合它們以獲得最終的二值化結果。

問題五:自適應閾值二值化的優勢是什麼?

自適應閾值二值化能夠應對不同區域的光照變化,使閾值能夠根據局部影像特性自動調整。這使其適用於具有不均勻照明的影像,例如文件掃描或工業檢測。


參考資料    

OpenCV - Open Computer Vision Library

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論