1. RGB 模型
用RGB来理解色彩、深浅、明暗变化:
- 色彩变化:三个坐标轴RGB最大分量顶点与黄紫青YMC色顶点的连线
- 深浅变化:RGB顶点和CMY顶点 到 原点和白色顶点的中轴线 的 距离
- 明暗变化:中轴线的点的位置,到原点(0,0,0)就偏暗,到白色顶点(1,1,1)就偏亮
原点到白色顶点的中轴线是灰度线,RGB 三分量相等。
三原色RGB 混合能形成其他的颜色,并不是说物理上其他颜色的光是由三原色的光混合形成的,每种单色光都有自己独特的光谱,如黄光是一种单色光,但红色与绿色混合能形成黄色,原因是人的感官系统所致,与人的生理系统有关。
2. HSV 模型
HSV模型 就是按 色彩、深浅、明暗 来描述的。
- 色调 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 中的最小者
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的值需要换算。
源代码
- 加载原图
- 转换颜色空间
cvCvtColor
- 分离通道
- 显示图像
#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;
}