我已经将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;
您可以简单地将Cb
和Cr
的大小在每个轴上调整为0.5:
假设:
YUV = rgb2ycbcr(RGB);
Y = YUV(:, :, 1);
U = YUV(:, :, 2);
V = YUV(:, :, 3);
[Y
通道未修改(4:2:0的Y
与4:4:4格式相同)
将U
和V
降采样0.5以获得4:2:0格式:
newU = imresize(U, 0.5);
newV = imresize(V, 0.5);
在MATLAB中,您通常希望保留420个结果Y
,newU
,newV
和3个矩阵(平面格式),而不是将矩阵合并为一个矩阵。
4:2:0格式没有规定特定的组件顺序(例如I420或NV12 ...),因此这三个矩阵被认为是4:2:0格式。
不使用imresize
的下采样:
您可以使用以下代码示例对U
和V
进行下采样:
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);