当前位置: 首页 > 知识库问答 >
问题:

用OpenCV和Matlab实现RGB到YCbCr的不同颜色转换

赵元白
2023-03-14

下面是MATLAB和C++(使用OpenCV 4.0.1)的代码。

Matlab:

% Read rgb image
imgrgb = imread('lena512color.bmp');

% Convert to ycbcr
imgycbcr = rgb2ycbcr(imgrgb);

% Extract the 3 components
luma = imgycbcr (:,:,1);
cb = imgycbcr (:,:,2);
cr = imgycbcr (:,:,3);

C++:

// Load img
cv::Mat bgrImg = imread( "lena512color.bmp", cv::IMREAD_COLOR );
assert( bgrImg.data && "No image data");

// Declare an empty Mat for dst image
cv::Mat ycrcbImg;

// Convert to ycrcb
cv::cvtColor(bgrImg, ycrcbImg, cv::COLOR_BGR2YCrCb);

// Split bgr into 3 channels
cv::Mat bgrChan[3];
cv::split(bgrImg, bgrChan);

// Split ycrcb into 3 channels
cv::Mat ycrcbChan[3];
cv::split(ycrcbImg, ycrcbChan);

// Print first block for each channel
PRINT_MAT(ycrcbChan[0](cv::Rect(0, 0, 8, 8)), "LUMA (first 8x8 block)")
PRINT_MAT(ycrcbChan[1](cv::Rect(0, 0, 8, 8)), "Cr (first 8x8 block)")
PRINT_MAT(ycrcbChan[2](cv::Rect(0, 0, 8, 8)), "Cb (first 8x8 block)")

PRINT_MAT(bgrChan[0](cv::Rect(0, 0, 8, 8)), "Blue (first 8x8 block)")
PRINT_MAT(bgrChan[1](cv::Rect(0, 0, 8, 8)), "Green (first 8x8 block)")
PRINT_MAT(bgrChan[2](cv::Rect(0, 0, 8, 8)), "Red (first 8x8 block)")
#define PRINT_MAT(mat, msg) std::cout<< std::endl <<msg <<":" <<std::endl <<mat <<std::endl;
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
155 155 155 154 155 150 156 154
157 157 151 149 154 153 152 153
154 154 156 152 154 155 153 150
152 152 149 150 152 152 150 151
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
162 162 162 161 162 157 163 161
164 164 158 155 161 159 159 160
160 160 163 158 160 162 159 156
159 159 155 157 158 159 156 157

共有1个答案

郎玮
2023-03-14

通过查看MATLAB的RGB2YCBCR的源代码,转换是根据“Poynton的《数字视频导论》(第176页,方程9.6)”中的一个方程执行的:

origT = [ ...
     65.481 128.553  24.966;...
    -37.797 -74.203 112    ;...
    112     -93.786 -18.214];
origOffset = [16; 128; 128];
ycbcr = origT * rgb + origOffset;

而且还提到:

如果输入为UINT8,则YCBCR为UINT8,其中Y[16235]范围内,CBCR[16240]范围内。

请注意它是如何表示“y、Cr和Cb覆盖整个值范围”的。

如果我们在MATLAB中使用相同的方程,我们得到的结果更接近OCV的(也许我使用的是不同的源图像)。例如,对于y:

OCV_Y = 0.299*imgrgb(:,:,1) + 0.587*imgrgb(:,:,2) + 0.114*imgrgb(:,:,3);

给出第一个8x8:

   162   162   162   162   163   157   163   161
   162   162   162   162   163   157   163   161
   162   162   162   162   163   157   163   161
   162   162   162   162   163   157   163   161
   162   162   162   162   163   157   163   161
   164   164   158   155   162   159   159   160
   161   161   163   158   160   161   158   155
   159   159   156   156   159   158   157   157
 类似资料:
  • 图像中的每个像素都有一个rgb值,看起来像[r g b],其中r、g、b是从0到255的整数值。 现在,让我们定义8个rgb颜色极端: [0]黑色 [0 255]蓝色 [0 255 0]绿色 [0 255]青色 [255 0 0]红色 [255 0 255]洋红色 [255 0]黄色 [255]白色。 Matlab中有没有一种有效的方法,或者Matlab中的一个函数,可以将一幅图像转换成另一幅具有

  • 本文向大家介绍opencv实现图像颜色空间转换,包括了opencv实现图像颜色空间转换的使用技巧和注意事项,需要的朋友参考一下 opencv常用的样色空间包括RGB, HSV和YUV等。RGB颜色空间是基于三基色原理二形成的,常用于图像显示系统中;HSV描述的色度,饱和度,亮度这些表示颜色得方法,常用于描述色彩变化;YUV是通过亮度和色度来描述颜色,色度由UV通道组合而成。 opencv提供cvt

  • 本文向大家介绍PHP实现将颜色hex值转换成rgb的方法,包括了PHP实现将颜色hex值转换成rgb的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了PHP实现将颜色hex值转换成rgb的方法。分享给大家供大家参考,具体如下: 运行结果如下: 关于颜色值转换与获取还可参考本站在线工具: RGB颜色编码生成器 在线网页配色工具 RGB颜色查询对照表_颜色代码表_颜色的英文名称大全 更多关

  • 我有一个返回十进制值的java代码,如下所示 第一个值表示红色的颜色代码,第二个值表示绿色的颜色代码,第三个值表示蓝色的颜色代码。 有没有什么方法可以将这些RGB值转换为java中相应的颜色?

  • 本文向大家介绍js实现可得到不同颜色值的颜色选择器实例,包括了js实现可得到不同颜色值的颜色选择器实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了js实现可得到不同颜色值的颜色选择器。分享给大家供大家参考。具体实现方法如下: 更多js颜色操作可参考本站颜色工具: RGB颜色编码生成器 在线网页配色工具 RGB颜色查询对照表_颜色代码表_颜色的英文名称大全 希望本文所述对大家的javas

  • 问题内容: 我在该主题上找到的所有内容都只是将十六进制转换为rgb,然后添加一个Alpha1。我也想从十六进制数字中获得所需的Alpha。 诸如或明显具有不为0或1的Alpha值的颜色。 问题答案: 我已经制作了一个快速的JSfiddle表格,可以将8位十六进制代码转换为CSS rgba值;) 基础很简单-将您提供的字符串分成两位数的一部分,并转换为alpha通道的百分比率和RGB通道的小数位。标