How to display Y, Cb and Cr components of an image?

조회 수: 91 (최근 30일)
Swapnil Srivastava
Swapnil Srivastava 2020년 8월 16일
편집: Image Analyst 2022년 9월 29일
Hi everyone, I've got an image which im trying to seperate out its Y, Cb and Cr components and display them. I seperated them out using the equation that relates YCbCr to RGB.
%% Reading the image as a tiff format
im1=imread('image3.tiff');
im1=double(im1)/256;
im1(:,:,4)=[];
xsize=size(im1,1);
ysize=size(im1,2);
%% Transforming the image from RGB to YCbCr
R=im1(:,:,1);
G=im1(:,:,2);
B=im1(:,:,3);
Y=0.288*R+0.587*G+0.114*B;
Cb=-0.1687*R-0.3313*G+0.5*B;
Cr=0.5*R-0.4187*G-0.0813*B;
%% Display the various different Y, Cb and Cr
figure;
subplot(1,3,1)
image(im1);
I'm now trying to find out how do I display them seperately. Does anyone know how to do it?
Thank you

채택된 답변

Stephan
Stephan 2020년 8월 16일
편집: Stephan 2020년 8월 16일
I used the inbuild example file peppers_RGB_tiled.tif, which has no 4rd dimension that could be cleared, so i used a try catch block to avoid errors:
%% Reading the image as a tiff format
im=imread('peppers_RGB_tiled.tif');
im1=double(im)/256;
try
im1(:,:,4)=[];
catch
end
xsize=size(im1,1);
ysize=size(im1,2);
%% Transforming the image from RGB to YCbCr
R=im1(:,:,1);
G=im1(:,:,2);
B=im1(:,:,3);
Y=0.288*R+0.587*G+0.114*B;
Cb=-0.1687*R-0.3313*G+0.5*B;
Cr=0.5*R-0.4187*G-0.0813*B;
%% Display thoe original & the various different Y, Cb and Cr
figure;
hold on
subplot(1,4,1)
imshow(im);
subplot(1,4,2)
imshow(Y);
subplot(1,4,3)
imshow(Cb);
subplot(1,4,4)
imshow(Cr);
hold off
  댓글 수: 2
Swapnil Srivastava
Swapnil Srivastava 2020년 8월 19일
Thanks!
DGM
DGM 2022년 5월 2일
편집: DGM 2022년 5월 2일
There are a couple problems with this answer.
First of all, the luma constants in the transform look like they got typo'd The BT601 luma constants are [0.299 0.587 0.114]. It should also be noted that while YCbCr and YPbPr use the same transformation matrix, common integer YCbCr has offsets and scaling to consider. For visual purposes, it should suffice, but don't expect the values to be directly comparable to the results from something like rgb2ycbcr().
Second, since the above transformation is essentially YPbPr, the chroma channels are unit-scale and centered on zero. Because of that, imshow() will truncate them. Instead, offset them by 0.5 for viewing.
im = imread('peppers.png');
im1 = im2double(im); % needs IPT in older versions
% Transforming the image from RGB to YCbCr
[R G B] = imsplit(im1); % R2018b+
Y = 0.299*R + 0.587*G + 0.114*B; % 0.299
Cb = -0.1687*R - 0.3313*G + 0.5*B;
Cr = 0.5*R - 0.4187*G - 0.0813*B;
% Display the original & the various different Y, Cb and Cr
subplot(2,2,1) % i changed the tiling for web-view
imshow(im);
subplot(2,2,2)
imshow(Y);
subplot(2,2,3)
imshow(Cb+0.5); % offset
subplot(2,2,4)
imshow(Cr+0.5); % offset

댓글을 달려면 로그인하십시오.

추가 답변 (2개)

Image Analyst
Image Analyst 2020년 8월 16일
편집: Image Analyst 2022년 9월 29일
Try this:
rgbImage=imread('peppers.png');
% Transforming the image from RGB to YCbCr
yCbCrImage = rgb2ycbcr(rgbImage);
[yImage, cbImage, crImage] = imsplit(yCbCrImage);
% If you have r2018a or earlier, use the code below instead of imsplit().
% yImage = yCbCrImage(:, :, 1);
% crImage = yCbCrImage(:, :, 2);
% cbImage = yCbCrImage(:, :, 3);
% Display thoe original & the various different Y, Cb and Cr
figure;
subplot(2, 2, 1)
imshow(rgbImage, []);
title('RGB Image', 'FontSize', 16);
subplot(2, 2, 2)
imshow(yImage, []);
title('Y Image', 'FontSize', 16);
subplot(2, 2, 3)
imshow(cbImage, []);
title('Cb Image', 'FontSize', 16);
subplot(2, 2, 4)
imshow(crImage, []);
title('Cr Image', 'FontSize', 16);
  댓글 수: 6
Manthan Anil Agrawal
Manthan Anil Agrawal 2022년 9월 28일
Hello,
I am new to image processing not sure but is this correct ? looks like cr and cb got reversed.
[yImage, crImage, cbImage] = imsplit(yCbCrImage);
Shouldn't this be -
[yImage, cbImage, crImage] = imsplit(yCbCrImage);
Image Analyst
Image Analyst 2022년 9월 29일
@Manthan Anil Agrawal, yes you are correct. Thanks for catching that and I'll fix it above.

댓글을 달려면 로그인하십시오.


DGM
DGM 2022년 5월 2일
편집: DGM 2022년 5월 2일
While I agree with Image Analyst that grayscale representations of the chroma channels are accurate, easier to read, and should be more than sufficient, sometimes people want some sort of pseudocolor representations. This can either be done by colormapping or by representing the given chroma values on a locus of constant luma.
Consider the examples in the following related questions:
You should be able to take the concepts demonstrated in YIQ and LAB and apply them to YCbCr without much trouble.
RGB = imread('peppers.png');
YCC = rgb2ycbcr(RGB);
[Y Cb Cr] = imsplit(YCC);
z = 127*ones(size(YCC, 1), size(YCC, 2)); % chroma center is offset!
Ysub = 127*ones(size(YCC, 1), size(YCC, 2)); % assume some luma
% substitute new luma, zero opposite chroma channel
just_Cb = ycbcr2rgb(cat(3, Ysub, Cb, z));
just_Cr = ycbcr2rgb(cat(3, Ysub, z, Cr));
montage({RGB Y; just_Cb just_Cr}'); % display it
Like I said, I don't really think that's easy to intuit, and the fact that we're using a dummy luma value means it's a misrepresentation anyway. Take it as you will.
Maybe nobody will ever ask this, but I'll point it out anyway. While the grayscale representations of the luma and chroma channels can be taken and (if scaled properly) be concatenated and converted back into an RGB image, these pseudocolor representations generally cannot. Think about why that might be. Think about why it might seem like you could. After all, the pseudocolor versions of Cb and Cr just have some constant luma and are assembled using standard conversions. Why can't we just take one step backwards and get Cb and Cr and then convert back to RGB?
% try to reverse the process
YCC_Cb = rgb2ycbcr(just_Cb);
YCC_Cr = rgb2ycbcr(just_Cr);
Cbrec = YCC_Cb(:,:,2);
Crrec = YCC_Cr(:,:,3);
RGBrec = ycbcr2rgb(cat(3, Y, Cbrec, Crrec));
% show the error in the recovered image
err = im2double(imabsdiff(RGB,RGBrec));
imshow(err/range(err(:)));
Think about why it's saturated regions on the primary-secondary corners that are being distorted. What if we picked a different value for the substituted luma? Is there any luma value that would be safe?

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by