1.目標
- 在本教程中,你將學習如何將圖像從一個色彩空間轉換到另一個,像BGR?灰色,BGR?HSV等
- 除此之外,我們還將創建一個應用程序,以提取視頻中的彩色對象
- 你將學習以下功能:cv2.cvtColor,**cv2.inRange**等。
2.改變顏色空間
在 OpenCV 中有超過 150 種顏色空間轉換的方法。但我們僅需要研究兩個最常使用的方法,他們是 BGR 到 Gray,BGR 到 HSV。
我們使用 cv2.cvtColor(input_image, flag)函數進行顏色轉換,其中 flag 決定了轉換的類型。
對于 BGR 到 Gray 轉換我們令 flag 為 **cv2.COLOR_BGR2GRAY**。 同樣,對于 BGR 到 HSV, 我們令 flag 為 **cv2.COLOR_BGR2HSV**。
代碼:
import cv2image = r'D:\study\EmotionDetection_RealTime-master\data\data\te\01.jpg'
image = cv2.imread(image)#顏色轉換
img1 = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
cv2.imshow('s',image)
cv2.imshow('img1',img1)
cv2.imshow('img2',img2)cv2.waitKey(0)
cv2.destroyAllWindows()
注意?對于 HSV, 色調(Hue)范圍為 [0,179], 飽和度(Saturation)范圍為 [0,255] ,明亮度(Value)為 [0,255]. 不同的軟件使用不同的比例. 所以如果你想用 OpenCV 的值與別的軟件的值作對比,你需要歸一化這些范圍。
結果輸出:
3.目標顏色區域提取
現在我們知道了如何將 BGR 圖片轉化為 HSV 圖片,我們可以使用它去提取彩色對象。HSV 比 BGR 在顏色空間上更容易表示顏色。在我們的應用中,我們會嘗試提取一個感興趣的彩色對象,方法為:
- 將 BGR 轉化為 HSV 顏色空間。
- 點擊圖像對應區域獲得HSV值
- 獲取感興趣的彩色區域
代碼:
import cv2
import numpy as npimage = r'D:\study\EmotionDetection_RealTime-master\data\data\te\03.jpg'
# image = cv2.imread(image)import cv2
import numpy as np
from matplotlib import pyplot as pltimage=cv2.imread(image)
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDOWN: #定義一個鼠標左鍵按下去的事件print(HSV[y,x])cv2.imshow("imageHSV",HSV)
cv2.imshow('image',image)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)cv2.waitKey(0)
cv2.destroyAllWindows()
輸出:
?
?HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):
? ? if event==cv2.EVENT_LBUTTONDOWN: #定義一個鼠標左鍵按下去的事件
? ? ? ? print(HSV[y,x])您提供的代碼片段是使用OpenCV庫(通常以
cv2
導入)來處理圖像的一部分。這段代碼的作用是將圖像從BGR顏色空間轉換到HSV顏色空間,并且定義了一個鼠標事件處理函數,當用戶在圖像上左鍵點擊時,它會打印出點擊位置像素的HSV值。下面是這段代碼的詳細解釋:
HSV=cv2.cvtColor(image,cv2.COLOR_BGR2HSV)
:這行代碼將輸入的image
(應該是BGR格式的numpy數組)轉換為HSV顏色空間。OpenCV默認讀取圖像為BGR格式,而HSV顏色空間對于某些圖像處理任務(如顏色分割)更加方便。
def getpos(event,x,y,flags,param):
:這定義了一個名為getpos
的函數,它將作為回調函數用于處理OpenCV窗口中的鼠標事件。這個函數接收五個參數:event
(事件類型),x
和y
(鼠標點擊的坐標),flags
(其他參數),param
(用戶定義的參數)。
if event==cv2.EVENT_LBUTTONDOWN:
:這行代碼檢查event
參數是否為cv2.EVENT_LBUTTONDOWN
,即鼠標左鍵是否被按下。
print(HSV[y,x])
:如果在圖像上發生了鼠標左鍵點擊事件,這行代碼會打印出鼠標點擊位置像素的HSV值。這里HSV[y,x]
訪問的是轉換到HSV顏色空間后的圖像數組,在(x,y)
位置的像素值。
lower_blue = np.array([0, 0, 190])
upper_blue = np.array([180, 200, 255])
# Threshold the HSV image to get only blue colors
mask = cv2.inRange(HSV, lower_blue, upper_blue)
cv2.imshow('mask',mask)您提供的代碼片段是使用OpenCV庫來創建一個藍色顏色范圍的掩碼(mask),并將這個掩碼顯示在窗口中。這段代碼是在HSV顏色空間中操作的,這是進行顏色識別和分割的常用方法。
下面是這段代碼的詳細解釋:
lower_blue = np.array([0, 0, 190])
:這行代碼定義了藍色在HSV顏色空間中的低閾值。這里,藍色的色調(H)從0開始,飽和度(S)從0開始,亮度(V)從190開始。這意味著,亮度高于190的非常淺的藍色將被排除在外。
upper_blue = np.array([180, 200, 255])
:這行代碼定義了藍色在HSV顏色空間中的高閾值。色調(H)的上限是180(在HSV顏色空間中,藍色的范圍是從0到180,然后再次從180到0,所以這里包括了所有的藍色),飽和度(S)的上限是200,亮度(V)的上限是255(最大值)。
mask = cv2.inRange(HSV, lower_blue, upper_blue)
:這行代碼使用cv2.inRange
函數創建了一個掩碼,這個掩碼包含了輸入圖像HSV
中所有在lower_blue
和upper_blue
閾值范圍內的像素。在掩碼中,這些像素被設置為白色(255),而不在閾值范圍內的像素被設置為黑色(0)。
cv2.imshow('mask',mask)
:這行代碼顯示了創建的掩碼。在顯示的窗口中,白色的區域代表了圖像中藍色的部分,黑色的區域則代表其他顏色。要使這段代碼完整工作,您需要確保已經讀取了圖像并將其轉換為HSV顏色空間,如之前提供的代碼示例所示。然后,這段代碼將創建并顯示藍色物體的掩碼。
提取結果:
?這在?stackoverflow.com?中是經常見到的問題。 這個問題非常簡單,你可以使用相同的函數:**cv.cvtColor()**。 不需要輸入圖片,你只需要輸入你需要的 BGR 值即可. 例如, 為了找到綠色的 HSV 值, 可以在 Python 終端中輸入以下代碼:
>>> green = np.uint8([[[0,255,0 ]]])
>>> hsv_green = cv.cvtColor(green,cv.COLOR_BGR2HSV)
>>> print( hsv_green )
[[[ 60 255 255]]]
現在你可以取 [H-10, 100,100] 和 [H+10, 255, 255] 分別作為上界和下界. 除此之外,你可以使用任何圖像編輯工具(如 GIMP)或任何在線轉換器來查找這些值,但不要忘記調整 HSV 范圍。?