1. 程式人生 > >【翻譯】改變色彩空間

【翻譯】改變色彩空間

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

⚠️基於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範圍。

額外資源

練習 

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

上篇:【翻譯】效能測量和技術提升

下篇:【翻譯】影象的幾何變換