這篇隨筆介紹使用OpenCV進行圖像處理的第三章 色彩空間。
3 色彩空間
之前的介紹,大多是基於BGR色彩空間進行的,但針對不同的實際情況,研究人員提出了許多色彩空間,它們都有各自擅長處理的領域。所以,我們需要學習如何對不同色彩空間的圖像進行轉換映射。
3.1 色彩空間及類型轉換函數
(一)色彩空間
常見的色彩空間有GRAY色彩空間、HSV色彩空間、YCrCb色彩空間、CMYK色彩空間、XYZ色彩空間、YUV色彩空間等(顏色模型)。
我們只展示出GRAY灰度模型轉換為RGB顏色模型的方式:
Gray=0.299R+0.587G+0.114B
以后需要用到其他哪種顏色模型之間的轉化,百度即可(手動狗頭)
(二)類型轉換函數
OpenCV提供了不同色彩空間進行轉化的函數語法,如下:
dst=cv2.cvtColor(src,code [, dstCn])
其中,dst表示輸出圖像,src表示輸入圖像,code是色彩空間轉換代碼(枚舉值太多,百度可得),dstCn是圖像的通道數(不寫默認為自動獲得)。
3.2 類型轉換實例
本節通過一個實例的代碼,展示cv2.cvtColor()函數的用法及功能。
實例:將BGR模式轉換為灰度圖像,再將灰度圖像轉換為RGB模式。
1 #將BGR模式轉換為灰度圖像,再將灰度圖像轉換為RGB模式
2 import cv2 3 import numpy as np 4 bgr=np.random.randint(0,256,size=[2,4,3],dtype=np.uint8) #生成2×4×3的BGR圖像
5 gray=cv2.cvtColor(bgr,cv2.COLOR_BGR2GRAY) #BGR圖像轉換為灰度圖像
6 rgb=cv2.cvtColor(gray,cv2.COLOR_GRAY2RGB) #灰度圖像轉換為RGB圖像
7 print('bgr=\n',bgr) 8 print('gray=\n',gray) 9 print('rgb=\n',rgb)
3.3 HSV色彩空間應用
實際中,我們經常使用HSV色彩空間來感知色調、飽和度、亮度。
色調(Hue):取值范圍是[0,360]
飽和度(Saturation):取值范圍是[0,1]
亮度(Value):取值范圍是[0,1]
下面我們通過兩個舉例,來學習HSV色彩空間的代碼及功能。
舉例一:在OpenCV中測試BGR圖像的不同顏色變換到HSV色彩空間后,各個分量的值。
1 #在OpenCV中測試BGR圖像的不同顏色變換到HSV色彩空間后,各個分量的值
2 import cv2 3 import numpy as np 4 #------------測試OpenCV中藍色分量的值-----------
5 imgBlue=np.zeros([1,1,3],dtype=np.uint8) 6 imgBlue[0,0,0]=255 #0號通道代表藍色
7 Blue=imgBlue 8 BlueHSV=cv2.cvtColor(Blue,cv2.COLOR_BGR2HSV) #BGR模式的藍色變換到HSV色彩空間
9 print('Blue=\n',Blue) 10 print('BlueHSV=\n',BlueHSV) 11 #------------測試OpenCV中綠色分量的值-----------
12 imgGreen=np.zeros([1,1,3],dtype=np.uint8) 13 imgGreen[0,0,1]=255 #1號通道代表綠色
14 Green=imgGreen 15 GreenHSV=cv2.cvtColor(Green,cv2.COLOR_BGR2HSV) #BGR模式的綠色變換到HSV色彩空間
16 print('Green=\n',Green) 17 print('GreenHSV=\n',GreenHSV) 18 #------------測試OpenCV中紅色分量的值-----------
19 imgRed=np.zeros([1,1,3],dtype=np.uint8) 20 imgRed[0,0,2]=255 #2號通道代表紅色
21 Red=imgRed 22 RedHSV=cv2.cvtColor(Red,cv2.COLOR_BGR2HSV) #BGR模式的紅色變換到HSV色彩空間
23 print('Red=\n',Red) 24 print('RedHSV=\n',RedHSV)
舉例二:調整HSV色彩空間內V通道的值,觀察其處理結果。
1 #調整HSV色彩空間內V通道的值,觀察其處理結果,以實現藝術效果
2 import cv2 3 img=cv2.imread('E:/python_opencv/tupian.jpg') 4 hsv=cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #BGR模式轉換為HSV模式
5 h,s,v=cv2.split(hsv) #通道拆分
6 v[:,:]=255 #V通道置為255
7 newHSV=cv2.merge([h,s,v]) #通道合並為新的HSV圖片
8 art=cv2.cvtColor(newHSV,cv2.COLOR_HSV2BGR) #HSV模式轉換為BGR模式
9 cv2.imshow('img',img) 10 cv2.imshow('art',art) 11 cv2.waitKey() 12 cv2.destroyAllWindows()
3.4 Alpha通道
在RGB色彩空間的基礎上,還可以加一個A通道,叫做Alpha通道,此時原圖像類型轉變為RGBA模式,例如常見的PNG類型圖像就是RGBA色彩空間的。Alpha通道的取值范圍是[0,1]或[0,255],表示從透明到不透明。
下面是一個舉例,展示Alpha通道的代碼和分析:
1 #編寫程序,分析alpha通道的值
2 import cv2 3 import numpy as np 4 img=np.random.randint(0,256,size=[2,3,3],dtype=np.uint8) #生成2×3×3的BGR圖像
5 bgra=cv2.cvtColor(img,cv2.COLOR_BGR2BGRA) 6 print('img=\n',img) 7 print('bgra=\n',bgra) 8 b,g,r,a=cv2.split(bgra) 9 print('a=\n',a) 10 a[:,:]=125
11 bgra=cv2.merge([b,g,r,a]) 12 print('bgra=\n',bgra)
這次內容就分享到這里了,下次繼續更新第4章圖像的幾何變換,希望與各位老師和小伙伴們交流學習~