3

我想将图像分解为 Y、Cb、Cr 分量,然后在 YCbCr 域中执行下采样以形成 4:2:2 格式。

将图像分解为 YCbCr 的代码:

img=imread('flowers.tif');
figure(1), imshow(img);title('original image');
Y=0.299*img(:,:,1)+0.587*img(:,:,2)+0.114*img(:,:,3);
Cb=-0.1687*img(:,:,1)-0.3313*img(:,:,2)+0.5*img(:,:,3)+128;
Cr=0.5*img(:,:,1)-0.4187*img(:,:,2)-0.0813*img(:,:,3)+128;

%print Y, Cb, Cr components

figure(2), subplot (1,3,1), imshow(Y), title('Y,Cb,Cr components'),
subplot(1,3,2), imshow(Cb),subplot(1,3,3), imshow(Cr);

现在我需要做什么来执行下采样?

4

1 回答 1

4

如果下采样是指从 4:4:4 到 4:2:2 的色度二次采样,那么一种方法(并保持通道的原始大小)是用以前的值手动覆盖每个其他像素:

Cb(:, 2:2:end) = Cb(:, 1:2:end-1);
Cr(:, 2:2:end) = Cr(:, 1:2:end-1);

如果您只想删除一半的列,请使用:

Cb(:, 2:2:end) = [];
Cr(:, 2:2:end) = [];

同样在 Matlab 中,您不需要为 YCbCr 转换编写自己的函数。相反,您可以使用rgb2ycbcr().

于 2013-05-20T02:39:12.340 回答