我想将图像分解为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);
现在我需要做什么来执行下采样?
答案 0 :(得分: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()
。