1. YCrCb格式,给所有像素赋值白色
IplImage* dst=cvCreateImage(cvGetSize(_dst),8,3);
for (int i = 0; i < src->height; i++) //赋值
{
unsigned char* tmp = (unsigned char*)dst->imageData + i*dst->widthStep;
for (int j = 0; j < src->width; j++)
{
tmp[Cr] = tmp[Cb] = 128 ;
tmp[Y] = 240;
}
}
2. YCrCb格式,给所有像素赋值黑色
cvZeros(dst);
YUV公式有很多,
包括未量化 : Y (0,255) U (-128,128) V (-128 ,128)
负数取正后: Y (0,255) U (0,255) V (0,255)
量化后 :Y(16,235) U(16,240) V( 16,240 )
YUV(256 级别) 可以从8位 RGB 直接计算:
Y = 0.299 R + 0.587 G + 0.114 B
U = - 0.1687 R - 0.3313 G + 0.5 B + 128
V = 0.5 R - 0.4187 G - 0.0813 B + 128
反过来,RGB 也可以直接从YUV (256级别) 计算:
R = Y + 1.402 (Cr-128)
G = Y - 0.34414 (Cb-128) - 0.71414 (Cr-128)
B = Y + 1.772 (Cb-128)
3. YCrCb基础知识
YCrCb即YUV,主要用于优化彩色视频信号的传输,使其向后相容老式黑白电视。与RGB视频信号传输相比,它最大的优点在于只需占用极少的频宽(RGB要求三个独立的视频信号同时传输)。
“Y”表示明亮度(Luminance或Luma),也就是灰阶值,“亮度”是透过RGB输入信号来建立的,方法是将RGB信号的特定部分叠加到一起。
“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。“色度”则定义了颜色的两个方面─色调与饱和度,分别用Cr和Cb来表示。Cr反映了RGB输入信号红色部分与RGB信号亮度值之间的差异。而CB反映的是RGB输入信号蓝色部分与RGB信号亮度值之间的差异。
YUV: 是一种颜色空间,基于 YUV
的颜色编码是流媒体的常用编码方式,这种表达方式起初是为了彩色电视与黑白电视之间的信号兼容;其中
- Y: 表示明亮度(Luminance 或 Luma),也称灰度图。
- U、V: 表示色度(Chrominance 或 Chroma),作用是描述影像的色彩及饱和度,用于指定像素的颜色。
Y’CbCr:(也称为 YUV),是 YUV
的压缩版本,不同之处在于 Y’CbCr
用于 数字图像 领域,YUV
用于 模拟信号 领域;MPEG
、DVD
、摄像机中常说的 YUV
其实是 Y'CbCr
,二者转换为 RGBA
的转换矩阵是不同的。
- Cr:(色度红)反应了
RGB
输入信号 红色 部分与RGB
信号亮度值之间的差异(即,当前颜色对 红色 的偏移程度)。 - Cb:(色度蓝)反应了
RGB
输入信号 蓝色 部分与RGB
信号亮度值之间的差异(即,当前颜色对 蓝色 的偏移程度)。
注意: 如无特殊说明,本文讨论的
YUV
均指Y'CbCr
。
4. 不同颜色之间的转换
//HSV颜色空间转换
cv::cvtColor(srcImage, image_hsv, CV_BGR2HSV);
cv::imshow("image_hsv", image_hsv);
//YCrCb颜色空间转换
cv::cvtColor(srcImage, image_col, CV_BGR2YCrCb);
cv::imshow("image_col", image_col);
//HLS颜色空间转换
cv::cvtColor(srcImage, image_col, CV_BGR2HLS);
cv::imshow("iamge_HLS", image_col);
//Lab颜色空间转换
cv::cvtColor(srcImage, image_col, CV_BGR2Lab);
cv::imshow("image_Lab", image_col);
//分离HSV各个通道
std::vector<cv::Mat> hsvChannels;
cv::split(image_hsv, hsvChannels);
//0通道为H分量,1通道为S分量,2通道为V分量
image_H = hsvChannels[0];
image_S = hsvChannels[1];
image_V = hsvChannels[2];
//分别显示各通道图像
cv::imshow("image_H", image_H);
cv::imshow("image_S", image_S);
cv::imshow("image_V", image_V);