在Matlab中,当图像位于YCbCr中时,如何使用色度二次采样将4:4:4图像缩小为4:2:0?

问题描述 投票:0回答:1

我已经将jpg图像从RGB转换为YCbCr,但现在必须使用色度二次采样将其设为4:2:0。我已经搜索过但未找到有关如何执行此操作的任何信息(注意:我对Matlab还是很陌生)

编辑:我现在有了这个,但是在我设置ycbcr(:,:,2)= newCb的底部,它说“无法执行赋值,因为左侧的尺寸是1273乘1910的尺寸,右边是1273-by-955-by-0。“

function f = conversion(source_image, source_name)

image = imread(source_image);

% conversion_matrix = [0.299 -0.168736 0.5;
%                      0.587 -.0331264 -.0418688;
%                      0.114  0.5 -.081312];

conversion_matrix = [0.299 0.587 0.114;
                     -0.168736 -.0331264 0.5;
                     0.5  -.0418688 -.081312];

ycbr = reshape(double(image),[],3)*conversion_matrix;

ycbr = reshape(uint8(ycbr),size(image));

Y = ycbr(:,:,1)+ 0;
Cb = ycbr(:,:,2)+ 0.5;
Cr = ycbr(:,:,3)+ 0.5;

Cb = double(Cb);
newCb = uint8(round((Cb(:,1:2:end, 1:2:end) + Cb(:,2:2:end, 1:2:end) + Cb(:,1:2:end, 2:2:end) + Cb(:,2:2:end, 2:2:end)) / 4));
Cr = double(Cr);
newCr = uint8(round((Cr(:,1:2:end, 1:2:end) + Cr(:,2:2:end, 1:2:end) + Cr(:,1:2:end, 2:2:end) + Cr(:,2:2:end, 2:2:end)) / 4));

ycbcr(:,:,1) = Y;
ycbcr(:,:,2) = newCb;
ycbcr(:,:,3) = newCr;

imshow(ycbcr);
imwrite(ycbcr, source_name);

f = ycbcr;
matlab multimedia subsampling
1个回答
1
投票

您可以简单地将CbCr的大小在每个轴上调整为0.5:

假设:

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

[Y通道未修改(4:2:0的Y与4:4:4格式相同)

UV降采样0.5以获得4:2:0格式:

newU = imresize(U, 0.5);
newV = imresize(V, 0.5);

在MATLAB中,您通常希望保留420个结果YnewUnewV和3个矩阵(平面格式),而不是将矩阵合并为一个矩阵。

4:2:0格式没有规定特定的组件顺序(例如I420或NV12 ...),因此这三个矩阵被认为是4:2:0格式。


不使用imresize的下采样:

您可以使用以下代码示例对UV进行下采样:

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

结果等效于使用双线性插值调整大小,而没有抗锯齿滤波器:

shrunkU = imresize(U, 0.5, 'bilinear', 'Antialiasing', false);
© www.soinside.com 2019 - 2024. All rights reserved.