色彩三要素(Elements of color)色彩可用的色調(色相)、飽和度(純度)和明度來描述。人眼看到的任一彩色光都是這三個特性的綜合效果,這三個特性即是色彩的三要素,其中色調與光波的波長有直接關系,亮度和飽和度與光波的幅度有關。
1.1 色相定義
色彩是由於物體上的物理性的光反射到人眼視神經上所產生的感覺。色的不同是由光的波長的長短差別所決定的。作為色相,指的是這些不同波長的色的情況。波長最長的是紅色,最短的是紫色。把紅、橙、黃、綠、藍、紫和處在它們各自之間的紅橙、黃橙、黃綠、藍綠、藍紫、紅紫這6種中間色——共計12種色作為色相環。在色相環上排列的色是純度高的色,被稱為純色。這些色在環上的位置是根據視覺和感覺的相等間隔來進行安排的。用類似這樣的方法還可以再分出差別細微的多種色來。在色相環上,與環中心對稱,並在180度的位置兩端的色被稱為互補色。
1.2 飽和度定義
用數值表示色的鮮艷或鮮明的程度稱之為彩度。有彩色的各種色都具有彩度值,無彩色的色的彩度值為0,對於有彩色的色的彩度(純度)的高低,區別方法是根據這種色中含灰色的程度來計算的。彩度由於色相的不同而不同,而且即使是相同的色相,因為明度的不同,彩度也會隨之變化的。
1.3 明度定義
表示色所具有的亮度和暗度被稱為明度。計算明度的基准是灰度測試卡。黑色為0,白色為10,在0—10之間等間隔的排列為9個階段。色彩可以分為有彩色和無彩色,但后者仍然存在着明度。作為有彩色,每種色各自的亮度、暗度在灰度測試卡上都具有相應的位置值。彩度高的色對明度有很大的影響,不太容易辨別。在明亮的地方鑒別色的明度比較容易的,在暗的地方就難以鑒別。
2 色相、飽和度、明度調節
常在RGB色彩空間調整亮度與飽和度不是很直觀,而HSL彩色空可以很直觀表示出每個像素的飽和度與亮度。所以首先讀取圖像的像素RGB值然后再轉換到HSL空間得到飽和度與亮度值,調整以后再從HSL空間轉換到RGB空間的RGB值,對每個像素完成這樣的調整就完成圖像的亮度與飽和度調整。
3 飽和度調節源碼實現
1 #include "highgui.h" 2 #include "cv.h" 3 #include "stdio.h" 4 IplImage* src = 0; 5 int g_switch_value = 0; 6 int value=0; 7 int main( )//int argc,char**argv) 8 { 9 src = cvLoadImage("11.bmp", 1); 10 CvSize cvSz = cvGetSize(src); 11 IplImage* h_plane = cvCreateImage( cvGetSize(src), 8, 1 ); 12 IplImage* s_plane = cvCreateImage( cvGetSize(src), 8, 1 ); 13 IplImage* v_plane = cvCreateImage( cvGetSize(src), 8, 1 ); 14 cvCvtColor(src,src,CV_RGB2HSV);//RGB轉為HSV空間 15 cvCvtPixToPlane( src,h_plane, s_plane, v_plane, 0 ); //HSV分為H,S,V三個分量 16 cvNamedWindow("src",1); 17 cvCreateTrackbar("bar","src",&g_switch_value,200,NULL); 18 unsigned char* pTest = (uchar*)s_plane->imageData; 19 int m=src->height; 20 int n=src->width; 21 printf("%d\n",m);//輸出圖像的長和寬 22 printf("%d\n",n); 23 while(1) 24 { 25 if(cvGetTrackbarPos("bar","src")!=value) 26 { 27 for(int y=0;y<m;y++) 28 { 29 for( int x=0; x<n; x++ ) 30 { 31 pTest[y*n+x] +=cvGetTrackbarPos("bar","src")-value;//pTest[y*n+x]+g_switch_value; 32 } 33 } 34 value=cvGetTrackbarPos("bar","src"); 35 } 36 cvCvtPlaneToPix( h_plane, s_plane, v_plane, 0, src ); 37 cvCvtColor(src,src,CV_HSV2RGB); 38 cvShowImage("src",src); 39 if(cvWaitKey (15)==27) break; //按Esc退出 40 } 41 cvReleaseImage(&src); 42 cvDestroyWindow("src"); 43 return 0; 44 }