什麼是圖像二值化?¶
圖像二值化是將圖像中的像素點根據閾值分爲兩類(通常是黑色和白色),使圖像僅保留黑白兩種顏色的處理過程。例如,一張照片經過二值化後,可能只剩下“文字”和“背景”的黑白對比,這種簡化能極大降低後續圖像分析的複雜度,常用於文字識別、形狀檢測等場景。
爲什麼需要二值化?¶
- 簡化圖像:去除中間灰度,只保留黑白信息,減少計算量。
- 突出特徵:讓目標區域(如文字、物體輪廓)與背景形成強烈對比,便於後續處理(如邊緣檢測、形狀識別)。
準備工作:安裝與導入庫¶
首先確保已安裝OpenCV和NumPy庫:
pip install opencv-python numpy
導入所需庫:
import cv2
import numpy as np
核心步驟:圖像二值化的實現¶
二值化處理的核心是cv2.threshold()函數,語法如下:
ret, thresh = cv2.threshold(gray, thresh_value, max_value, threshold_type)
gray:輸入圖像(必須是灰度圖)。thresh_value:手動設定的閾值(0-255)。max_value:超過閾值後像素的賦值(通常爲255,即白色)。threshold_type:閾值類型(如二值化、反二值化等)。- 返回值:
ret爲實際使用的閾值,thresh爲處理後的二值化圖像。
常用閾值類型及效果¶
threshold_type參數決定了像素的分類規則,常見類型如下:
1. cv2.THRESH_BINARY:
像素值 > 閾值 → 白色(255);否則 → 黑色(0)。
公式:thresh = 255 if pixel > thresh_value else 0
-
cv2.THRESH_BINARY_INV:
像素值 > 閾值 → 黑色(0);否則 → 白色(255)。
公式:thresh = 0 if pixel > thresh_value else 255 -
cv2.THRESH_OTSU:
自動計算最優閾值(無需手動設定thresh_value),適用於背景與目標亮度差異大的圖像。需與其他類型結合使用(如THRESH_BINARY + THRESH_OTSU)。
代碼實戰:從圖像讀取到二值化¶
以一張簡單的灰度圖爲例(若沒有圖像,可用手機拍攝一張黑白對比明顯的圖片,如硬幣、文字等):
# 1. 讀取圖像並轉爲灰度圖
img = cv2.imread("test.jpg") # 替換爲你的圖像路徑(如"coin.jpg")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 轉爲灰度圖(OpenCV默認讀取BGR格式)
# 2. 手動閾值二值化(閾值設爲127)
ret, thresh_binary = cv2.threshold(
gray,
thresh_value=127, # 手動閾值(可根據圖像調整)
max_value=255,
threshold_type=cv2.THRESH_BINARY # 二值化類型
)
# 3. Otsu自動閾值二值化(無需手動設閾值)
ret_otsu, thresh_otsu = cv2.threshold(
gray,
thresh_value=0, # 設爲0時,Otsu自動計算閾值
max_value=255,
threshold_type=cv2.THRESH_BINARY + cv2.THRESH_OTSU # 結合Otsu算法
)
# 4. 顯示結果(用matplotlib更直觀)
import matplotlib.pyplot as plt
plt.figure(figsize=(12, 4))
plt.subplot(131), plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)), plt.title("原圖")
plt.subplot(132), plt.imshow(thresh_binary, cmap="gray"), plt.title("手動閾值(127)")
plt.subplot(133), plt.imshow(thresh_otsu, cmap="gray"), plt.title("Otsu自動閾值")
plt.show()
關鍵細節:閾值的選擇¶
- 手動閾值:若圖像亮度均勻,可嘗試
thresh_value=127(默認中間值),但需根據圖像調整(如暗圖像可能設爲50,亮圖像設爲200)。 - Otsu自動閾值:無需手動調參,適合背景與目標對比度高的場景(如文字、證件照)。
擴展:自適應閾值(處理光照不均)¶
若圖像中不同區域亮度差異大(如光照不均的照片),全局閾值效果差,需用自適應閾值:
thresh_adaptive = cv2.adaptiveThreshold(
gray,
max_value=255,
adaptive_method=cv2.ADAPTIVE_THRESH_MEAN_C, # 鄰域均值作爲閾值
threshold_type=cv2.THRESH_BINARY,
block_size=11, # 鄰域大小(必須爲奇數,如11、15)
C=2 # 鄰域均值減去2作爲最終閾值
)
總結¶
圖像二值化是圖像處理的基礎操作,通過cv2.threshold()可快速實現。關鍵步驟是:
1. 讀取圖像並轉灰度;
2. 選擇閾值類型(手動/Otsu/自適應);
3. 應用二值化並顯示結果。
掌握二值化後,可進一步用於邊緣檢測、文字識別、目標分割等更復雜的計算機視覺任務。
課後練習:嘗試用不同閾值類型處理同一張圖像,觀察效果差異;用Otsu方法處理一張光照不均的照片,對比手動閾值的結果。