1. RGB颜色模型:是最常见的颜色空间模型,分别代表了Red(红),Green(绿)和Blue(蓝)。其模型可以从下图理解:
灰度线:坐标轴远点到白色顶点的连线被称为灰度线。
2. CYMK颜色模型:是RGB的补色模型。是一种专门针对印刷的模型,因为与光线相反,印刷是反射效果,看到的红色其实是将其它光吸收掉,反射红光。
补色:某种颜色的光与另一种颜色的光混合可以形成白光,则互为补色。
3. HSV颜色模型:Hue, Saturation, Value(色调、饱和度、明度)。
· HSV颜色模型也称为六角锥体模型(Hexcone Model)。
· 色调:用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°。
· 饱和度:表示颜色接近光谱色的程度。一种颜色,可以看成是某种光谱色与白色混合的结果。其中光谱色所占的比例愈大,颜色接近光谱色的程度就愈高,颜色的饱和度也就愈高。饱和度高,颜色则深而艳。光谱色的白光成分为0,饱和度达到最高。通常取值范围为0%~100%,值越大,颜色越饱和。
· 明度:表示颜色明亮的程度,对于光源色,明度值与发光体的光亮度有关;对于物体色,此值和物体的透射比或反射比有关。通常取值范围为0%(黑)到100%(白)。
4. HSI颜色模型:Hue-Saturation-Intensity(色调、饱和度、亮度)。
· 色调H是描述纯色的属性(如红色、黄色等)。
· 饱和度S表示的是一种纯色被白光稀释的程度的度量。
· 亮度提现了无色的,这是一个主观的描述。
· 与RGB换算关系:
5. 代码说明:
1) 同样光强的图像,人眼对绿色是最敏感的,对蓝色是最不敏感的。
2) 白色与透明没有任何关系。在Microsoft的Photoshop等软件中,除了RGB三通道之外还有一个α通道,代表的是透明度。这个可以类似的理解为在图像上还有一个掩膜。
3) HSI模型和HSV模型是两种不同的模型,具体信息如上所述。HSI模型更贴近人类视觉感觉,但是在OpenCV中仅支持HSV模型。
4) PyrDown函数:对图像进行滤波然后进行下采样。
void pyrDown (InputArray src,OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT)
void pyrDown (输入图像,输出图像,输出图像的大小,图像边界的处理方式)
操作过程:
i. 与高斯内核卷积;
ii. 将所有偶数行和列去除。
5) PyrUp函数:对图像进行高斯滤波,然后进行上采样。
void pyrUp(InputArray src,OutputArray dst, const Size& dstsize=Size(), int borderType=BORDER_DEFAULT)
void pyrDown (输入图像,输出图像,输出图像的大小,图像边界的处理方式)
操作过程:与pyrDown类似,但是上采样是下采样的逆过程,也称增取样(Upsampling)或内插(Interpolating)。
6) 颜色空间转换( cvtColor函数):void cvtColor (InputArray src,OutputArray dst, int code, int dstCn = 0);
code: COLOR_BGR2GRAY 或 COLOR_BGR2HSV。
Ÿ 通道分离(split函数):
void split (const Mat &src, Mat *mvBegin);
/* ************************************************************************************************************
任务目标:通过OpenCV观察HSV颜色模型的特点。
************************************************************************************************************ */
#include // 声明头文件
#include
using namespace cv; // 声明命名空间
using namespace std;
int main(void) // 主函数
{
char *fn = "E:\\Study\\Computer vision\\OpenCV Test Workshop\\HSVtest\\opencv-logo.png";
// 定义指针"*fn"指向目标图像
Mat image1 = imread(fn); // 从"*fn"指针中读取目标图像并放入"image1"变量中
Mat image, gray, hsv, hsvChannels[3]; // 声明"Mat"型变量,包括一个数组空间存放"hsv"分量结果
pyrDown(image1, image); // 对图像进行滤波,然后进行下采样
cvtColor(image, gray, COLOR_BGR2GRAY); // 转换到灰度颜色空间
imshow("Source Image", image); // 显示"pyrDown"的结果
imshow("Gray", gray); // 显示灰度图像
cvtColor(image, hsv, COLOR_BGR2HSV); // 转换到"HSV"颜色模型
split(hsv, hsvChannels); // 分离"HSV"颜色模型中的三个分量通道对应的值
imshow("Hue", hsvChannels[0]); // 显示"色调"分布图
imshow("Saturation", hsvChannels[1]); // 显示"饱和度"分布图
imshow("Value",hsvChannels[2]); // 显示"明度"分布图
waitKey(); // 暂停程序,防止闪退
return (0);
}
结果输出如下:
在pyrDown函数中进行了下采样,缩小了图像。
灰度化处理了的图像,因为人眼对不同色彩敏感度不同,得到的灰度值也不同。
底色为黑色,且色调按角度划分,红色为0°,绿色120°,蓝色240°。
因为三个“环”都是纯色,自然饱和度都是100%。
亮度为100%。