OpenCV(15)——常規5大閾值處理
什麼是閾值處理
閾值處理是剔除原影象中畫素高於或者低於一定值的畫素點。例如將一個灰度影象中大於200的畫素點統一設定為255,這個就是閾值處理。或者說將所有低於200的畫素點設定為0,也可以叫做閾值處理,兩者結合處理後,影象就變為二值影象了。
threshold
在OpenCV中,我們使用cv2。threshold()函式進行閾值處理,它的定義如下所示:
def threshold(src, thresh, maxval, type, dst=None):
src:需要進行閾值處理的原始影象
thresh:需要設定的閾值
maxval:當type為THRESH_BINARY或者THRESH_BINARY_INV型別時,需要設定的最大值。
type:閾值的型別,如下表所示。
型別
含義
cv2。THRESH_BINARY
在這裡插入圖片描述
cv2。THRESH_BINARY_INV
在這裡插入圖片描述
cv2。THRESH_TRUNC
在這裡插入圖片描述
cv2。THRESH_TOZERO_INV
在這裡插入圖片描述
cv2。THRESH_TOZERO
在這裡插入圖片描述
cv2。THRESH_MASK
掩碼
cv2。THRESH_OTSU
標記,使用Otsu演算法時的可選閾值引數
cv2。THRESH_TRIANGLE
標記,使用Triangle演算法時的可選閾值引數
二值化閾值處理(cv2。THRESH_BINARY)
顧名思義,二值化閾值處理,會將原始影象變更為僅有2個值的二值影象,也就是cv2。THRESH_BINARY。
下面,我們用程式碼來實現二值化閾值處理,具體程式碼如下所示:
import cv2img = cv2。imread(“4。jpg”, 0)t, result_img = cv2。threshold(img, 127, 255, cv2。THRESH_BINARY)cv2。imshow(“img”, img)cv2。imshow(“result_img”, result_img)cv2。waitKey()cv2。destroyAllWindows()
執行之後,效果如下所示:
可以看到透過二值化閾值處理,我們的影象有點畫素描畫的效果。
反二值化閾值處理(cv2。THRESH_BINARY_INV)
反二值化閾值處理的結果也是僅有兩個值的二值影象,與二值化的區別在於,就是將其大於賦值255,小於賦值0顛倒過來。
修改程式碼,我們看看執行的效果:
import cv2img = cv2。imread(“4。jpg”, 0)t, result_img = cv2。threshold(img, 127, 255, cv2。THRESH_BINARY_INV)cv2。imshow(“img”, img)cv2。imshow(“result_img”, result_img)cv2。waitKey()cv2。destroyAllWindows()
截斷閾值化處理(cv2。THRESH_TRUNC)
截斷閾值化處理會將原影象中大於閾值的畫素點的值設定為閾值,小於或等於畫素點的值保持不變。也就是上面的將大於127畫素的灰度影象全部更改為127,低於或等於127的保持不變。
import cv2img = cv2。imread(“4。jpg”, 0)t, result_img = cv2。threshold(img, 127, 255, cv2。THRESH_TRUNC)cv2。imshow(“img”, img)cv2。imshow(“result_img”, result_img)cv2。waitKey()cv2。destroyAllWindows()
執行之後,得到的效果如下所示:
可以理解為比二值化更純粹的素描。
超閾值零處理(cv2。THRESH_TOZERO_INV)
超閾值零處理會將影象中大於閾值的畫素點的值處理為0,小於或等於閾值的畫素點保持不變。也就是將大於127的處理為0,小於等於127的保持不變。
import cv2img = cv2。imread(“4。jpg”, 0)t, result_img = cv2。threshold(img, 127, 255, cv2。THRESH_TOZERO_INV)cv2。imshow(“img”, img)cv2。imshow(“result_img”, result_img)cv2。waitKey()cv2。destroyAllWindows()
執行之後,效果如下:
低閾值零處理(cv2。THRESH_TOZERO)
低閾值零處理是將影象中小於或等於閾值的畫素點處理為0,大於閾值的畫素點保持不變。也就是小於等於127的全部賦值為0,大於127的保持不變。
import cv2img = cv2。imread(“4。jpg”, 0)t, result_img = cv2。threshold(img, 127, 255, cv2。THRESH_TOZERO)cv2。imshow(“img”, img)cv2。imshow(“result_img”, result_img)cv2。waitKey()cv2。destroyAllWindows()
執行之後,效果如下所示: