在 Matlab 中,当图像在 YCbCr 中时,如何使用色度子采样将 4:4:4 图像缩小到 4:1:1?

问题描述

按照这个确切的问题

In Matlab,how can I use chroma subsampling to downscale a 4:4:4 image to 4:2:0 when the image is in YCbCr?

他将色度从 4:4:4 缩小到 4:2:0,我想从 4:4:4 缩小到 4:1:1。我不知道该怎么做?

YUV = rgb2ycbcr(RGB);
Y = YUV(:,:,1);
U = YUV(:,2);
V = YUV(:,3);

执行缩减

U = double(YUV(:,2))
V = double(YUV(:,3))

newU = ??
newV =??

有人可以帮我吗?

提前致谢。

解决方法

在 YUV 4:1:1 中,色度通道在水平轴上按 1/4 的系数进行下采样。

使用 imresize,解决方案很简单:

newU = imresize(U,[size(U,1),size(U,2)/4]);
newV = imresize(V,[size(V,size(V,2)/4]);

注意事项:

  • 上述解决方案有效,仅当输入的水平分辨率为 4 的倍数时。
  • imresize 的默认参数在启用抗锯齿的情况下应用三次插值。
    大多数实际实现使用更简单的插值方法,例如没有抗锯齿的线性插值。
  • YUV 4:1:1(Y:Cb:Cr 4:1:1 的同义词)指的是色度下采样,但有多种选项可以对流视频、RAM 或文件中的组件进行排序。

色度子采样插图:
enter image description here [https://robbeekmans.net/euc/vmware-horizo​​n-7-4-blast-gets-necessary-update-support-chroma-subsampling-444-h-264/]

另一个例子:
enter image description here [https://academickids.com/encyclopedia/index.php/YUV_4:2:0]


不使用 imresize 实现:

如果您想要与 imresize 相同的结果(无抗锯齿的双线性):

refU = imresize(U,2)/4],'bilinear','Antialiasing',false);
% refV = ...

下面的代码是等价的:

U = double(U);
V = double(U);
newU = uint8(round(U(:,2:4:end) + U(:,3:4:end))/2);
newV = uint8(round(V(:,2:4:end) + V(:,3:4:end))/2);

您也可以使用每 4 个元素的平均值(如果减少噪音很重要,则更好):

U = double(U);
V = double(V);
newU = uint8(round((U(:,1:4:end) + U(:,3:4:end) + U(:,4:4:end))/4));
newV = uint8(round((V(:,1:4:end) + V(:,3:4:end) + V(:,4:4:end))/4));

注意:
我更喜欢术语“下采样”而不是“子采样”。
按 1/4 进行二次采样意味着跳过 - 每 4 个元素采样一次,并忽略其他 3 个。
从历史上看,在模拟(或混合模拟/数字)视频系统中,转换为 4:1:1 的过程最有可能通过模拟二次采样进行。
在数字系统中,当您已经拥有 4:4:4 信息时,平均样本比跳过样本更好。
我认为“下采样”一词更合适(但“下采样”是常用术语)。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...