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 留言