文章目錄
- @[toc]
- 1 基本概念
- 2 簡單閾值處理`cv2.threshold`
- 3 自適應閾值處理`cv2.adaptiveThreshold`
文章目錄
- @[toc]
- 1 基本概念
- 2 簡單閾值處理`cv2.threshold`
- 3 自適應閾值處理`cv2.adaptiveThreshold`
更多精彩內容 |
---|
👉內容導航 👈 |
👉OpenCV開發 👈 |
1 基本概念
圖像閾值處理(Thresholding)是圖像處理中的一種基本技術,用于將灰度圖像轉換為二值圖像。通過設定一個閾值,將圖像中的像素分為兩類:高于閾值的像素和低于閾值的像素。
使用場景
- 文檔圖像二值化
- 圖像分割預處理
- OCR 前處理
- 去除圖像噪聲
- 目標檢測預處理
2 簡單閾值處理cv2.threshold
cv2.threshold
輸入圖像:必須為單通道,若為彩色圖像需先轉換為灰度
函數定義
retval, dst = cv2.threshold(src, thresh, maxval, type)
參數詳解
-
src
(輸入圖像)- 類型:單通道灰度圖像(如
cv2.COLOR_BGR2GRAY
轉換后的圖像)。 - 作用:待處理的輸入圖像,必須為 8-bit 或 32-bit 浮點型。
- 類型:單通道灰度圖像(如
-
thresh
(閾值)- 類型:
float
或int
。 - 作用:用于與像素值比較的閾值。若像素值大于
thresh
,則根據type
參數處理。
- 類型:
-
maxval
(最大值)- 類型:
float
或int
。 - 作用:當像素值滿足閾值條件時,賦予的新值(僅對部分
type
有效)。
- 類型:
-
type
(閾值類型)-
類型:枚舉值,決定二值化邏輯。常用選項:
cv2.THRESH_BINARY
:像素值 >thresh
→ 設為maxval
,否則設為0
。cv2.THRESH_BINARY_INV
:像素值 >thresh
→ 設為0
,否則設為maxval
。cv2.THRESH_TRUNC
:像素值 >thresh
→ 截斷為thresh
,否則保留原值。cv2.THRESH_TOZERO
:像素值 >thresh
→ 保留原值,否則設為0
。cv2.THRESH_TOZERO_INV
:像素值 >thresh
→ 設為0
,否則保留原值。cv2.THRESH_OTSU
(需與上述類型組合使用,如cv2.THRESH_BINARY + cv2.THRESH_OTSU
):自動計算最佳閾值(忽略手動設置的thresh
)。
-
返回值
retval
:實際使用的閾值。若使用cv2.THRESH_OTSU
,返回自動計算的閾值。dst
:處理后的二值化圖像。
使用場景
- 圖像二值化:最常見的使用場景之一。通過設定一個閾值,將圖像轉換為僅包含黑白兩種顏色的二值圖像。這對于后續的圖像處理步驟(如邊緣檢測、輪廓提取等)非常有用。
- 背景消除:通過閾值處理,可以將圖像中的背景部分與前景部分區分開來,便于提取感興趣的目標。這對于機器視覺任務(如物體識別、跟蹤等)至關重要。
- 圖像分割:利用閾值處理可以對圖像進行分割,將圖像中具有相似像素值的區域分隔出來。這有助于進一步分析圖像中的各個部分。
- 特征提取:在某些情況下,閾值處理可以用于提取圖像中的某些特定特征,比如顏色特征、紋理特征等。這對于圖像分析和模式識別非常有用。
- 減少噪聲:通過閾值處理,可以將一些小的噪聲區域從圖像中去除,從而提高圖像質量。這通常與形態學操作結合使用,以達到更好的效果。
- 圖像增強:在某些情況下,閾值處理也可以用于增強圖像的某些部分,例如通過調整閾值來增加圖像的對比度。
- 自動閾值確定:使用
cv2.THRESH_OTSU
或cv2.THRESH_TRIANGLE
參數,可以讓函數自動確定閾值,適用于那些難以手動設定閾值的情況。 - 圖像預處理:在進行其他復雜的圖像處理操作之前,通常會對圖像進行預處理,其中閾值處理是一個重要的步驟。它可以簡化后續處理的復雜度,并提高處理效果。
- 圖像閾值化跟蹤:在視頻處理中,閾值處理可以用來跟蹤特定的物體或區域。通過動態調整閾值,可以適應不同的光照條件和背景變化。
3 自適應閾值處理cv2.adaptiveThreshold
OpenCV 中用于自適應閾值化的函數,特別適用于光照不均或背景復雜的圖像二值化場景:
adaptiveThreshold
函數定義
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
參數詳解
-
src
(輸入圖像)- 類型:必須為 8-bit 單通道灰度圖像(如
cv2.COLOR_BGR2GRAY
轉換后的圖像)。 - 作用:待處理的輸入圖像,不接受浮點型或多通道圖像。
- 類型:必須為 8-bit 單通道灰度圖像(如
-
maxValue
(最大值)- 類型:
int
或float
。 - 作用:當像素值滿足閾值條件時,賦予的新值(通常為 255)。
- 類型:
-
adaptiveMethod
(自適應方法)-
類型:枚舉值,決定如何計算局部閾值。可選:
cv2.ADAPTIVE_THRESH_MEAN_C
:基于鄰域塊的均值計算閾值(T = 均值 - C
)。
-
cv2.ADAPTIVE_THRESH_GAUSSIAN_C
:基于鄰域塊的高斯加權均值計算閾值(T = 高斯加權均值 - C
)。
-
-
thresholdType
(閾值類型)-
類型:枚舉值,僅支持兩種模式:
cv2.THRESH_BINARY
:像素值 > 閾值 → 設為maxValue
,否則設為 0。
-
cv2.THRESH_BINARY_INV
:像素值 > 閾值 → 設為 0,否則設為maxValue
。
-
-
blockSize
(鄰域塊大小)- 類型:奇數(如 3, 5, 7)。
- 作用:計算局部閾值的鄰域窗口尺寸,越大越能平滑噪聲,但可能丟失細節。
-
C
(常數偏移)- 類型:
int
或float
。 - 作用:從計算的閾值中減去的常數,用于微調閾值敏感度(通常取正值降低閾值)。
- 類型:
返回值
dst
:處理后的二值化圖像,尺寸與src
相同。
注意事項
- 輸入限制:必須為 8-bit 單通道灰度圖像,否則報錯。
- blockSize 奇偶性:必須為奇數,否則拋出
cv2.error
。 - 參數調優:
- blockSize:值過小 → 噪聲敏感;值過大 → 細節丟失。
- C 值:正值降低閾值(更易將像素設為
maxValue
),負值提高閾值。
- 性能:比全局閾值
cv2.threshold
計算開銷更大。 - 對比全局閾值:
- 優點:適應局部亮度變化。
- 缺點:無法處理全局對比度極低的圖像(需結合其他預處理)。
使用示例
import numpy as np
import cv2img = cv2.imread('1.png')
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 將圖片轉換為灰度圖
img2 = cv2.adaptiveThreshold(img1,250, # 設定閾值,越大越亮cv2.ADAPTIVE_THRESH_MEAN_C, # 選擇方法,這里選擇均值cv2.THRESH_BINARY, # 選擇二值化方法3, # 鄰域大小, 越大越模糊, 奇數,通常為3或51) # C值,越大越亮,通常為1
cv2.imshow('image', img2)
cv2.waitKey(0)
示例效果