1.常見色彩空間

1.1. 灰階 (Gray) 色彩空間

指8位元的灰階圖,像素值介於 0~255。RGB轉換成GRAY色彩空間,公式如下:

GRAY = 0.299 * R + 0.587 * G + 0.114 * B


1.2. YCbCr 色彩空間

Y即光源亮度,就是所謂的流明(luminance),Cb為紅色分量資訊,Cb表藍色分量資訊。通常會用於影片中的影像連續處理。


1.3. HSV 色彩空間

HSV(Hue:色調、色相;Saturation:飽和度、Value:明度),也稱HSB(B指Brightness)。HSV是從人眼視覺角度出發。

  • 色調:指光的顏色,光的不同波長顯示不同的顏色。
  • 飽和度:指色彩深淺程度,也就是相對純淨度,顏色混合白光的數量,混越多白光越不純。
  • 亮度:指人眼感受到光的明亮程度。白色的成份越多,亮度越高。黑色成份越高,亮度約低。


1.4. HSL 色彩空間

HSL(Hue:色相;Saturation:飽和度;Lightness/Luminance:亮度),也稱HLS或HSI(I指Intensity)與HSV非常相似,僅用亮度(Lightness)替代了明度(Brightness)。二者區別在於,一種純色的明度等於白色的明度,而純色的亮度等於中度灰的亮度。


1.5. CIEL*a*b*

正式定義一個色彩空間時通常採用的標準是CIELAB色彩空間,他們是為了涵蓋正常人可見範圍所有色彩所設計提出的,因此是最精確的色彩空間,但過於複雜,不適合於日常使用。


2.常見色彩空間轉換實作

2.1. BGR模式轉RGB模式

OpenCV預設的模式為BGR,如果轉換成RGB,效果如右圖。

<Source:Greatway9999>


程式如下:

# BGR to RGB

import numpy as np

import cv2


img = cv2.imread('Lenna.jpg')

rgb_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)


cv2.imshow('BGR', img)

cv2.imshow('RGB', rgb_img)


cv2.waitKey()

cv2.destroyAllWindows()


2.2. 篩選指定像素範圍

使用 cv2.inRange() 的指令,符合範圍內的像素皆會轉換成255的值。以左圖為例,篩選的範圍為0~100,因此符合0~100的像素值皆轉變成255(白色),如右圖所示。換言之右圖中呈現白色的部份即為篩選像素值的範圍。

<Source:Greatway9999>

程式如下:

#篩選指定像素範圍

import numpy as np

import cv2


img = cv2.imread('Lenna.jpg', cv2.IMREAD_GRAYSCALE)

filter_img = cv2.inRange(img, 0, 100)


cv2.imshow('original', img)

cv2.imshow('filter_img', filter_img)


print(filter_img)


cv2.waitKey()

cv2.destroyAllWindows()


2.3. 篩選指定膚色範圍

承2.2.內容之技巧,我們也可以針對人物圖片,篩選指定範圍的顏色。以Hue(色調)範圍為5~170,Saturation(飽和度)範圍為25~166為條件,進行顏色篩選,結果如右圖。

<Source:Greatway9999>

程式如下:

#擷取指定顏色

import numpy as np

import cv2


img = cv2.imread('Lenna.jpg')

img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

h, s, v = cv2.split(img_hsv)

minHue = 5

maxHue = 170

hus_mask = cv2.inRange(h, minHue, maxHue)


minSat = 25

maxSat = 166

sat_mask = cv2.inRange(s, minSat, maxSat)


mask = hus_mask & sat_mask


ROI_img = cv2.bitwise_and(img, img, mask=mask)


cv2.imshow('original', img)

cv2.imshow("ROI_img",ROI_img)


cv2.waitKey()

cv2.destroyAllWindows()


2.4. alpha(透明度)通道實作

在RGB色彩空間中可加一個alpha通道,表示透明度。作法為將圖片轉換成BGRA的模式,再將B、G、R、A分離,取A調整數值後再將B、G、R、A合併。效果如下:

<Source:Greatway9999>

程式如下:

#對影像的alpha通道進行處理

#alpha通道表示透明度,值從0~255。

import numpy as np

import cv2


img = cv2.imread('Lenna.jpg')

bgra_img = cv2.cvtColor(img, cv2.COLOR_BGR2BGRA)

b, g, r, a = cv2.split(bgra_img)

a[:,:] = 125

bgra_img_125 = cv2.merge([b, g, r, a])


a[:,:] = 0

bgra_img_0 = cv2.merge([b, g, r, a])


cv2.imshow('original', img)

cv2.imshow('bgra_img', bgra_img)

cv2.imshow('bgra_img_125', bgra_img_125)

cv2.imshow('bgra_img_0', bgra_img_0)


cv2.imwrite('bgra_img.png', bgra_img)

cv2.imwrite('bgra_img_125.png', bgra_img_125)

cv2.imwrite('bgra_img_0.png', bgra_img_0)


cv2.waitKey()

cv2.destroyAllWindows()


本文之Github Code:https://github.com/greatway9999/OpenCV_Basic/blob/main/2_Color_Space_Conversion.ipynb

#色彩空間轉換

---

參考資料:


0 留言