圖像色彩空間與應(yīng)用轉(zhuǎn)換
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
引言
重新寫了一下圖像色彩空間相關(guān)的知識,希望給大家多一點背景多點了解,不說別的,看完了肯定會漲知識。
圖像處理最基礎(chǔ)的知識點之一就是圖像色彩跟顏色模型,對計算機來說表示一張圖
像,只是一些零壹的二進制值,但是對人眼來說看到的都是一些可見光,而且人眼只對三種可見光比較敏感,分別是紅色(red)、綠色(green)、藍色(blue)。這個就是最基本的RGB顏色模型,三種顏色的波長范圍表示如下:

Blue: 450–495 nmGreen: 495–570 nmYellow: 570–590 nm
針對人眼對顏色這個物理現(xiàn)象的生物感知表達模型,國際照明協(xié)會在1931年發(fā)布了一個顏色模型/色彩空間,表示如下:

因此就出現(xiàn)了對應(yīng)顏色模型的色彩空間CIE XYZ模型,對于的表示色度跟亮度表示,圖示如下:

從這個上面看不到Z,其實Z是表示顏色得亮度,或者深度,所以CIE XYZ顏色模型的這個圖又被稱為CIE 色度圖。CIE XYZ顏色模型表示的范圍比較大,所以后來微軟跟惠普就提出了一個它的子集的顏色模型sRGB色彩空間,其中S是英文單詞標準的首字母,sRGB色彩空間的表示如下:

上面的黑色三角形區(qū)域就稱為sRGB色彩空間,被廣泛應(yīng)用在個人電腦顯示器、打印機、數(shù)碼相機中,占據(jù)了大量市場份額、到了90年代的時候Adobe公司提出了一個新RGB色彩空間模型Adobe RGB色彩空間,它比sRGB色彩空間有更大的取值范圍,因此色彩更加細膩更加豐富,它的色彩空間圖示如下:

從圖中可以看成Adobe RGB色彩空間是比sRGB色彩空間大的,但是這個也有缺陷,就是不同色彩空間生成的彩色圖像,在不同的設(shè)備上顯示或者瀏覽會出現(xiàn)色差,為了解決這個問題,需要對不同色彩空間之間建立轉(zhuǎn)換模型,實現(xiàn)不同色彩空間模型的轉(zhuǎn)。后來RGB色彩空間就被大家玩壞了,現(xiàn)在常用的RGB色彩空間如下:

其中值得關(guān)注的部分是sRGB跟CMYK之間的相互轉(zhuǎn)換,這個轉(zhuǎn)換之后會導致很明顯的色彩差異,原因在于CMYK色彩空間又一部分不在sRGB內(nèi)部,所以這種情況下,需要對RGB色彩空間進行非線性變換,獲得顏色補償。原因在于多數(shù)商業(yè)打印機都是基于四色(Cyan, Yellow, Magenta and Black),無法打印一些sRGB范圍的顏色,所以必須進行非線性變換跟補償。這個其中最常見的就是Gamma校正。
RGB色彩空間比較豐富,但是它也是有缺點的,最大的缺點就是無法直觀的區(qū)分圖像顏色、亮度、飽和度等值。所以我們需要一些更加直觀的圖像色彩空間,排在第一位的就是HSV色彩空間,它直觀,容易理解,因此在圖像處理非常有用。
HSV色彩空間
RGB立方圖色彩空間無法很好區(qū)分顏色與亮度的關(guān)系,要單獨調(diào)整顏色或者亮度不是很方便,這個時候HSV色彩空間是一個很好的選擇,它對顏色與亮度有著很好的區(qū)分度,HSV色彩空間圖示如下:

解釋如下:
H(Hue) 表示顏色通道,不同的值表示不同的顏色范圍
S表示飽和度通道,表示色澤
V表示亮度通道,代表圖像亮度高低級別
在H、S、V通道上對圖像亮度跟顏色或者飽和度的調(diào)整就非常方便了,另外對一些特定的顏色值進行分離也比較方便了。
YCrCb色彩空間
YCrCb色彩空間被開發(fā)作為當時的數(shù)字分量視頻的標準,它跟YUV色彩空間有著一定相似性,它的三個通道的取值范圍分別被定義為:
Y通道:16~235
Cr通道:16~240
Cb通道:16~240
需要特別注意的是,RGB到Y(jié)CrCb的色彩空間轉(zhuǎn)換時候,不同的YCrCb色彩空間標準會有不同,下面標清電視跟高清電視上YCrCb的色彩差異:

很顯然它們的轉(zhuǎn)換公式也會有所不同,所以千萬不用看到不同轉(zhuǎn)換公式就大驚小怪的!
LAB色彩空間
LAB色彩空間又名CIE Lab / LAB,它的圖示如下:

其中:
L通道表示亮度值
A通道表示紅色/綠色值
B通道表示藍色/黃色值
在LAB色彩空間,L表示亮度分量、AB表示顏色通道,所以有時候LAB色彩空間處理圖像也會必RGB色彩空間好用,會有意想不到的好結(jié)果。
OpenCV色彩空間相互轉(zhuǎn)換與操作的函數(shù)主要有兩個,其中支持色彩空間轉(zhuǎn)換的函數(shù)為:
void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn = 0)
參數(shù)解釋如下
src 表示輸入圖像
dst 表示輸出圖像
code 表示空間轉(zhuǎn)換代碼,支持常見的各種色彩空間轉(zhuǎn)換
從色彩空間中提取不同色顏色值函數(shù):
void cv::inRange(InputArray src,InputArray lowerb,InputArray upperb,OutputArray dst)
參數(shù)解釋如下:
src是輸入圖像
lowerb是取值范圍最小值
upperb是取值范圍最大值
dst是輸出的mask圖像,二值的
一個例子,綠色背景對象上前景對象提取,先看一下效果:

相關(guān)代碼如下:
1#include?
2#include?
3
4using?namespace?cv;
5using?namespace?std;
6
7int?main(int?argc,?const?char?*argv[])
8{
9????Mat?src?=?imread("D:/vcprojects/images/cat.jpg");
10????if?(src.empty())?{
11????????printf("could?not?load?image...\n");
12????????return?-1;
13????}
14????namedWindow("input",?WINDOW_AUTOSIZE);
15????imshow("input",?src);
16
17????//?RGB?to?HSV
18????Mat?hsv;
19????cvtColor(src,?hsv,?COLOR_BGR2HSV);
20????imshow("hsv",?hsv);
21
22????//?RGB?to?YUV
23????Mat?yuv;
24????cvtColor(src,?yuv,?COLOR_BGR2YUV);
25????imshow("yuv",?yuv);
26
27????//?RGB?to?YUV
28????Mat?ycrcb;
29????cvtColor(src,?ycrcb,?COLOR_BGR2YCrCb);
30????imshow("ycrcb",?ycrcb);
31
32????Mat?src2?=?imread("D:/javaopencv/tinygreen.png");
33????imshow("src2",?src2);
34????cvtColor(src2,?hsv,?COLOR_BGR2HSV);
35????Mat?mask;
36????inRange(hsv,?Scalar(35,?43,?46),?Scalar(99,?255,?255),?mask);
37????imshow("mask",?mask);
38
39????waitKey(0);
40????return?0;
41}交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關(guān)微信群。請勿在群內(nèi)發(fā)送廣告,否則會請出群,謝謝理解~

