RGB 转 HSV

1. RGB 模型

RGB 转 HSV_第1张图片
立方体模型

用RGB来理解色彩、深浅、明暗变化:

  • 色彩变化:三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
  • 深浅变化:RGB顶点和CMY顶点原点和白色顶点的中轴线距离
  • 明暗变化:中轴线的点的位置,到原点(0,0,0)就偏暗,到白色顶点(1,1,1)就偏亮

原点到白色顶点的中轴线是灰度线,RGB 三分量相等。

三原色RGB 混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。

2. HSV 模型

HSV模型 就是按 色彩、深浅、明暗 来描述的。

RGB 转 HSV_第2张图片
倒锥形模型

RGB 转 HSV_第3张图片
模型2
  • 色调 H
    用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
  • 饱和度 S
    饱和度S表示 颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
  • 明度 V
    明度表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。

RGB 和 CMYK 颜色模型都是 面向硬件的,而HSV(Hue Saturation Value)颜色模型是 面向用户的,更适合人的观察特点。

艺术家的选择

艺术家有时偏好使用 HSV 颜色模型而不选择 RGB 或 CMYK 模型,因为它类似于人类感觉颜色的方式。RGB 和 CMYK 分别是 加法原色 和 减法原色 模型,以原色组合的方式定义颜色,而 HSV 以人类更熟悉的方式 封装了关于颜色的信息:“这是什么颜色?深浅如何?明暗如何?”

3. RGB 转 HSV

  • 设 (r, g, b) 分别是一个颜色的红、绿和蓝坐标,它们的值是在 0 到 1 之间的实数
  • 设 max 等于 r, g, b 中的最大者
  • 设 min 等于 r, g, b 中的最小者
RGB 转 HSV_第4张图片
转换方程

OpenCV 内置了转换函数

// 将RGB图像转为HSV图像的函数
cvCvtColor(srcImage, hsv, CV_BGR2HSV);

通过输出 RGB 和 HSV 矩阵进行验证

cout << "bgr 矩阵" << endl;
Mat rgbMat(srcImage); // IplImage 转 Mat
scanImageMatrix(rgbMat);

cout <<"hsv 矩阵"<< endl;
Mat hsvMat(hsv);
scanImageMatrix(hsvMat);
bgr 矩阵
[9, 56, 87], [10, 60, 90], [13, 63, 91], [11, 64, 91], [6, 63, 89], 
[19, 73, 104], [22, 76, 107], [24, 79, 110], [22, 80, 109], [19, 79, 108], 
[56, 117, 151], [60, 121, 155], [61, 124, 158], [60, 125, 156], [57, 124, 155], 
[91, 160, 199], [94, 163, 202], [96, 167, 205], [94, 168, 204], [91, 167, 203], 
[96, 173, 219], [99, 176, 222], [100, 179, 222], [97, 179, 221], [93, 178, 218], 
hsv 矩阵
[18, 229, 87], [19, 227, 90], [19, 219, 91], [20, 224, 91], [21, 238, 89], 
[19, 208, 104], [19, 203, 107], [19, 199, 110], [20, 204, 109], [20, 210, 108], 
[19, 160, 151], [19, 156, 155], [19, 157, 158], [20, 157, 156], [21, 161, 155], 
[19, 138, 199], [19, 136, 202], [20, 136, 205], [20, 138, 204], [20, 141, 203], 
[19, 143, 219], [19, 141, 222], [19, 140, 222], [20, 143, 221], [20, 146, 218],

由于矩阵以 uchar 类型输出,hsv的值需要换算。

源代码

  1. 加载原图
  2. 转换颜色空间 cvCvtColor
  3. 分离通道
  4. 显示图像
#include 
#include 

using namespace cv;
using namespace std;

int main() {

    IplImage *srcImage = cvLoadImage("../pictures/bear.jpeg", CV_LOAD_IMAGE_COLOR);
    // 原图像
    cvNamedWindow("RGB");
    cvShowImage("RGB", srcImage);

    // 存储HSV图像
    IplImage *hsv = cvCreateImage(cvGetSize(srcImage), IPL_DEPTH_8U, 3);

    // 将RGB图像转为HSV图像的函数
    cvCvtColor(srcImage, hsv, CV_BGR2HSV);

    // HSV图像
    cvNamedWindow("HSV");
    cvShowImage("HSV",hsv);

    // 创建3通道
    IplImage* Himg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);
    IplImage* Simg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);
    IplImage* Vimg=cvCreateImage(cvGetSize(hsv),IPL_DEPTH_8U,1);

    // 分离 H S V
    cvSplit(hsv,Vimg,Simg,Himg,0);

    // 显示图像
    cvNamedWindow("V");
    cvShowImage("V",Vimg);
    cvNamedWindow("S");
    cvShowImage("S",Simg);
    cvNamedWindow("H");
    cvShowImage("H",Himg);

    waitKey(0);
    return 0;
}

样例1

RGB 转 HSV_第5张图片
RGB -> HSV
RGB 转 HSV_第6张图片
H S V

样例2

RGB 转 HSV_第7张图片
RGB -> HSV
RGB 转 HSV_第8张图片
H S V

样例3

RGB 转 HSV_第9张图片
RGB -> HSV
RGB 转 HSV_第10张图片
H S V

你可能感兴趣的:(RGB 转 HSV)