圖像處理之色相、飽和度、明度


色相、飽和度、明度定義

  色彩三要素(Elements of color)色彩可用的色調(色相)、飽和度(純度)和明度來描述。人眼看到的任一彩色光都是這三個特性的綜合效果,這三個特性即是色彩的三要素,其中色調與光波的波長有直接關系,亮度和飽和度與光波的幅度有關。

1.1 色相定義

  色彩是由於物體上的物理性的光反射到人眼視神經上所產生的感覺。色的不同是由光的波長的長短差別所決定的。作為色相,指的是這些不同波長的色的情況。波長最長的是紅色,最短的是紫色。把紅、橙、黃、綠、藍、紫和處在它們各自之間的紅橙、黃橙、黃綠、藍綠、藍紫、紅紫這6種中間色——共計12種色作為色相環。在色相環上排列的色是純度高的色,被稱為純色。這些色在環上的位置是根據視覺和感覺的相等間隔來進行安排的。用類似這樣的方法還可以再分出差別細微的多種色來。在色相環上,與環中心對稱,並在180度的位置兩端的色被稱為互補色

                             

1.2 飽和度定義

  用數值表示色的鮮艷或鮮明的程度稱之為彩度。有彩色的各種色都具有彩度值,無彩色的色的彩度值為0,對於有彩色的色的彩度(純度)的高低,區別方法是根據這種色中含灰色的程度來計算的。彩度由於色相的不同而不同,而且即使是相同的色相,因為明度的不同,彩度也會隨之變化的。

                         

1.3 明度定義

  表示色所具有的亮度和暗度被稱為明度。計算明度的基准是灰度測試卡。黑色為0,白色為10,在0—10之間等間隔的排列為9個階段。色彩可以分為有彩色和無彩色,但后者仍然存在着明度。作為有彩色,每種色各自的亮度、暗度在灰度測試卡上都具有相應的位置值。彩度高的色對明度有很大的影響,不太容易辨別。在明亮的地方鑒別色的明度比較容易的,在暗的地方就難以鑒別。

                           

色相、飽和度、明度調節

  常在RGB色彩空間調整亮度與飽和度不是很直觀,而HSL彩色空可以很直觀表示出每個像素的飽和度與亮度。所以首先讀取圖像的像素RGB值然后再轉換到HSL空間得到飽和度與亮度值,調整以后再從HSL空間轉換到RGB空間的RGB值,對每個像素完成這樣的調整就完成圖像的亮度與飽和度調整。

飽和度調節源碼實現

 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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM