OpenCV 圖像處理之顏色空間轉換
目標
? 你將學習如何對圖像進行顏色空間轉換,比如從 BGR 到灰度圖,或者從BGR 到 HSV 等。
? 我沒還要創建一個程序用來從一幅圖像中獲取某個特定顏色的物體。
? 我們將要學習的函數有: cv2.cvtColor(), cv2.inRange() 等。
1.轉換顏色空間
在 OpenCV 中有超過 150 種進行顏色空間轉換的方法。但是我們經常用到的也就兩種: BGR<-->Gray 和 BGR<-->HSV。
要用到的函數是:
cv2.cvtColor(input_image,flag)
,其中 flag就是轉換類型。
對于 BGR->Gray 的轉換,我們要使用的 flag 就是
cv2.COLOR_BGR2GRAY
。
同樣對于 BGR->HSV 的轉換,我們用的 flag 就是
cv2.COLOR_BGR2HSV。
?
注意:在 OpenCV 的 HSV 格式中,?H(色彩/色度)的取值范圍是 [0, 179],S(飽和度)的取值范圍 [0, 255], V(亮度)的取值范圍 [0, 255]。但是不同的軟件使用的值可能不同。所以當你需要拿 OpenCV 的 HSV 值與其他軟件的 HSV 值進行對比時,一定要記得歸一化。
?
2 物體跟蹤
?
現在我們知道怎樣將一幅圖像從 BGR 轉換到 HSV 了,我們 可以利用這一點來提取帶有某個特定顏色的物體 。在 HSV 顏色空間中要比在 BGR 空間中更容易表示一個特定顏色。在下面的程序中,我們要提取的是一個藍色的物體。下面就是就是我們要做的幾步:
? 從視頻中獲取每一幀圖像
? 將圖像轉換到 HSV 空間
? 設置 HSV 閾值到藍色范圍。
? 獲取藍色物體,當然我們還可以做其他任何我們想做的事,比如:在藍色物體周圍畫一個圈。
代碼如下,為簡單起見,省略了從視頻中獲取每一幀圖像,直接讀入圖像:
import cv2
import numpy as np
img = cv2.imread(r'D:\OpenCV_Python\chepai.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV_FULL)
lower_blue = np.array([120, 100, 100])
upper_blue = np.array([179, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('image', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果如下圖:
注意:圖像中仍然有一些噪音,我們會在后面的章節中介紹如何消減噪音。
注意:這是物體跟蹤中最簡單的方法。當你學習了輪廓之后,你就會學到更多相關知識,那是你就可以找到物體的重心,并根據重心來跟蹤物體,僅僅在攝像頭前揮揮手就可以畫出同的圖形,或者其他更有趣的事。
3 怎樣找到要跟蹤對象的 HSV 值?
在上述示例中,我們要用到一個關鍵的參數,即要跟蹤的對象的HSV值,但是怎樣找到要跟蹤對象的 HSV 值呢?
在OpenCV中,可以這樣做:(以標準紅綠藍為例)
import cv2
import numpy as np
“”“
# 注意:下面代碼里不能用 [0,255,0],而要用 [[[0,255,0]]]
# 這里的三層括號應該分別對應于 cvArray, cvMat, IplImage
“””
blue = np.uint8([[[255, 0, 0]]])
hsv_blue = cv2.cvtColor(blue, cv2.COLOR_BGR2HSV)
print('hsv_blue : ', hsv_blue)
green = np.uint8([[[0, 255, 0]]])
hsv_green = cv2.cvtColor(green, cv2.COLOR_BGR2HSV)
print('hsv_green : ', hsv_green)
red = np.uint8([[[0, 0, 255]]])
hsv_red = cv2.cvtColor(red, cv2.COLOR_BGR2HSV)
print('hsv_red : ', hsv_red)
?結果如下:
這樣,就大概知道了對應HSV的值的范圍,現在你可以分別用 [H-100, 100, 100] 和 [H+100, 255, 255] 做上
下閾值。除了這個方法之外,你可以使用任何其他圖像編輯軟件(例如 GIMP、Photoshop)或者Halcon或者在線轉換軟件找到相應的 HSV 值,但是最后別忘了調節 HSV 的范圍。
?
?這里以OpenCV logo為例,提取其中的藍色部分:
import cv2
import numpy as np
img = cv2.imread('opencv_logo.jpg')
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_blue = np.array([100, 100, 100])
upper_blue = np.array([140, 255, 255])
mask = cv2.inRange(hsv, lower_blue, upper_blue)
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('image', img)
cv2.imshow('mask', mask)
cv2.imshow('res', res)
cv2.waitKey(0)
cv2.destroyAllWindows()
結果如圖:
?
參考文獻:《OpenCV-Python 中文教程》(段力輝 譯)
圖片來源于網絡,侵刪
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
