影像二值化(Image Binarization)是將灰階影像中的像素值轉換為兩種顏色(通常是黑色和白色)的過程。這個技術將影像中的像素值與某個閾值比較,像素值大於閾值的部分被設定為白色(255),小於閾值的部分被設定為黑色(0)。二值化是影像處理中一個關鍵步驟,常用於簡化影像內容,使後續的分析(如物件檢測、邊緣檢測、形狀識別等)變得更高效。

影像二值化的應用

  1. 物件檢測:將物體從背景中分離,例如檢測條形碼、字元識別(OCR)。
  2. 邊緣檢測:簡化影像細節以強調邊界。
  3. 形狀分析:在工業檢測中,二值化常用於檢測產品缺陷或瑕疵。
  4. 模式識別:將手寫字體、印刷字體轉換成二值影像以便識別。

常用的二值化方法

  1. 全域閾值法(Global Thresholding): 最簡單的二值化方法,將影像中的所有像素與一個全局固定的閾值比較。OpenCV 中的 cv2.threshold() 函數可以輕鬆實現這一操作。

    import cv2
     
    # 讀取灰階影像
    img = cv2.imread('image.jpg', 0)
     
    # 設定閾值進行二值化
    _, binary_img = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
     
    # 顯示結果
    cv2.imshow('Binary Image', binary_img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
  2. 自適應閾值法(Adaptive Thresholding): 對於光照不均勻的影像,全域閾值法可能效果不佳。自適應閾值法會根據局部區域的像素分佈來動態決定閾值,適合處理光照條件變化較大的影像。

    # 使用自適應閾值法
    adaptive_img = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
  3. Otsu’s 二值化方法: Otsu’s 方法是一種自動確定全局閾值的方法,根據影像的直方圖來自動選擇最佳閾值,使前景與背景之間的區分最大化。這種方法在影像具有雙峰直方圖時效果特別好。

    # Otsu's 二值化
    _, otsu_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  4. 自定義閾值法: 如果需要更靈活的控制,可以根據具體應用自行設計閾值計算方法。例如,根據影像某部分的像素平均值或其他統計信息來動態設定閾值。

二值化的最佳實踐

  1. 影像預處理: 在進行二值化之前,對影像進行去噪、模糊處理或均衡化處理,能夠提升二值化的效果。例如,使用高斯模糊來去除細小噪點,使用直方圖均衡化來調整光照不均勻的影像。

    # 高斯模糊去噪
    blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
  2. 選擇合適的閾值方法

    • 如果影像光照條件一致且背景較簡單,全域閾值法即可。
    • 當影像光照條件不均勻時,選擇自適應閾值法Otsu’s 方法更為合適。
    • 如果影像存在多個對比明顯的區域,可以結合局部區域特徵來選擇自適應閾值法
  3. 結合多種方法進行二值化: 在一些複雜的場景下,可以將多種二值化方法結合使用。例如,先進行自適應閾值法,再對結果進行形態學處理(如膨脹、腐蝕)來提升結果質量。

    # 使用膨脹操作去除小黑點
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
    processed_img = cv2.morphologyEx(binary_img, cv2.MORPH_CLOSE, kernel)
  4. 形態學操作優化結果: 使用膨脹、腐蝕、開運算和閉運算等形態學操作來優化二值化後的影像,例如消除孤立的噪點或填補小洞。

  5. 動態調整閾值: 在實際應用中,影像的背景和前景可能隨時間或環境改變。因此,根據不同的影像情況自動或動態調整閾值是非常有必要的。

  6. 選擇適當的影像分辨率: 在處理高分辨率影像時,可以先將影像降采樣處理,然後進行二值化,這樣可以減少計算量。如果需要細節,可以在二值化後再進行超解析度復原。

影像二值化的一個範例

下面是一個範例展示如何使用 Otsu’s 方法和自適應閾值法來進行二值化處理:

import cv2
import numpy as np
 
# 讀取影像
img = cv2.imread('image.jpg', 0)
 
# 進行高斯模糊來去除噪點
blurred_img = cv2.GaussianBlur(img, (5, 5), 0)
 
# Otsu's 二值化
_, otsu_img = cv2.threshold(blurred_img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
 
# 自適應閾值法二值化
adaptive_img = cv2.adaptiveThreshold(blurred_img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2)
 
# 顯示結果
cv2.imshow('Otsu Binarization', otsu_img)
cv2.imshow('Adaptive Binarization', adaptive_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

結論

影像二值化是影像處理中的一個基礎且重要的步驟。正確的預處理和閾值方法選擇可以顯著提升二值化結果的質量。在實際應用中,結合多種技術並進行動態調整,能夠提高對各種影像的適應性。