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

OpenCV(15)——常規5大閾值處理

在這裡插入圖片描述

cv2。THRESH_BINARY_INV

OpenCV(15)——常規5大閾值處理

在這裡插入圖片描述

cv2。THRESH_TRUNC

OpenCV(15)——常規5大閾值處理

在這裡插入圖片描述

cv2。THRESH_TOZERO_INV

OpenCV(15)——常規5大閾值處理

在這裡插入圖片描述

cv2。THRESH_TOZERO

OpenCV(15)——常規5大閾值處理

在這裡插入圖片描述

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()

執行之後,效果如下所示:

OpenCV(15)——常規5大閾值處理

可以看到透過二值化閾值處理,我們的影象有點畫素描畫的效果。

反二值化閾值處理(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()

OpenCV(15)——常規5大閾值處理

截斷閾值化處理(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()

執行之後,得到的效果如下所示:

OpenCV(15)——常規5大閾值處理

可以理解為比二值化更純粹的素描。

超閾值零處理(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()

執行之後,效果如下:

OpenCV(15)——常規5大閾值處理

低閾值零處理(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()

執行之後,效果如下所示:

OpenCV(15)——常規5大閾值處理