影像二值化(Image Thresholding)是一種將灰階影像轉換為黑白影像的技術,常用於分離前景與背景,便於後續影像分析或物體偵測。
核心原理是設定閾值(threshold):
- 大於閾值的像素設為白色(255)
- 小於閾值的像素設為黑色(0)
常見方法包括:
請準備一張灰階圖片 image.jpg
,並放在程式同一資料夾。
import cv2
img = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE)
cv2.imshow('Original', img)
# 將以下程式碼放在所有顯示語句的最後面
cv2.waitKey()
cv2.destroyAllWindows()
使用 cv2.threshold()
設定固定閾值進行二值化。
# 固定閾值 127
ret, thresh_simple = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
cv2.imshow('Simple Threshold', thresh_simple)
cv2.threshold(src, thresh, maxval, type)
效果示意:可獲得黑白分明的二值影像
對於光照不均的影像,固定閾值容易失效,自適應閾值可根據鄰域自動計算閾值。
# 自適應閾值 - 高斯方法
thresh_adapt = cv2.adaptiveThreshold(img, 255,
cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
cv2.THRESH_BINARY, 11, 2)
cv2.imshow('Adaptive Threshold', thresh_adapt)
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
效果示意:即使光照不均,仍能得到清晰的二值化影像
Otsu 方法會自動計算最佳閾值,使類內方差最小化,提升分割效果。
ret2, thresh_otsu = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
cv2.imshow('Otsu Threshold', thresh_otsu)
效果示意:可自動選擇最佳閾值,分離前景與背景
方法 | 優點 | 缺點 |
---|---|---|
Simple Threshold | 簡單快速 | 光照不均失效 |
Adaptive Threshold | 可處理光照不均影像 | 計算較慢,需調整參數 |
Otsu Threshold | 自動計算最佳閾值 | 對多峰影像可能失效 |
影像二值化是圖像處理與分析的基礎技術,廣泛應用於文字分割、物體檢測、邊緣提取等場景。選擇合適的方法並調整參數,可有效分離前景與背景,提升後續處理的精度。