1. 程式人生 > 程式設計 >Python+OpenCV影象處理—— 色彩空間轉換

Python+OpenCV影象處理—— 色彩空間轉換

一、色彩空間的轉換

程式碼如下:

#色彩空間轉換
import cv2 as cv
def color_space_demo(img):
  gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) #RGB轉換為GRAY 這裡的GRAY是單通道的
  cv.imshow("gray",gray)
  hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)   #RGB轉換為HSV
  cv.imshow("hsv",hsv)
  yuv = cv.cvtColor(img,cv.COLOR_RGB2YUV)   #RGB轉換為YUV
  cv.imshow("yuv",yuv)
  Ycrcb = cv.cvtColor(img,cv.COLOR_RGB2YCrCb) #RGB轉換為YCrCb
  cv.imshow("Ycrcb",Ycrcb)
src = cv.imread('D:\imageload\example.png')
cv.namedWindow('first_image',cv.WINDOW_AUTOSIZE)
cv.imshow('first_image',src)
color_space_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()

執行結果:

Python+OpenCV影象處理—— 色彩空間轉換

1.RGB就是指Red,Green和Blue,一副影象由這三個channel(通道)構成

2.Gray就是隻有灰度值一個channel。

3.HSV即Hue(色調),Saturation(飽和度)和Value(亮度)三個channel

切記(純屬個人理解):

1.百度百科說,將原來的RGB(R,G,B)中的R,B統一按照一種轉換關係用Gray替換,形成新的顏色RGB(Gray,Gray,Gray),用它替換原來的RGB(R,B)就是灰度圖。

Python+OpenCV影象處理—— 色彩空間轉換

2.opencv裡,COLOR_RGB2GRAY是將三通道RGB物件轉換為單通道的灰度物件。

3.將單通道灰度物件轉換為 RGB 時,生成的RGB物件的每個通道的值是灰度物件的灰度值。

RGB是為了讓機器更好的顯示影象,對於人類來說並不直觀,HSV更為貼近我們的認知,所以通常我們在針對某種顏色做提取時會轉換到HSV顏色空間裡面來處理.

補註:

1.HSV如下圖:

Python+OpenCV影象處理—— 色彩空間轉換

2.opencv裡HSV色彩空間範圍為:H:0-180 S: 0-255 V: 0-255

3.常見的色彩空間有RGB、HSV、HIS、YCrCb、YUV,其中最常用的是RGB、HSV、YUV,其中YUV就是YCrCb(詳見百度百科)。其中YUV的“Y”表示明亮度(Luminance或Luma),也就是灰階值;而“U”和“V” 表示的則是色度(Chrominance或Chroma),作用是描述影像色彩及飽和度,用於指定畫素的顏色。

二、利用inrange函式過濾視訊中的顏色,實現對特定顏色的追蹤

程式碼如下:

#視訊特定顏色追蹤
import cv2 as cv
import numpy as np
def extrace_object_demo():
  capture=cv.VideoCapture("E:/imageload/video_example.mp4")
  while True:
    ret,frame = capture.read()
    if ret == False:
      break
    hsv = cv.cvtColor(frame,cv.COLOR_BGR2HSV)   #色彩空間由RGB轉換為HSV
    lower_hsv = np.array([100,43,46])       #設定要過濾顏色的最小值
    upper_hsv = np.array([124,255,255])      #設定要過濾顏色的最大值
    mask = cv.inRange(hsv,lower_hsv,upper_hsv)  #調節影象顏色資訊(H)、飽和度(S)、亮度(V)區間,選擇藍色區域
    cv.imshow("video",frame)
    cv.imshow("mask",mask)
    c = cv.waitKey(40)
    if c == 27:   #按鍵Esc的ASCII碼為27
      break
extrace_object_demo()
cv.destroyAllWindows()

執行結果:

這裡只放追蹤藍色部分的截圖,僅供參考

Python+OpenCV影象處理—— 色彩空間轉換

注意:

1.Opencv的inRange函式:可實現二值化功能

函式原型:inRange(src,lowerb,upperb[,dst]) -> dst

  函式的引數意義:第一個引數為原陣列,可以為單通道,多通道。第二個引數為下界,第三個引數為上界

例如:mask=cv2.inRange(hsv,lower_blue,upper_blue)

  第一個引數:hsv指的是原圖(原始影象矩陣)

  第二個引數:lower_blue指的是影象中低於這個lower_blue的值,影象值變為255

  第三個引數:upper_blue指的是影象中高於這個upper_blue的值,影象值變為255 (255即代表黑色)

  而在lower_blue~upper_blue之間的值變成0 (0代表白色)

即:Opencv的inRange函式可提取特定顏色,使特定顏色變為白色,其他顏色變為黑色,這樣就實現了二值化功能

2.HSV顏色對應的RGB分量範圍表如下:(這裡是三通道的)

Python+OpenCV影象處理—— 色彩空間轉換

三、通道的分離、合併以及某個通道值的修改

程式碼如下:

#通道的分離與合併以及某個通道值的修改
import cv2 as cv
src=cv.imread('E:\imageload\example.png')
cv.namedWindow('first_image',src)

#三通道分離形成單通道圖片
b,g,r =cv.split(src)
cv.imshow("second_blue",b)
cv.imshow("second_green",g)
cv.imshow("second_red",r)
# 其中cv.imshow("second_red",r)可表示為r = cv2.split(src)[2]

#三個單通道合成一個三通道圖片
src = cv.merge([b,r])
cv.imshow('changed_image',src)

#修改多通道里的某個通道的值
src[:,:,2] = 0
cv.imshow('modify_image',src)

cv.waitKey(0)
cv.destroyAllWindows()

注意:

1.這裡用到了opencv的split函式和merge函式,實現通道的分離和合並。

2.cv.split函式分離出的b、g、r是單通道影象

以上就是Python+OpenCV影象處理—— 色彩空間轉換的詳細內容,更多關於Python+OpenCV影象處理的資料請關注我們其它相關文章!