几种颜色空间(RGB,YUV,YIQ,HSI)的基本概念及转换
首先,我們先來了解下有關顏色的基本概念
一、色彩的基本概念
1、彩色的三要素
亮度:即人眼對光的明亮程度的感受。
色調:人眼能看到的顏色種類,與光的波長有關
飽和度:顏色深淺程度。與各種顏色混入白光的比例有關。
以上 色調 + 飽和度 = 色度
2、三基色原理
三基色可以通過適當比例的混合組成自然界中任何一種顏色
由于人眼對于紅綠藍三種色光最為敏感,并且由這三種顏色能組成的顏色范圍最廣,故一般選用RGB作為三基色
但是,三基色并不是唯一的,只要滿足任何一種顏色都不能由其他兩種顏色合成即可組成三基色。例如,我們還可以用黃色,品紅,青色組成三基色。
3、亮度的組成
4、常用的四種顏色空間
-
A、RGB顏色空間
RGB彩色空間利用相加混合法將三個彩色分量按照不同的比例疊加,最終就可以在屏幕中顯現出各種顏色。
任意的彩色光F都有一個配色的公式:F = r[R]+g[G]+b[B]
式中r,g,b為系數,r+g+b=1。故,知其二便可唯一確定色調。 -
B、YUV顏色空間
研究表面,人眼對于亮度的敏感度遠大于對于顏色細節的敏感度,因此,才彩色電視機系統中不采用RGB顏色空間,一般為以下的空間:
而采用YUV顏色空間的好處有:
a、解決了彩色電視機和黑白電視機的兼容問題(因為黑白電視機只需要提取信號中的Y信號即可顯示出來)
b、可以節省傳輸帶寬
一般情況下,數字化后的
Y:U:V = 8:4:4或者Y:U:V = 8:2:2,即亮度信號Y需要8比特表示,UV需要4個或者2個比特表示,我們知道,RGB顏色空間下,需要24比特來表示一個顏色,而利用YUV則僅需要16比特或者12比特,達到壓縮的目的。
在PAL制下,白光亮度Y和紅綠藍三色光的關系可以用以下公式表示:
Y = 0.222R + 0.707G + 0.071B
在NTSC制下,Y=0.299R+0.587G+0.114B
色差U,即藍基色分量與亮度的差值信號,可以用以下公式表示:
U = k1(B - Y)
色差V,即紅基色分量與亮度的差值信號,可以用以下公式表示:
V = k2(R - Y)
通常,k1 = 0.493,k2 = 0.877
YUV顏色空間與RGB顏色空間的轉換
- C、YIQ顏色空間
如上圖所示,YIQ顏色空間被NTSC制的彩色電視機使用。
其中Y還是亮度信號,用👇公式表示:
Y = 0.299R + 0.587G + 0.114B
I代表人眼敏感的色彩色差信號,用👇公式表示:
I = 0.596R - 0.275G - 0.321B’
Q代表人眼不敏感的色差信號,用👇公式表示:
Q = 0.212R - 0.523G + 0.311B
- D、HSI顏色空間(HSI)
色調H,飽和度為S,光強為V
上圖為博客:https://www.cnblogs.com/faith0217/articles/4264652.html
中的內容
二、編程實現提取圖像中一點的RGB顏色值,并實現RGB轉換為YUV,YIQ,HIS。
以下程序利用python實現
import math import numpy as np from PIL import Imageimgpath = 'C:/Users/11037/Desktop/7.jpg' #圖片路徑m_yuv = np.mat([[0.299,0.587,0.114],[-0.299,-0.587,0.886],[0.701,-0.587,-0.114]]) m_yiq = np.mat([[0.299,0.587,0.114],[0.596,-0.274,-0.322],[0.211,-0.524,0.312]])def rgb2yuv(need_rgb):ans = list([int(i) for i in m_yuv*need_rgb])return ansdef yuv2rgb(need_yuv):m = m_yuv.Ians = list([int(i) for i in m*need_yuv])return ansdef rgb2yiq(need_rgb):ans = list([int(i) for i in m_yiq*need_rgb])return ansdef yiq2rgb(need_yiq):m = m_yiq.Ians = list([int(i) for i in m*need_yiq])return ans''' def rgb2hsi(need_rgb:np.mat): rgb = list(need_rgb)r,g,b = int(rgb[0]),int(rgb[1]),int(rgb[2])theta = math.acos((((r-g)+(r-b))/2)/math.sqrt((r-g)**2+(r-b)*(g-b)))print('theta',theta)if b<=g:h = thetaelse:h = 360-thetas = 1-3*min(r,g,b)/(r+g+b)i = (r+g+b)/3return (h,s,i) '''img = Image.open(imgpath) img = np.array(img) print(img.shape) x = int(input('請輸入x:')) y = int(input('請輸入y:'))testrgb = np.mat(img[x,y]).T rgb2 = rgb2yuv(testrgb) print('需要轉換的rgb為:\n',testrgb) print('rgb轉yuv:',rgb2) print('yuv轉rgb:',yuv2rgb(np.mat(rgb2).T))三、利用OpenCV轉換RGB為HSV,YUV
1、代碼
import math import numpy as np import cv2 as cv import matplotlib.pyplot as pltimgpath = '' #圖片路徑img = cv.imread(imgpath)imggray = cv.cvtColor(img,cv.COLOR_BGR2GRAY) imghsv = cv.cvtColor(img,cv.COLOR_BGR2HSV) imgyuv = cv.cvtColor(img,cv.COLOR_BGR2YUV)plt.subplot(221),plt.imshow(img),plt.title('img') plt.subplot(222),plt.imshow(imggray),plt.title('imggray') plt.subplot(223),plt.imshow(imghsv),plt.title('imghsv') plt.subplot(224),plt.imshow(imgyuv),plt.title('imgyuv')plt.show()效果:
若發現錯誤請給予指出,謝謝~
總結
以上是生活随笔為你收集整理的几种颜色空间(RGB,YUV,YIQ,HSI)的基本概念及转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (4)ArcGIS 10.2 去除要素的
- 下一篇: H264系列(10):GOP之M和N值介