獻給機器學習初學者:OpenCV閾值

獻給機器學習初學者:OpenCV閾值

什麼是影象閾值?

仔細觀察下圖(圖1),你看到多少個數字?大多數人會看到數字:32(是的,仔細看),64,100,128,180,200和255 。但是相比我們看到的數字影象裡還有更多的數字我們並沒有看到。將滑鼠懸停在影象上可檢視到原始影象的閾值版本。你會注意到所有的數字看起來都是白色的(即他們的灰度值為255)並還有一個額外的數字5,你沒有注意到,因為它在影象裡的灰度值為5。實際上原始影象中所有數字都具有等於該數字的灰度值,因此255是最亮的,5是最暗的。

獻給機器學習初學者:OpenCV閾值

圖1 輸入影象

讀取閾值影象中的數字比讀取原始影象中的數字更容易。毫不奇怪,文字識別演算法會發現為我們示例中的閾值影象比原始影象更容易處理。在計算機視覺中,當你認為人類提供更輕鬆的任務時,通常計算機也可以使計算機演算法更容易。

所有的閾值演算法採取一個源影象(src)和一個閾值(thresh)作為輸入,併產生輸出影象(dst)由畫素值在源畫素(x,y)與閾值進行比較。如果src(x,y)> thresh,則為dst(x,y)分配一些值。否則為dst(x,y)分配一些其他值。

最簡單的閾值形式稱為二值化閾值。除了源影象(src)和閾值(thresh),它需要另一輸入引數稱為最大值(maxValue)。在每個畫素位置(x,y),它將畫素值src(x,y)與閾值進行比較。如果src(x,y)大於thresh,則將目標影象畫素dst(x,y)的值設定為maxValue,否則將其設定為零。這是虛擬碼的樣子

# 簡單的閾值函式虛擬碼

if src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

更一般地,許多型別的閾值處理都是基於不同的閾值規則來應用處理src(x,y)以獲得dst(x,y),我們來看看OpenCV中可用的各種閾值型別。

輸入影象

在以下示例中,我們將使用圖1作為輸入。單擊圖1以PNG格式下載影象。輸入影象包含以強度(灰度值)等於數字本身寫入的數字。例如,數字200的畫素值是200,而32的畫素值是32。這就是為什麼32在影象中看起來比200更暗的原因。在每個例子中,我們將把閾值規則解釋作為虛擬碼,提供C++和python示例,以及閾值輸出影象

二值化閾值(type=THRESH_BINARY)

這是最常見和最簡單的閾值型別

閾值規則:

# 二值化閾值if src(x,y) > thresh dst(x,y) = maxValueelse dst(x,y) = 0

Python:

# 匯入opencv包import cv2# 讀影象src = cv2。imread(“threshold。png”, cv2。IMREAD_GRAYSCALE)#設定閾值和最大值thresh = 0maxValue = 255# 基本的閾值例子th,dst=cv2。threshold(src,thresh,maxValue,cv2。THRESH_BINARY)

C++:

using namespace cv;// 讀影象Mat src = imread(“threshold。png”, IMREAD_GRAYSCALE);Mat dst;// 設定閾值和最大值double thresh = 0;double maxValue = 255;// 二值化閾值threshold(src,dst, thresh, maxValue, THRESH_BINARY);

二值化閾值的結果

圖2顯示了使用thresh=0和maxValue=255進行二值化閾值處理得到的輸出影象為:

獻給機器學習初學者:OpenCV閾值

圖2:二值化閾值(thresh=0和maxvalue=255)

將thresh更改為127會刪除小於或等於127的所有數字

獻給機器學習初學者:OpenCV閾值

圖3:二值化閾值(thresh=127和maxvalue=255)

將maxValue更改為128,將閾值區域的設定為128

獻給機器學習初學者:OpenCV閾值

圖4:二值化閾值(maxValue=128)

逆二值化閾值(type=THRESH_BINARY_INV)

逆二值化閾值處理與二值化閾值處理正好相反。如果對應的源畫素大於閾值,則目標畫素設定為零;如果源畫素小於閾值,則將目標畫素設定為maxValue。

閾值規則:

# 逆二值化閾值if src(x,y) > thresh dst(x,y) = 0else dst(x,y) = maxValue

Python:

th, dst = cv2。threshold(src, thresh, maxValue, cv2。THRESH_BINARY_INV)

C++:

threshold(src, dst, thresh, maxValue, THRESH_BINARY_INV);

逆二值化閾值的結果

請注意,圖5所示的逆二值化閾值處理結果與圖3完全相反

獻給機器學習初學者:OpenCV閾值

圖5:逆二值化閾值(thresh=127,maxValue=0)

截斷閾值(type=THRESH_TRUNC)

在這種型別的閾值的,如果源畫素值大於閾值該目標畫素被設定為閾值(THRESH)。否則將閾值設定為源畫素值。maxValue被忽略

閾值規則:

# 截斷閾值if src(x,y) > thresh dst(x,y) = threshelse dst(x,y) = src(x,y)

Pyhton:

th, dst = cv2。threshold(src, thresh, maxValue, cv2。THRESH_TRUNC)

C++:

threshold(src,dst, thresh, maxValue, THRESH_TRUNC);

截斷閾值的結果

圖6顯示了將截斷閾值應用於輸入影象的結果。請注意,高於閾值(127)的所有值都設定為127,並且所有小於或等於127的值都保持不變。maxValue被忽略。

獻給機器學習初學者:OpenCV閾值

圖6:截斷閾值(thresh=127)

反轉閾值為零(type=THRESH_TOZERO_INV)

在這種閾值處理中,如果源畫素值大於閾值,則將目標畫素值設定為零,否則將其設定為源畫素值。maxValue被忽略。

閾值規則:

# 反轉閾值為0if src(x, y) > thresh dst(x, y) = 0else dst(x, y) = src(x, y)

Python:

th, dst = cv2。threshold(src, thresh, maxValue, cv2。THRESH_TOZERO_INV)

C++:

threshold(src,dst, thresh, maxValue, THRESH_TOZERO_INV);

反轉閾值為零的結果

圖8顯示了將反轉閾值為零應用到輸入影象的結果。閾值以下的數字保留其灰度值,除邊界外,閾值以上的數字為0。邊界上的偽特徵是因為邊界處的畫素值從0變換到幾個畫素上的數字的值。因此一些邊界畫素低於閾值。

獻給機器學習初學者:OpenCV閾值

圖8:反轉閾值為零(thresh=127)

原文網址:https://www。learnopencv。com/opencv-threshold-python-cpp/

翻譯:小強

歡迎關注“易學智慧”頭條號,評論區有問必答

www。easyaiforum。cn提線上AI算力平臺和學習平臺