【发布时间】:2020-06-01 22:15:41
【问题描述】:
我已经将 jpg 图像从 RGB 转换为 YCbCr,但现在必须使用 Chroma Subsampling 使它们成为 4:2:0。我已经搜索但没有找到有关如何执行此操作的任何信息(注意:我对 Matlab 非常陌生)
编辑:我现在有了这个,但是在我设置 ycbcr(:,:,2) = newCb 的底部它说“无法执行分配,因为左侧的大小是 1273-by-1910 并且大小右边是 1273×955×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;
【问题讨论】:
-
您使用了错误的转换公式。您可以使用我帖子中的公式:How to convert sRGB to NV12 format using NumPy?。请阅读问题和答案(忽略NV12订购部分)。
-
您收到错误消息,因为在 MATLAB 中,当每个平面具有不同尺寸时,您无法创建 3D 矩阵。您不能使用
imwrite将输出保存到单个文件中。我可以推荐你使用fopen,fwrite代表 Y,fwrite代表 newCb,fwrite代表新 Cr,fclose。使用.raw或“.yuv”扩展名命名文件(它是二进制文件而不是图像文件)。 -
我用完整的解决方案更新了我的帖子。
-
你能完成这个任务吗? ycbcr(:,:,2) = newCb
标签: matlab multimedia subsampling