几种颜色空间(RGB,YUV,YIQ,HSI)的基本概念及转换
首先,我們先來了解下有關(guān)顏色的基本概念
一、色彩的基本概念
1、彩色的三要素
亮度:即人眼對(duì)光的明亮程度的感受。
色調(diào):人眼能看到的顏色種類,與光的波長有關(guān)
飽和度:顏色深淺程度。與各種顏色混入白光的比例有關(guān)。
以上 色調(diào) + 飽和度 = 色度
2、三基色原理
三基色可以通過適當(dāng)比例的混合組成自然界中任何一種顏色
由于人眼對(duì)于紅綠藍(lán)三種色光最為敏感,并且由這三種顏色能組成的顏色范圍最廣,故一般選用RGB作為三基色
但是,三基色并不是唯一的,只要滿足任何一種顏色都不能由其他兩種顏色合成即可組成三基色。例如,我們還可以用黃色,品紅,青色組成三基色。
3、亮度的組成
4、常用的四種顏色空間
-
A、RGB顏色空間
RGB彩色空間利用相加混合法將三個(gè)彩色分量按照不同的比例疊加,最終就可以在屏幕中顯現(xiàn)出各種顏色。
任意的彩色光F都有一個(gè)配色的公式:F = r[R]+g[G]+b[B]
式中r,g,b為系數(shù),r+g+b=1。故,知其二便可唯一確定色調(diào)。 -
B、YUV顏色空間
研究表面,人眼對(duì)于亮度的敏感度遠(yuǎn)大于對(duì)于顏色細(xì)節(jié)的敏感度,因此,才彩色電視機(jī)系統(tǒng)中不采用RGB顏色空間,一般為以下的空間:
而采用YUV顏色空間的好處有:
a、解決了彩色電視機(jī)和黑白電視機(jī)的兼容問題(因?yàn)楹诎纂娨暀C(jī)只需要提取信號(hào)中的Y信號(hào)即可顯示出來)
b、可以節(jié)省傳輸帶寬
一般情況下,數(shù)字化后的
Y:U:V = 8:4:4或者Y:U:V = 8:2:2,即亮度信號(hào)Y需要8比特表示,UV需要4個(gè)或者2個(gè)比特表示,我們知道,RGB顏色空間下,需要24比特來表示一個(gè)顏色,而利用YUV則僅需要16比特或者12比特,達(dá)到壓縮的目的。
在PAL制下,白光亮度Y和紅綠藍(lán)三色光的關(guān)系可以用以下公式表示:
Y = 0.222R + 0.707G + 0.071B
在NTSC制下,Y=0.299R+0.587G+0.114B
色差U,即藍(lán)基色分量與亮度的差值信號(hào),可以用以下公式表示:
U = k1(B - Y)
色差V,即紅基色分量與亮度的差值信號(hào),可以用以下公式表示:
V = k2(R - Y)
通常,k1 = 0.493,k2 = 0.877
YUV顏色空間與RGB顏色空間的轉(zhuǎn)換
- C、YIQ顏色空間
如上圖所示,YIQ顏色空間被NTSC制的彩色電視機(jī)使用。
其中Y還是亮度信號(hào),用👇公式表示:
Y = 0.299R + 0.587G + 0.114B
I代表人眼敏感的色彩色差信號(hào),用👇公式表示:
I = 0.596R - 0.275G - 0.321B’
Q代表人眼不敏感的色差信號(hào),用👇公式表示:
Q = 0.212R - 0.523G + 0.311B
- D、HSI顏色空間(HSI)
色調(diào)H,飽和度為S,光強(qiáng)為V
上圖為博客:https://www.cnblogs.com/faith0217/articles/4264652.html
中的內(nèi)容
二、編程實(shí)現(xiàn)提取圖像中一點(diǎn)的RGB顏色值,并實(shí)現(xiàn)RGB轉(zhuǎn)換為YUV,YIQ,HIS。
以下程序利用python實(shí)現(xiàn)
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('請(qǐng)輸入x:')) y = int(input('請(qǐng)輸入y:'))testrgb = np.mat(img[x,y]).T rgb2 = rgb2yuv(testrgb) print('需要轉(zhuǎn)換的rgb為:\n',testrgb) print('rgb轉(zhuǎn)yuv:',rgb2) print('yuv轉(zhuǎn)rgb:',yuv2rgb(np.mat(rgb2).T))三、利用OpenCV轉(zhuǎn)換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()效果:
若發(fā)現(xiàn)錯(cuò)誤請(qǐng)給予指出,謝謝~
總結(jié)
以上是生活随笔為你收集整理的几种颜色空间(RGB,YUV,YIQ,HSI)的基本概念及转换的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (4)ArcGIS 10.2 去除要素的
- 下一篇: H264系列(10):GOP之M和N值介