設定值處理式指剃除影像內像素高於或低於一定值的像素點。例如我們設定設定值為100,然後:
將影像內所有像素值大於100的像素點的值設為255。
將影像內所有像素值小於等於100的像素點的值設為0。
透過上述方式能夠獲得一幅二值影像,可將一幅灰階影像處理為一幅二值影像,有效地實現前後景的分離。
threshold函數
cv2.threshold()函數可進行設定值化處理
retval, dst = cv2.threshold(src , thresh, maxval, type)
retval代表傳回的設定值。
dst代表設定值分割結果影像,與原始影像具有相同的大小和類型。
src代表要進行設定值分割的影像。
thresh代表要設定的設定值
maxval代表當type參數為THRESH_BINARY或THRESH_BINARY_INV類型時,需要設定的最大值。
type代表設定值分割的類型。
上述公式或許有點抽象,下面會加以舉例說明!
二值化設定值處理(cv2.THRESH_BINARY)
二值化設定值處理會將原始影像處理為僅有兩個值的二值影像。
對於灰階值大於設定值thresh的像素點,將其灰階值設定為最大值
對於灰階值小於等於設定值thresh的像素點,將其灰階設定為0。
簡單來說,假如現在有一個影像img=
[[100,102,103]
[ 99, 98, 97]]
將thresh設定為100,則輸出會成為
[[0,255,255]
[ 0, 0, 0]]
t , rst = cv2.threshold(img,100,255,cv2.THRESH_BINARY)
可明顯看出灰階圖像轉變成為黑白圖。
反二值化設定值處理(cv2.THRESH_BINARY)
反二值化設定值處理的結果也是僅有兩個值的二值影像,與二質化設定不同的地方於:
對於灰階值大於設定值的像素點,將其值設定為0。
對於灰階值小於等於設定值的像素點,將其值設定為255。
與二值化設定值處理剛好相反。
簡單來說,假如現在有一個影像img=
[[100,102,103]
[ 99, 98, 97]]
將thresh設定為100,則輸出會成為
[[255, 0, 0]
[255,255,255]]
t1 , rst1 = cv2.threshold(img,100,255,cv2.THRESH_BINARY_INV)
可明顯看出THRESH_BINARY與THRESH_BINARY_INV剛好相反。
截斷設定值化處理(cv2.THRESH_TRUNC)
截斷設定值化處理會將影像中大於設定值的像素點的值設定為設定值,小於或等於保持不變。
假設將設定值定為100
對於像素值大於100的像素點,其像素值將被設定為100。
對於像素值小於等於100的像素點,其值不變。
簡單來說,假如現在有一個影像img=
[[100,102,103]
[ 99, 98, 97]]
將thresh設定為100,則輸出會成為
[[ 100,100,100]
[ 99, 98, 97]]
t , rst = cv2.threshold(img,100,255,cv2.THRESH_TRUNC)
超設定值零處理(cv2.THRESH_TOZERO_INV)
像素值大於設定值的像素點,其值將被設定為0。
像素值小於等於設定值的像素點,其值不變。
簡單來說,假如現在有一個影像img=
[[100,102,103]
[ 99, 98, 97]]
將thresh設定為100,則輸出會成為
[[100,0,0]
[99, 98, 97]]
t , rst = cv2.threshold(img,100,255,cv2.THRESH_TOZERO_INV)
低設定值零處理(cv2.THRESH_TOZERO)
像素值大於設定值的像素點,其值不變。
像素值小於等於設定值的像素點,其值為0的像素點,其值為0。
簡單來說,假如現在有一個影像img=
[[100,102,103]
[ 99, 98, 97]]
將thresh設定為100,則輸出會成為
[[0,102,103]
[0 , 0 , 0]]
t , rst = cv2.threshold(img,100,255,cv2.THRESH_TOZERO)
自我調整設定值處理
對於色彩均衡的影像,直接使用一個設定值便能完成設定值化處理,但有時影像色彩不均衡,如只使用一個設定值就無法獲得有效的設定值分割結果影像。
自我調整設定值處理:在設定值處理時,透過計算每個像素點周圍的加權平均值獲得設定值,並使用該設定值對目前像素點進行處理。
OpenCV提供了函數cv2.adaptiveThreshold()來實現自我調整設定值處理
dst = cv2.adaptiveThreshold( src , maxValue, adaptiveMethod, thresholdType, blockSize ,C)
dst為自我調整設定值處理結果。
src代表要進行處理的原始影像。
maxValue代表最大值。
adaptiveMethod代表自我調整方法
thresholdType代表設定值處理方式,該值必須為cv2.THRESH_BINARY或cv2.THRESH_BINARY_INV中。
blockSize代表塊大小,表示一個像素在計算其設定值時所使用的臨域尺寸。
C為常數。
函數cv2.adaptiveThreshold()根據參數adaptiveMethod來確定自我調整設定值的計算方法,有以下兩種:
cv2.ADAPTIVE_THRESH_MEAN_C:鄰近所有像素點的加權值是一致的。
cv2.ADAPTIVE_THRESH_GAUSSIAN_C:與臨域各個像素點到中心點的距離有關,透過高斯方程式獲得各個點的加權值。
athdMEAN = cv2.adaptiveThreshold(img ,255,cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY,5,3)
athdGAUS = cv2.adaptiveThreshold(img ,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,3)
Otsu處理
在使用cv2.threshold()進行設定值處理時,需要自訂一個設定值,而Otsu能夠根據目前影像列出最佳的類別間分割設定值,簡單來說,Otsu方法會檢查所有可能設定值,並找到最佳解!
在OpenCV中,透過在函數cv2.threshold()中對參數type的類型多傳遞一個參數"cv2.THRESH_OTSU"即可實現Otsu設定值分割。
在使用Otsu方法時,需把設定值設為0,此時的函數cv2.threshold()會自動尋找最佳設定值,並將該設定值傳回。
與普通設定值分割的不同之處在於:
參數type增加了一個參數值"cv2.THRESH_OTSU"。
設定值需為0
傳回直t是Otsu方法計算獲得並使用的最佳設定值。
t1, otsu = cv2.threshold(img ,0,255 ,cv2.THRESH_BINARY+cv2.THRESH_OTSU)