OpenCV中的很多函數都會指定一個掩模,也稱為隱藏,當使用掩模參數。操作只會在掩模值為不可為空的像素點上執行,並將其他像素點的值置為0
舉例來說,img1、img2、mask、img3的原始值分別為:
在計算過程工,img3計算的是掩模mask控制下的"img1+img2"結果。,在計算時,隱藏為1的部分對應"img1+img2",其他部分的像素值均為"0"
GRAY(灰階影像)通常只8位元灰階圖,其具有256個灰階級,像素值的範圍是[0,255]。
轉為灰階較為重要,之後會時常用到。
img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) #彩色轉灰階
img2=cv2.cvtColor(img,cv2.COLOR_BGR2YCR_CB)
可明顯看出差異,也可透過調參數的方式來達成目的。HSV常用的目的為物件偵測、去背處理。
cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
在調參數前,我們需要先瞭解我們所想提取的顏色,可透過PS來輔助。
可於影片中得知鯊鯊藍為H:199 S:45% B:70%
轉換後:H:99.5 S:114.75 V:178.5 我們取正負20來運作
點選吸管工具那個圖示,選擇HSB顏色
PS中的HSV範圍,H是0-360,S是0-1,V是0-1
opencv中的HSV範圍,H是0-180,S是0-255,V是0-255
因此需要轉換
把PS中H的值除以2,S乘255,V乘255,可以得到對應的opencv的HSV值
mask =cv2.inRange(要檢查的陣列或影像,範圍下界,範圍上界)
如果要檢查的陣列或影像處於該指定區域內,則 mask中對應位置上的值為255,否則為0。
hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #彩色轉HSV
lower_blue=np.array([79,94,158]) #用PS抓出來的HSV參數
upper_blue=np.array([129,134,198])
mask = cv2.inRange(hsv,lower_blue,upper_blue)
r=cv2.bitwise_and(img,img,mask=mask) #透過隱藏控制的逐位元與運算,鎖定我們所抓參數的區域
cv2.imshow('before',img)
cv2.imshow('res',r)
cv2.waitKey(0)
透過inRange函數鎖定特定值:OpenCV中透過函數cv2.inRange()來判斷影像內像素點的像素質是否在指定的範圍內
mask = cv2.inRange(要檢查的陣列或影像,下界,上界)
如果要檢查的陣列或影像(hsv)處於指定區間內,則mask中對應位置上的值為255。
如果要檢查的陣列或影像(hsv)不處於指定區間內,則mask中對應位置上的值為0。
透過本例題可以看出,透過函數cv2.inRnage()可以將陣列(影像)內指定範圍內的值標記出來,在傳回的mask中,其值取決於hsv中對應位置上的值是否在inRange所指定的[lower,upper]內。