• 1 色相、饱和度、明度定义


      色彩三要素(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
    ",m);//输出图像的长和宽
    22     printf("%d
    ",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 }
    复制代码
  • 相关阅读:
    Notes about "Exploring Expect"
    Reuse Sonar Checkstyle Violation Report for Custom Data Analysis
    Eclipse带参数调试的方法
    MIT Scheme Development on Ubuntu
    Manage Historical Snapshots in Sonarqube
    U盘自动弹出脚本
    hg的常用配置
    Java程序员的推荐阅读书籍
    使用shared memory 计算矩阵乘法 (其实并没有加速多少)
    CUDA 笔记
  • 原文地址:https://www.cnblogs.com/whw19818/p/6307514.html
Copyright © 2020-2023  润新知