[OpenCV筆記] 2.色彩空間轉換
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 留言