YCrCb知识总结

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 用于 模拟信号 领域;MPEGDVD、摄像机中常说的 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);

  • 7
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值