OpenCV計算機視覺學習(1)——圖像基本操作(圖像視頻讀取,ROI區域截取,常用cv函數解釋)

1,計算機眼中的圖像

  我們打開經典的 Lena圖片,看看計算機是如何看待圖片的:

   我們點擊圖中的一個小格子,發現計算機會將其分為R,G,B三種通道。每個通道分別由一堆0~256之間的數字組成,那OpenCV如何讀取,處理圖片呢,我們下面詳細學習。

2,圖像的加載,顯示和保存

  我們看看在OpenCV中如何操作:

import cv2

# 生成圖片
img = cv2.imread("lena.jpg")
# 生成灰色圖片
imgGrey = cv2.imread("lena.jpg", 0)
#  展示原圖
cv2.imshow("img", img)
#  展示灰色圖片
cv2.imshow("imgGrey", imgGrey)
#  等待圖片的關閉
cv2.waitKey()
# 保存灰色圖片
cv2.imwrite("Copy.jpg", imgGrey)

   圖像的顯示,也可以創建多個窗口。

2.1 圖像的加載函數 cv2.imread()

  cv2.imread() 函數原型如下:

imread(filename, flags=None)

  使用函數cv2.imread() 讀入圖像。這幅圖像應該在此程序的工作路徑,或者給函數提供完整路徑,第二個參數是要告訴函數應該如何讀取這幅圖片。

  • cv2.IMREAD_COLOR:讀入一副彩色圖像。圖像的透明度會被忽略,這是默認參數
  • cv2.IMREAD_GRAYSCALE:以灰度模式讀入圖像
  • cv2.IMREAD_UNCHANGED:保留讀取圖片原有的顏色通道 
  • +1 :等同於cv2.IMREAD_COLOR 
  •  0 :等同於cv2.IMREAD_GRAYSCALE 
  •  -1 :等同於cv2.IMREAD_UNCHANGED 

  PS:調用opencv,就算圖像的路徑是錯的,OpenCV 也不會提醒你的,但是當你使用命令 print(img) 時得到的結果是None。

2.2 圖像的顯示函數 cv2.imshow()

  cv2.imshow() 函數作用是在窗口中顯示圖像,窗口自動適合於圖像大小,我們也可以通過imutils模塊調整顯示圖像的窗口大小。

  函數官方定義如下:

imshow(winname, mat)

  參數解釋如下:

  • 參數一: 窗口名稱(字符串) 
  • 參數二: 圖像對象,類型是numpy中的ndarray類型,註:這裡可以通過imutils模塊改變圖像顯示大小

2.3  圖像的保存函數 cv2.imwrite()

  cv2.imwrite()  函數檢查圖像保存到本地,官方定義如下:

cv2.imwrite(image_filename, image)

  參數解釋如下:

  • 參數一: 保存的圖像名稱(字符串) 
  • 參數二: 圖像對象,類型是numpy中的ndarray類型

3,圖像顯示窗口創建與銷毀

  當我們使用imshow函數展示圖像時,最後需要在程序中對圖像展示窗口進行銷毀,否則程序將無法正常終止,常用的銷毀窗口的函數有下面兩個:

(1)、cv2.destroyWindow(windows_name) #銷毀單個特定窗口 
參數: 將要銷毀的窗口的名字

(2)、cv2.destroyAllWindows() #銷毀全部窗口,無參數 

  那我們合適銷毀窗口,肯定不能圖片窗口一出現我們就將窗口銷毀,這樣便沒法觀看窗口,試想有兩種方式: 

  • (1) 讓窗口停留一段時間然後自動銷毀; 
  • (2) 接收指定的命令,如接收指定的鍵盤敲擊然後結束我們想要結束的窗口 

  以上兩種情況都將使用cv2.waitKey函數, 首先產看函數定義:

cv2.waitKey(time_of_milliseconds)

  唯一參數delay是整數,可正可負也可是零,含義和操作也不同,分別對應上面說的兩種情況。

(1) time_of_milliseconds > 0 :
此時time_of_milliseconds表示時間,單位是毫秒,
含義表示等待 time_of_milliseconds毫秒後圖像將自動銷毀,看以下示例

#表示等待10秒後,將銷毀所有圖像
if cv2.waitKey(10000):
    cv2.destroyAllWindows()

#表示等待10秒,將銷毀窗口名稱為'origin image'的圖像窗口
if cv2.waitKey(10000):
    cv2.destroyWindow('origin image')



(2) time_of_milliseconds <= 0 : 
此時圖像窗口將等待一個鍵盤敲擊,接收到指定的鍵盤敲擊便會進行窗口銷毀。
我們可以自定義等待敲擊的鍵盤,通過下面的例子進行更好的解釋

#當指定waitKey(0) == 27時當敲擊鍵盤 Esc 時便銷毀所有窗口
if cv2.waitKey(0) == 27:
    cv2.destroyAllWindows()

#當接收到鍵盤敲擊A時,便銷毀名稱為'origin image'的圖像窗口
if cv2.waitKey(-1) == ord('A'):
    cv2.destroyWindow('origin image')

  

指定窗口大小模式的屬性:

  • cv2.WINDOW_AUTOSIZE:根據圖像大小自動創建大小
  • cv2.WINDOW_NORMAL:窗口大小可調整
# 設置為WINDOW_NORMAL可以任意縮放
# cv.namedWindow('input_image', cv.WINDOW_NORMAL)

  代碼如下:

import cv2

img = cv2.imread("lena.jpg")

cv2.namedWindow("img", cv2.WINDOW_NORMAL)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

 

4,視頻的讀取,處理與保存

  cv2.VideoCapture(): 可以捕獲攝像頭,用數字來控制不同的設備,例如0,1。如果是視頻文件,直接指定好路徑即可。設備索引只是指定哪台攝像機的號碼,0代表第一台攝像機,1代表第二台攝像機。之後就可以逐幀捕獲視頻,但最後,不要忘記釋放捕獲。

  cap.read():返回一個布爾值(True / False)。如果幀被正確讀取,則返回true,否則返回false。可以通過檢查這個返回值來判斷視頻是否結束。  

  cap.isOpened():檢查cap是否被初始化。若沒有初始化,則使用cap.open()打開它。當cap沒有初始化時,上面的代碼會報錯。  

  retval,image= cv2.VideoCapture.read([,image]) 抓取,解碼並返回下一個視頻幀。返回值為true表明抓取成功。該函數是組合了grab()和retrieve(),這是最方便的方法。如果沒有幀,該函數返回false,並輸出空圖像。
  retval, image = cv2.VideoCapture.retrieve([, image[, flag]]) 解碼並返回抓取的視頻幀
  retval = cv2.VideoCapture.grab() 從視頻文件或相機中抓取下一幀。true為抓取成功。該函數主要用於多攝像頭時。
  cv2.VideoCapture.release() 關閉視頻文件或相機設備。

  cap.get(propId):訪問視頻的某些功能,其中propId是一個從0到18的數字,每個數字表示視頻的屬性(Property Identifier)。其中一些值可以使用cap.set(propId,value)進行修改,value是修改後的值。
  舉個例子:我通過cap.get(3)和cap.get(4)來檢查幀的寬度和高度,默認的值是640×480。但我想修改為320×240,可以使用ret = cap.set(3, 320)和ret = cap.set(4, 240)。

propId 常見取值如下:

  • cv2.CAP_PROP_POS_MSEC:     視頻文件的當前位置(ms)
  • cv2.CAP_PROP_POS_FRAMES:   從0開始索引幀,幀位置。
  • cv2.CAP_PROP_POS_AVI_RATIO:視頻文件的相對位置(0表示開始,1表示結束)
  • cv2.CAP_PROP_FRAME_WIDTH:  視頻流的幀寬度。
  • cv2.CAP_PROP_FRAME_HEIGHT: 視頻流的幀高度。
  • cv2.CAP_PROP_FPS:          幀率
  • cv2.CAP_PROP_FOURCC:       編解碼器四字符代碼
  • cv2.CAP_PROP_FRAME_COUNT:  視頻文件的幀數
  • cv2.CAP_PROP_FORMAT:       retrieve()返回的Mat對象的格式。
  • cv2.CAP_PROP_MODE:         後端專用的值,指示當前捕獲模式
  • cv2.CAP_PROP_BRIGHTNESS:圖像的亮度,僅適用於支持的相機
  • cv2.CAP_PROP_CONTRAST:  圖像對比度,僅適用於相機
  • cv2.CAP_PROP_SATURATION:圖像飽和度,僅適用於相機
  • cv2.CAP_PROP_HUE:       圖像色調,僅適用於相機
  • cv2.CAP_PROP_GAIN:      圖像增益,僅適用於支持的相機
  • cv2.CAP_PROP_EXPOSURE:    曝光,僅適用於支持的相機
  • cv2.CAP_PROP_CONVERT_RGB:布爾標誌,指示是否應將圖像轉換為RGB。

  視頻讀取與處理代碼:

import cv2

# 參數為視頻文件目錄
videoc = cv2.VideoCapture('test.mp4')
# VideoCapture對象,參數可以是設備索引或視頻文件名稱,設備索引只是指定哪台攝像機的號碼
# 0代表第一台攝像機,1代表第二台攝像機,之後可以逐幀捕獲視頻,但是最後需要釋放捕獲
# 調用內置攝像頭
# cap = cv2.VideoCapture(0)
# 調用USB攝像頭
# cap = cv2.VideoCapture(1)


# 檢查是否打開正確
if videoc.isOpened():
    open, frame = videoc.read()
else:
    open = False

# 逐幀顯示實現視頻播放
while open:
    ret, frame = videoc.read()  # 讀取
    if frame is None:
        break
    if ret == True:
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        cv2.imshow('result', gray)
        if cv2.waitKey(10) & 0xFF == 27:  # 讀取完自動退出
        # if cv2.waitKey(1) & 0xFF == ord('q'):  # 讀完按 q 退出
            break

# 釋放攝像頭對象和窗口
videoc.release()
cv2.destroyAllWindows()

   解釋一下從文件中播放視頻: 和從相機捕獲視頻相同,只需要更改相機索引和視頻文件名。在顯示幀時,選擇適當地 cv2.waitKey() 時間,如果該值太小,視頻會非常快,如果他太大,則視頻會非常慢(這可以用慢動作顯示視頻)。正常情況下 25毫秒即可。

  保存視頻:我們需要創建一個 VideoWriter對象,指定輸出文件名(例如:output.avi)。之後指定 FourCC代碼(FourCC是用於指定視頻編碼解碼器的四位元組代碼,可用的代碼列標://www.fourcc.org/codecs.php)。接下來傳遞每秒幀數(FPS)和幀大小,最後一個是 isColor標註,如果他為TRUE,編碼器編碼成彩色幀,否則編碼成灰度框幀。

  視頻保存代碼:

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

# Define the codec and create VideoWriter object
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(cap.isOpened()):
    ret, frame = cap.read()
    if ret==True:
        frame = cv2.flip(frame,0)

        # write the flipped frame
        out.write(frame)

        cv2.imshow('frame',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break

# Release everything if job is finished
cap.release()
out.release()
cv2.destroyAllWindows()

 

OpenCV提供了接口VideoWriter 用於視頻的保存:

<VideoWriter object> = cv.VideoWriter( filename, fourcc, fps, frameSize[, isColor] )

函數參數:

  • filename:給要保存的視頻起個名字
  • fourcc:指定視頻編解碼器的4位元組代碼
  1. 【(『P』,『I』,『M』,『1』)是MPEG-1編解碼器】
  2. 【(『M』,『J』,『P』,’G ‘)是一個運動jpeg編解碼器】
  • fps:幀率
  • frameSize:幀大小
  • retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 ) 將4字符串接為fourcc代碼。
  • cv.VideoWriter.write( image ) 將幀圖像保存為視頻文件。
  • isColor:如果為true,則視頻為彩色,否則為灰度視頻,默認為true

5,圖像ROI

  ROI(Region of Interest)表示感興趣區域。感興趣區域,就是我們從圖像中選擇一個圖像區域,這個區域就是圖像分析所關注的焦點。我們圈定這個區域,那麼我們要處理的圖像就是堯從一個大圖像變為小圖像區域了,這樣以便進行進一步處理,可以大大減少處理時間。

  ROI 也是使用Numpy 索引來獲得的,其本質上是多維數組(矩陣)的切片,如下圖所示:

   其實,原理很簡單,就是利用數組切片和索引操作來選擇指定區域的內容,通過像素矩陣可以直接獲取ROI區域,如 img[200:400,  200: 400]。Rect 四個形參分別是:x坐標,y坐標,長,高,注意(x,  y)指的是矩形的左上角點。

  比如我要獲取歐文的頭,圖如下:

   簡易的矩形ROI區域獲取代碼如下

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 讀取原始圖像
img = cv2.imread('irving.jpg')
# print(img.shape)  # (458, 558, 3)

# 我們自己計算要獲取的頭部的大小,以及左上角的坐標
# 這裡左上角的坐標為:w:h=250 7  區域為100*100
roi_zero = img[7:107, 250:350]

# 顯示圖像
cv2.imshow("Image", roi_zero)

# 等待顯示
cv2.waitKey(0)
cv2.destroyAllWindows()

   結果如下:

 

 

6,圖像寬,高,通道數獲取

  img.shape 返回圖像高(圖像矩陣的行數),寬(圖像矩陣的列數)和通道數3個屬性組成的元組,若圖像是非彩色圖(即灰度圖,二值圖等),則只返回高和寬組成的元組。

import cv2

img = cv2.imread("1.jpg")
imgGrey = cv2.imread("1.jpg", 0)

sp1 = img.shape
sp2 = imgGrey.shape

print(sp1)
print(sp2)# ======輸出=======#(1200, 1920, 3)#(1200, 1920)

 

7,圖像像素數目和圖像數據類型的獲取

  圖像矩陣img 的 size屬性和 dtype 分別對應圖像的像素總數目和圖像數據類型。一般情況下,圖像的數據類型是 uint8。

  通過size關鍵字獲取圖像的像素數目,其中灰度圖像返回行數*列數彩色圖像返回行數*列數*通道數

  通過dtype關鍵字獲取圖像的數據類型,通常返回 uint8

  代碼如下:

# -*- coding:utf-8 -*-
import cv2
import numpy

#讀取圖片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)

#獲取圖像形狀
print(img.shape)

#獲取像素數目
print(img.size)

#獲取圖像類型
print(img.dtype)

  結果如下:

(615, 327, 3)

603315   # 603315=615*327*3

uint8

  注意1:如果圖像是灰度圖,返回值僅有行數和列數,所以通過檢查這個返回值就可以知道加載的是灰度圖還是彩色圖。img.size可以返回圖像的像素數目。

  注意2:在debug時, img.dtype 非常重要,因為在OpenCV Python代碼中經常出現數據類型的不一致。

8,生成指定大小的空圖像

  生成指定大小的空圖形,方便我們後續填充,空圖形是黑色的圖(因為指定的是0)。

import cv2
import numpy as np

img = cv2.imread("1.jpg")
imgZero = np.zeros(img.shape, np.uint8)

imgFix = np.zeros((300, 500, 3), np.uint8)
# imgFix = np.zeros((300,500),np.uint8)

cv2.imshow("img", img)
cv2.imshow("imgZero", imgZero)
cv2.imshow("imgFix", imgFix)
cv2.waitKey()

  

9,訪問和操作圖像像素

  OpenCV中圖像矩陣的順序是 B,G,R。可以直接通過坐標位置訪問和操作圖像像素。

import cv2
 
img = cv2.imread("01.jpg")
 
numb = img[50,100]
print(numb)
 
img[50,100] = (0,0,255)
cv2.imshow("img",img)
cv2.waitKey()

   分開訪問圖像某一通道像素值也非常方便(下面代碼將圖像變為白色,即255):

import cv2
 
img = cv2.imread("01.jpg")
 
img[0:100,100:200,0] = 255
img[100:200,200:300,1] = 255
img[200:300,300:400,2] = 255
 
cv2.imshow("img",img)
cv2.waitKey()

   Python中,更改圖像某一矩形區域的像素值也很方便。

import cv2
 
img = cv2.imread("01.jpg")
 
img[0:50,1:100] = (0,0,255)
 
cv2.imshow("img",img)
cv2.waitKey()

   注意:優化

  首先我們需要讀入一幅圖像,然後根據像素的行和列的坐標獲取它的像素值。對BGR圖像而言,返回值為B,G,R的值,對灰度圖像而言,會返回它的灰度值(亮度? intensity)

import cv2
import numpy as np

img=cv2.imread('test.jpg')
px=img[100,100]
print(px)
blue=img[100,100,0]
print(blue)

# 我們可以使用類似的方式修改像素值
img[100,100]=[255,255,255]
print(img[100,100])
## [255 255 255]

  注意1:Numpy 是經過優化了的進行快速矩陣運算的軟件包,所以我們不推薦逐個獲取像素值並修改,這樣會很慢,能有矩陣運算就不要循環。

  注意2:上面提到的方法被用來選取矩陣的一個區域,比如說 前 5行的後3列。對於獲取每一個像素值,也許使用Numpy 的 array.item()  和 array.itemset()  會更好,但是返回是標量。如果你想獲得所有 B,G,R的值,你需要使用 array.item() 分割他們。

  獲取像素值及其修改的更好的方法

import cv2
import numpy as np

img=cv2.imread('test.jpg')
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
# 59
# 100

  

10,圖像顏色通道分離與合併

  分離圖像通道可以使用 cv2中 split函數,合併則可以使用 merge函數。

import cv2
 
img = cv2.imread("01.jpg")
 
b , g , r = cv2.split(img)
 
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]
 
merged = cv2.merge([b,g,r])
 
cv2.imshow("Blue",b)
cv2.imshow("Green",g)
cv2.imshow("Red",r)
 
cv2.imshow("Merged",merged)
cv2.waitKey()

    有時候,我們需要對 BGR 三個通道分別進行操作,這時你就需要把BGR拆分成單個通道,有時你需要把獨立通道的圖片合成一個BGR圖像。下面學習一下拆分及其合併圖像通道的cv函數  

  代碼如下:

# _*_coding:utf-8_*_
import cv2
import numpy as np


def split_image(img_path):
    img = cv2.imread(img_path)
    print(img.shape)  # (800, 800, 3)
    # b, g, r = cv2.split(img)
    b = img[:, :, 0]
    g = img[:, :, 1]
    r = img[:, :, 2]
    cv2.imshow('b', b)
    # cv2.imshow('g', g)
    # cv2.imshow('r', r)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


def merge_image(img_path):
    img = cv2.imread(img_path)
    b, g, r = cv2.split(img)
    img = cv2.merge([b, g, r])
    cv2.imshow('merge', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    img_path = 'durant.jpg'
    split_image(img_path)
    # merge_image(img_path)

  注意:這裡拆分寫了兩個方法,為什麼呢?就是因為 cv2.split()是一個比較耗時的操作,只有真正需要時才用它,能用Numpy索引就盡量使用索引。

  原圖:

   B,G,R 三種通道的圖片:

  合併後的圖片

   假設,我們想是所有像素的紅色通道值都為0,我們不必先拆分再賦值,我們可以直接使用 Numpy 索引,這樣會更快:

def assign_image(img_path):
    img = cv2.imread(img_path)
    img[:, :, 1] = 0
    cv2.imshow('assign', img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()


if __name__ == '__main__':
    img_path = 'durant.jpg'
    assign_image(img_path)

  結果如下:

 

11,在圖像上輸出文字

使用putText函數在圖片上輸出文字,函數原型:

putText(img, text, org, fontFace, fontScale, color, thickness=None, lineType=None, bottomLeftOrigin=None)

   參數意思:

      1. img: 圖像
      2. text:要輸出的文本
      3. org: 文字的起點坐標
      4. fontFace: 字體
      5. fontScale: 字體大小
      6. color: 字體顏色
      7. thickness: 字圖加粗

   代碼如下:

import cv2

img = cv2.imread("durant.jpg")

cv2.putText(img, "durant is my favorite super star", (100, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255))

cv2.imshow("img", img)
cv2.waitKey()

   圖如下:

 

12, 圖像縮放

  cv2.resize()函數是來調整圖片的大小,改變圖片尺寸。

  注意:CV2是BGR,而我們讀取的圖片是RGB,所以要注意一下,變換的時候注意對應。

  其函數原型如下:

def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None)

  對應的各個參數意思:

  src:輸入,原圖像,即待改變大小的圖像;

  dsize:輸出圖像的大小。如果這個參數不為0,那麼就代表將原圖像縮放到這個Size(width,height)指定的大小;如果這個參數為0,那麼原圖像縮放之後的大小就要通過下面的公式來計算:

              dsize = Size(round(fx*src.cols), round(fy*src.rows))

其中,fx和fy就是下面要說的兩個參數,是圖像width方向和height方向的縮放比例。

  fx:width方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.width/src.cols來計算;

  fy:height方向的縮放比例,如果它是0,那麼它就會按照(double)dsize.height/src.rows來計算;

  interpolation:這個是指定插值的方式,圖像縮放之後,肯定像素要進行重新計算的,就靠這個參數來指定重新計算像素的方式,有以下幾種:

  • INTER_NEAREST                 – 最鄰近插值
  • INTER_LINEAR                     – 雙線性插值,如果最後一個參數你不指定,默認使用這種方法
  • INTER_AREA                         –  使用像素區域關係進行重採樣    resampling using pixel area relation. It may be a preferred method for image decimation, as it gives moire』-free results. But when the image is zoomed, it is similar to the INTER_NEAREST method.
  • INTER_CUBIC                      – 4×4像素鄰域內的雙立方插值
  • INTER_LANCZOS4             – 8×8像素鄰域內的Lanczos插值

  對於插值方法,正常情況下使用默認的雙線性插值法就夠了。幾種常用方法的效率為:

最鄰近插值>雙線性插值>雙立方插值>Lanczos插值

  但是效率和效果是反比的,所以根據自己的情況酌情使用。

  注意:輸出的尺寸格式為(寬,高)

  示例:

# _*_coding:utf-8_*_
import cv2

image = cv2.imread('TestData\\arial_qz8Shv_10.png')
# 對圖片進行灰度化,注意這裡變換!!
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

crop_img = cv2.resize(gray, (224, 224), interpolation=cv2.INTER_LANCZOS4)

  

  代碼如下:

import cv2

img = cv2.imread("1.jpg")
cv2.imshow("img", img)

imgg = cv2.resize(img, (200, 100))

cv2.imshow("imgg", imgg)

cv2.waitKey()

 

13   cv2.cvtColor()函數用法介紹

  在日常生活中,我們看到的大多數彩色圖像都是RGB類型,但是在圖像處理過程中,常常需要用到灰度圖像、二值圖像、HSV、HSI等顏色,OpenCV提供了cvtColor()函數實現這些功能。其函數原型如下所示:

cvtColor(src, code, dst=None, dstCn=None)

  變量含義:

  • src表示輸入圖像,需要進行顏色空間變換的原圖像
  • dst表示輸出圖像,其大小和深度與src一致
  • code表示轉換的代碼或標識
  • dstCn表示目標圖像通道數,其值為0時,則有src和code決定

  該函數的作用是將一個圖像從一個顏色空間轉換到另一個顏色空間,其中,RGB是指Red、Green和Blue,一副圖像由這三個通道(channel)構成;Gray表示只有灰度值一個通道;HSV包含Hue(色調)、Saturation(飽和度)和Value(亮度)三個通道。在OpenCV中,常見的顏色空間轉換標識包括CV_BGR2BGRA、CV_RGB2GRAY、CV_GRAY2RGB、CV_BGR2HSV、CV_BGR2XYZ、CV_BGR2HLS等。
  下面代碼對比了九種常見的顏色空間,包括BGR、RGB、GRAY、HSV、YCrCb、HLS、XYZ、LAB和YUV,並循環顯示處理後的圖像。

#encoding:utf-8
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#讀取原始圖像
img_BGR = cv2.imread('miao.png')

#BGR轉換為RGB
img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)

#灰度化處理
img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)

#BGR轉HSV
img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)

#BGR轉YCrCb
img_YCrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)

#BGR轉HLS
img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)

#BGR轉XYZ
img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)

#BGR轉LAB
img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)

#BGR轉YUV
img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)

#調用matplotlib顯示處理結果
titles = ['BGR', 'RGB', 'GRAY', 'HSV', 'YCrCb', 'HLS', 'XYZ', 'LAB', 'YUV']  
images = [img_BGR, img_RGB, img_GRAY, img_HSV, img_YCrCb,
          img_HLS, img_XYZ, img_LAB, img_YUV]  
for i in xrange(9):  
   plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')  
   plt.title(titles[i])  
   plt.xticks([]),plt.yticks([])  
plt.show()

  如果想查看參數的全部類型,請執行以下程序便可查閱,總共有274種空間轉換類型:

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

 

 

 

參考文獻://blog.csdn.net/woainishifu/article/details/53260546

//blog.csdn.net/eastmount/article/details/82177300

//www.cnblogs.com/Undo-self-blog/p/8434906.html

//www.cnblogs.com/zlel/p/9267629.html

視頻讀取://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_gui/py_video_display/py_video_display.html

//blog.csdn.net/qq_25436597/article/details/79621833

//zhuanlan.zhihu.com/p/44255577