[OpenCV筆記] 4. 常見Threshold (閾值)設定
1.設定值處理
常見的設定值方法,條列如下:
- 二值化處理 (cv2.THRESH_BINARY)
- 反二值化處理 (cv2.THRESH_BINARY_INV)
- 截斷設定值化處理 (cv2.THRESH_TRUNC)
- 超設定值零處理 (cv2.THRESH_TOZERO_INV)
- 低設定值零處理 (cv2.THRESH_TOZERO)
也有自我調整設定值處理,如以下2種方法:
- 均值法 (cv2.ADAPTIVE_THRESH_MEAN_C)
- 高斯法 (cv2.ADAPTIVE_THRESH_GAUSSIAN_C)
在某些情況,像素值分布不均勻,不容易找到合適的設定值。因此,可以使用Otsu法來尋找最佳的設定值。
相關方法的重點,說明如下。
1.1. 二值化處理 (cv2.THRESH_BINARY)
retval_BINARY, img_BINARY = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
- 輸出:retval_BINARY,為回傳的設定值、img_BINARY為輸出影像
- 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_BINARY的位置為分割的類型
二值化處理:大於設定值的像素值設為255,其他像素值為0。
效果如下圖:
<source:Greatway9999>1.2. 反二值化處理 (cv2.THRESH_BINARY_INV)
retval_BINARY_INV , img_BINARY_INV = cv2.threshold(img, 127, 255, cv2.THRESH_BINARYcv2.THRESH_BINARY_INV)
- 輸出:retval_BINARY_INV為回傳的設定值、img_BINARY_INV為輸出影像
- 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_BINARY_INV的位置為分割的類型
反二值化處理:大於設定值的像素值設為0,其他像素值為255。
效果如下圖:
<source:Greatway9999>1.3. 截斷設定值化處理 (cv2.THRESH_TRUNC)
retval_TRUNC , img_TRUNC = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
- 輸出:retval_TRUNC為回傳的設定值、img_TRUNC為輸出影像
- 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_TRUNC的位置為分割的類型
截斷設定值化處理:大於設定值的像素值設為255,其他像素值保持原數值。
效果如下圖:
<source:Greatway9999>1.4. 超設定值零處理 (cv2.THRESH_TOZERO_INV)
retval_TOZERO_INV , img_TOZERO_INV = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
- 輸出:retval_TOZERO_INV為回傳的設定值、img_TOZERO_INV為輸出影像
- 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_TOZERO_INV的位置為分割的類型
超設定值零處理:大於設定值的像素值設為0,其他像素值保持原數值。
效果如下圖:
<source:Greatway9999>1.5. 低設定值零處理 (cv2.THRESH_TOZERO)
retval_TOZERO , img_TOZERO = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
- 輸出:retval_TOZERO為回傳的設定值、img_TOZERO為輸出影像
- 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_TOZERO的位置為分割的類型
低設定值零處理:大於設定值的像素值保持不變,其他像素值設為0。
效果如下圖:
<source:Greatway9999>1.6. 自我調整設定值處理
計算每個像素周圍鄰近區域的加權平均值獲得設定值,藉此對目前像素值進行處理。
dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
輸出:dst為輸出影像
參數:
- src為輸入影像。
- maxValue為最大值。
- adaptiveMethod為自我調整的方法。
- thresholdType為設定值處理方式,必須為 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV。
- blocksize為塊大小,表示一個像素在其設定值時所使用的鄰域尺寸,通常為3、5、7。
- C為常數。
1.6.1. 均值法 (cv2.ADAPTIVE_THRESH_MEAN_C)
img_Adaptive_MEAN = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 3)
效果如下圖:
<source:Greatway9999>1.6.2. 高斯法 (cv2.ADAPTIVE_THRESH_GAUSSIAN_C)
img_Adaptive_GAUSSIAN = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 3)
效果如下圖:
<source:Greatway9999>1.7. 求最佳類別間分割設定值
retval_OTSU, img_OTSU = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
輸出:
- retval為最佳設定值 (本例為117)
- dst為輸出影像
參數:
- img為輸入影像
- 0的位置為設定值(必設為0,程式會自動搜索最佳值)
- 255的位置為滿足條件後轉換的值
- cv2.THRESH_BINARY的位置為分割的類型(但使用Otsu方法,要加上cv2.THRESH_OTSU)
1.8. 各種設定值輸出 & 完整程式
<source:Greatway9999>#Common Types of Threshold
import numpy as np
import cv2
img = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)
#retval, dst = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
# 輸出:retval為回傳的設定值、dst為輸出影像
# 參數:img為輸入影像、127的位置為設定值、255的位置為滿足條件後轉換的值、cv2.THRESH_BINARY的位置為分割的類型
retval_BINARY, img_BINARY = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
#二值化處理,大於設定值的像素值設為255,其他像素值為0
retval_BINARY_INV , img_BINARY_INV = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
#反二值化處理,大於設定值的像素值設為0,其他像素值為255
retval_TRUNC , img_TRUNC = cv2.threshold(img, 127, 255, cv2.THRESH_TRUNC)
#截斷設定值化處理,大於設定值的像素值設為255,其他像素值保持原數值
retval_TOZERO_INV , img_TOZERO_INV = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO_INV)
#超設定值零處理,大於設定值的像素值設為0,其他像素值保持原數值
retval_TOZERO , img_TOZERO = cv2.threshold(img, 127, 255, cv2.THRESH_TOZERO)
#低設定值零處理,大於設定值的像素值保持不變,其他像素值設為0
#自我調整設定值處理,計算每個像素周圍鄰近區域的加權平均值獲得設定值,藉此對目前像素值進行處理
# dst = cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C)
# 輸出:dst為輸出影像
# 參數:src為輸入影像、maxValue為最大值、adaptiveMethod為自我調整的方法、
# thresholdType為設定值處理方式,必須為 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV
# blocksize為塊大小,表示一個像素在其設定值時所使用的鄰域尺寸,通常為3、5、7。
# C為常數
img_Adaptive_MEAN = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 3, 3)
#ADAPTIVE_THRESH_MEAN
img_Adaptive_GAUSSIAN = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 3, 3)
#ADAPTIVE_THRESH_GAUSSIAN
#求最佳類別間分割設定值
retval_OTSU, img_OTSU = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
# 輸出:retval為最佳設定值、dst為輸出影像
# 參數:img為輸入影像、0的位置為設定值(必設為0,程式會自動搜索最佳值)、255的位置為滿足條件後轉換的值、cv2.THRESH_BINARY的位置為分割的類型(但使用Otsu方法,要加上cv2.THRESH_OTSU)
cv2.imshow('img_BINARY', img_BINARY)
cv2.imshow('img_BINARY_INV', img_BINARY_INV)
cv2.imshow('img_TRUNC', img_TRUNC)
cv2.imshow('img_TOZERO_INV', img_TOZERO_INV)
cv2.imshow('img_TOZERO', img_TOZERO)
cv2.imshow('img_Adaptive_MEAN', img_Adaptive_MEAN)
cv2.imshow('img_Adaptive_GAUSSIAN', img_Adaptive_GAUSSIAN)
print('Best Threshold=',retval_OTSU)
cv2.imshow('img_OTSU', img_OTSU)
cv2.waitKey()
cv2.destroyAllWindows()
#閾值 #Threshold
---
參考資料:
0 留言