每种颜色相当于一个三维向量,不同的表示法则相当于同一个向量在不同的坐标轴下(即不同的基下)的表示。
YIQ简单介绍
YIQ
,是NTSC(National Television Standards Committee)电视系统标准。Y是提供黑白电视及彩色电视的亮度信号(Luminance),即亮度(Brightness),I代表In-phase,色彩从橙色到青色,Q代表Quadrature-phase,色彩从紫色到黄绿色。
优点
较其他颜色空间,YIQ颜色空间具有能将图像中的亮度分量分离提取出来的优点,并且YIQ颜色空间与RGB颜色空间之间是线性变换的关系,计算量小,聚类特性也比较好,可以适应光照强度不断变化的场合,因此能够有效地用于彩色图像处理。可用于在自然条件下采集到的复杂背景下的运动目标的识别。
RGB简单介绍
RGB
色彩模式是工业界的一种颜色标准,是通过对红®、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是目前运用最广的颜色系统之一。
在电脑中,RGB的所谓“多少”就是指亮度,并使用整数来表示。通常情况下,RGB各有256级亮度,用数字表示为从0、1、2…直到255。注意虽然数字最高是255,但0也是数值之一,因此共256级。
按照计算,256级的RGB色彩总共能组合出约1678万种色彩,即256×256×256=16777216。通常也被简称为1600万色或千万色。也称为24位色(2的24次方)。
RGB 转 YIQ
转换是我们实验室项目的一个需求,基于论文,利用YIQ对对图像处理上的优势,Android中JNI连得C++的库,连得OpenCV,做的操作和转换。
//代码摘自我们的项目,师兄的代码,但是这个转换公式网上应该不少,原理可自查
Mat XXX::Rgb2Ntsc(Mat&frame)
{
//输入rgb的mat型图
Mat dst = frame.clone();
frame.convertTo(frame, CV_32FC3);
dst.convertTo(dst, CV_32FC3);
//逐行逐列逐像素点的转换
for (int i = 0; i < frame.rows; i++)
{
for (int j = 0; j < frame.cols; j++) {
dst.at<Vec3f>(i, j)[2] = saturate_cast<float>(((0.299*frame.at<Vec3f>(i, j)[2] +
0.587*frame.at<Vec3f>(i, j)[1] +
0.114*frame.at<Vec3f>(i, j)[0])) / 255);
dst.at<Vec3f>(i, j)[1] = saturate_cast<float>(((0.596*frame.at<Vec3f>(i, j)[2] +
-0.274*frame.at<Vec3f>(i, j)[1] +
-0.322*frame.at<Vec3f>(i, j)[0])) / 255);
dst.at<Vec3f>(i, j)[0] = saturate_cast<float>(((0.211*frame.at<Vec3f>(i, j)[2] +
-0.523*frame.at<Vec3f>(i, j)[1] +
0.312*frame.at<Vec3f>(i, j)[0])) / 255) * 200;
}
}
return dst;//返回YIQ形式的mat
}