【翻譯:OpenCV-Python教程】改變色彩空間

⚠️這個系列是自己瞎翻的,文法很醜,主要靠意會,跳着跳着撿重要的部分翻,翻錯了不負責,就這樣哈。

⚠️基於3.4.3,Changing Colorspaces原文

目標 

  • 在這個教程中,你會學到如何把圖像從一個色彩空間改變到另外一個。比如BGR ↔ Gray,BGR ↔ HSV等等。
  • 除此之外,我們還將創建一個提取視頻中彩色對象的應用程序。
  • 你會學到以下這些方法:cv.cvtColor()cv.inRange() 等等。

改變顏色空間 

這大概有150多種可用的顏色空間轉換的方法,在OpenCV裏。但咱們着眼於兩個應用最廣泛的:BGR ↔ Gray 以及 BGR ↔ HSV。

要改變顏色,我們使用方法 cv.cvtColor(input_image, flag) 參數flag決定圖像轉換的類型。

要從BGR轉成Gray我們用這個標誌 cv.COLOR_BGR2GRAY。類似的,BGR轉成HSV,我們用 cv.COLOR_BGR2HSV 這個標誌。要知道其他的標誌,只要運行以下命令,在你Python的終端上:

>>> import cv2 as cv
>>> flags = [i for i in dir(cv) if i.startswith('COLOR_')]
>>> print( flags )

提示

對HSV來說,色調範圍是 [0,179] ,飽和度範圍是 [0,255] 數值範圍是 [0,255] 。不同的軟件使用了不同的標尺,所以,如果你要比較OpenCV中的數值和其他軟件給出的數值,你就需要把他們標準化。

對象跟蹤 

現在我們知道如何把 BGR 圖像轉成 HSV,我們可以使用這招來提取彩色對象。在 HSV 裏,展示出一種顏色比在 BGR 色彩空間裏更容易。在我們的應用裏,我們嘗試提取出藍色的物體,方法如下:

  • 拿到視頻中的每一幀。
  • 把色彩空間從 BGR 改到 HSV。
  • 我們把藍色的範圍設置爲 HSV 圖像的閾值。
  • 現在只提取藍色的對象,我們可以對這圖像做任何我們想做的事情。

以下代碼有詳細的註釋:

import cv2 as cv
import numpy as np
cap = cv.VideoCapture(0)
while(1):
    # Take each frame
    _, frame = cap.read()
    # Convert BGR to HSV
    hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
    # define range of blue color in HSV
    lower_blue = np.array([110,50,50])
    upper_blue = np.array([130,255,255])
    # Threshold the HSV image to get only blue colors
    mask = cv.inRange(hsv, lower_blue, upper_blue)
    # Bitwise-AND mask and original image
    res = cv.bitwise_and(frame,frame, mask= mask)
    cv.imshow('frame',frame)
    cv.imshow('mask',mask)
    cv.imshow('res',res)
    k = cv.waitKey(5) & 0xFF
    if k == 27:
        break
cv.destroyAllWindows()

以下圖像顯示了藍色物體的追蹤過程:

frame.jpg

提示

圖像中有些噪聲,我們會在下節看看怎麼消除他們。(譯者注:瞭解一下圖像噪聲

這是最最簡單的追蹤物體的方式,一旦你學會了關於輪廓的方法,你可以做很多事情,比如找物體質心來追蹤物體,對着攝像頭移動手指繪製圖表,以及很多其他好玩的事情。

如何找到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範圍。

額外資源

練習 

  • 嘗試找到一個方法來提取更多的彩色物體,比如同時提取紅色、藍色、綠色的物體。

上篇:【翻譯:OpenCV-Python教程】性能測量和技術提升

下篇:【翻譯:OpenCV-Python教程】圖像的幾何變換

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章