使用 Matlab 对图像的色度分量进行降采样

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);

现在我需要做什么来执行下采样?
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()


我喜欢那个替换插值的例子。有没有聪明的方法来进行线性插值? - eggie5
在这种特定情况下或一般情况下?在色度子采样情况下进行线性插值没有太大作用。但是如果您只是想寻找类似的方法来进行单向线性插值,请在上面的示例中使用 Cb(:, 2:2:end-1) = (Cb(:, 1:2:end-3) + Cb(:, 3:2:end-1))/2 - Bee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接