【OpenCV人臉檢測】2. 色彩空間及其轉換

【 1. 色彩空間 】

  • 色彩空間(Color space)是對色彩的組織方式,是座標系統和子空間的闡述,位於系統的每種顏色都有單個點表示。

  • 目前,色彩空間已經有上百種表示方式,被採用的大多數色彩空間都是面向硬件或面向應用的,大部分只是局部的改變或專用於某一領域。

  • RGB色彩空間

  • 使用紅色、綠色和藍色這三種原色生成不同的顏色,這些顏色可以組成了一個色彩空間,稱爲RGB(Red Green Blue)色彩空間
  • OpenCV中默認的色彩空間是BGR。BGR與RGB的區別只是三個顏色信道的位置發生了變化,實際上原理相同。
    ( 爲什麼是BGR而不是RGB呢?原因在於當時主流的攝像頭製造商和軟件供應商都普遍使用這種BGR格式,所以所以一開始時OpenCV採用的就是BGR,然後沿用至今。)
  • RGB是依據人眼識別的顏色定義出的空間,可表示大部分顏色。它是最通用的面向硬件的色彩空間。該色彩空間用於彩色監視器和一大類彩色視頻攝像。

完整的RGB色彩空間圖:
在RGB色彩空間中,將藍色的量定義爲X座標軸、紅色的量定義爲Y座標軸、綠色的量定義爲Z座標軸,就可以得到一個三維空間。所以每種顏色在這個三維空間中都有唯一的一個點與其對應。
在這裏插入圖片描述

  • HSV與HSL色彩空間

在科學研究一般不採用RGB色彩空間,它將色調,亮度,飽和度三個量放在一起表示,很難分開,這樣難以對其進行數字化的調整。所以爲了更好的數字化處理顏色,提出了HSVHSL兩個色彩空間。

HSV色彩空間中,H是色調(hue),S是飽和度(saturation), V是明度(value)。
HSL色彩空間中,H是色調(hue),S是飽和度(saturation),L是亮度(lightness) 。

  • 灰度空間

  • 在OpenCV的灰度空間中,和一般的色彩空間相同,每一個顏色都有三個量,但是隻有第一個亮度有值,所以表示爲(亮度,0,0)。
  • 其中,亮度是根據如下灰度公式計算而得:
    Gray=R0.299+G0.587+B0.114Gray = R*0.299 + G*0.587 + B*0.114
  • 人臉識別需要先對圖片進行灰度處理的原因:
    識別人臉,最關鍵的因素是梯度,梯度代表着邊緣,用灰度圖計算梯度,可以簡化矩陣, 提高運算速度。而顏色信息,很容易受到光照等因素的影響,同類的物體顏色有很多變化,所以顏色本身難以提供關鍵信息。

【 2. 色彩空間轉換 】

在OpenCV中有超過150種色彩空間轉換的方法。但是我們經常用到的是以下兩種:

  1. BGR空間到Gray空間 的轉換;
  2. BGR空間到HSV空間 的轉換。
  • 函數:
cv2.cvtColor(圖片對象,轉換類型)

其中的轉換類型:
對於BGR到Gray的轉換,爲cv2.COLOR_BGR2GRAY類型。
對於BGR到HSV的轉換,爲cv2.COLOR_BGR2HSV類型。

  • 範例:
import cv2 as cv
img = cv.imread('picture.jpg') # 讀取圖片

newpicture = cv.cvtColor(img, cv.COLOR_BGR2HSV) # 將圖片的色彩空間由BGR轉換爲HSV。
# newpicture = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 將圖片的色彩空間由BGR轉換爲GRAY。

cv.imshow('cute boy',newpicture) # 窗口展示圖片
cv.waitKey(0)  # 等待用戶關閉圖片窗口
cv.destroyAllWindows() # 銷燬創建的所有窗口

原圖:
在這裏插入圖片描述
灰度圖片:
在這裏插入圖片描述
HSV圖片:
在這裏插入圖片描述

#獲取到OpenCV提供的所有轉換類型: 。。有問題的代碼。。。。
import cv2
flags=[i for in dir(cv2) if i startswith('COLOR_')]
print(flags)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章