如何解决在 Matlab 中,当图像在 YCbCr 中时,如何使用色度子采样将 4:4:4 图像缩小到 4:1:1?
按照这个确切的问题
他将色度从 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 或文件中的组件进行排序。
色度子采样插图:
[https://robbeekmans.net/euc/vmware-horizon-7-4-blast-gets-necessary-update-support-chroma-subsampling-444-h-264/]
另一个例子:
[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 信息时,平均样本比跳过样本更好。
我认为“下采样”一词更合适(但“下采样”是常用术语)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。