程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了解码 jpeg 时,我将如何在 matlab 中反转色度下采样?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决解码 jpeg 时,我将如何在 matlab 中反转色度下采样??

开发过程中遇到解码 jpeg 时,我将如何在 matlab 中反转色度下采样?的问题如何解决?下面主要结合日常开发的经验,给出你关于解码 jpeg 时,我将如何在 matlab 中反转色度下采样?的解决方法建议,希望对你解决解码 jpeg 时,我将如何在 matlab 中反转色度下采样?有所启发或帮助;

嗨,尝试制作一个简单的 jpeg 压缩器,它还可以解压缩图像。我使用以下代码在 jpeg 压缩的第一步中对图像的色度进行下采样。

resampler = vision.ChromaResampler;
[Cb,Cr] = resampler(Cb_chAnnel,Cr_chAnnel);

该函数是 matlab 计算机视觉工具箱的一部分。

例如在下采样之前:

Y 尺寸 = 3024 x 4032; Cb 和 Cr 尺寸 = 3024 x 4032

下采样后:

Y 尺寸 = 3024 x 4032; Cb 和 Cr 尺寸 = 3024 到 2016 年

要显示解压后的原始 RGB 图像,所有 3 个 Y、Cb 和 Cr 分量的尺寸需要相同,以便我可以合并通道并将图像转换回 RGB。我正在使用以下代码来实现这一点:

Cb_resized = imresize(Cb,[(size(Cb,1)) (2*size(Cb,2))]);
Cr_resized = imresize(Cr,[(size(Cr,1)) (2*size(Cr,2))]);

当我然后合并 3 个通道并使用 imshow() 查看图像时,它看起来不错。那么上述方法是解码jpeg时反转下采样色度的正确方法吗?

解决方法

使用 imresize 进行上采样“几乎是正确的”。

最好使用 imresize 进行上采样,而不是使用 vision.ChromaResampler

up_resampler = vision.ChromaResampler();
up_resampler.Resampling = '4:2:2 to 4:4:4';

[Cb_resized,Cr_resized] = up_resampler(Cb,Cr);

模块的设计使得Resampling = '4:2:2 to 4:4:4'“反转”Resampling = '4:4:4 to 4:2:2'的结果。


'4:4:4 to 4:2:2' ChromaResampler 使用将结果向右移动 0.5 像素的约定。
(我认为移动 0.5 个像素应该符合 MPEG-1 编解码器标准)。

0.5 的位移没有得到很好的记录 - 我不得不建立一个简短的测试来弄清楚。

据我所知,MPEG-1 编解码器使用移动 0.5 个像素的约定,但 MPEG-2 和更新的编解码器不使用该约定。
我不认为它被 JPEG 使用,但我不确定...

注意:
由于人类视觉系统对色度分辨率不是很敏感,如果使用 0.5 位移,您可能不会看到差异。


要获得与 ChromaResampler 相同的结果,您可以使用 imwarp,在水平轴上位移 1 个像素。

理解 imwarp 有点复杂
我将使用 imwarp 来演示 1 像素位移,给出与 ChromaResampler 相同的结果:

以下代码示例显示了等效性:

close all

I = imread('peppers.png'); % Read sample image
YUV = rgb2ycbcr(I); % Convert RGB to Y:Cb:Cr
U = YUV(:,:,2); % Get U color chAnnel
V = YUV(:,3); % Get V color chAnnel

down_resampler = vision.ChromaResampler(); % 4:4:4 to 4:2:2
down_resampler.Resampling = '4:4:4 to 4:2:2';

up_resampler = vision.ChromaResampler(); % 4:2:2 to 4:4:4
up_resampler.Resampling = '4:2:2 to 4:4:4';

% Down-sample U and V using ChromaResampler
[downU,downV] = down_resampler(U,V);

%downU2 = imresize(U,[size(U,1),size(U,2)/2]); % Not the same as using imresize
%figure;imshow(downU);figure;imshow(downU2);

% Up-sample downU and downV using ChromaResampler
[upU,upV] = up_resampler(downU,downV);

% Result is not the same as using imresize
%resizedU = imresize(downU,[size(downU,size(downU,2)*2],'bilinear');
%resizedV = imresize(downV,[size(downV,size(downV,'bilinear');

% Use transformation matrix that resize horizontally by x2 and include single pixel horizontal displacement.
tform = affine2d([ 2   0   0
                   0   1   0
                  -1   0   1]);

% Use imwarp instead of imresize (the warp includes horizontal displacement of 1 pixel)
warpU = imwarp(downU,tform,'bilinear','OutputView',imref2d([size(downU,2)*2]));
warpU(:,end) = warpU(:,end-1); % Fill the last column by duplication

%figure;imagesc(double(upU) - double(resizedU));impixelinfo
%figure;imshow(upU);figure;imshow(resizedU);
%figure;imshow(upU);figure;imshow(warpU);

% Show the differences:
figure;imagesc(double(upU) - double(warpU));title('Diff');impixelinfo
max_abs_diff = max(imabsdiff(warpU(:),upU(:)));
disp(['max_abs_diff = ',num2str(max_abs_diff)]); % Maximum absolute differenced is 1 (due to rounding).

注意:imresize 的用法保留在注释中。


注意:
imresize的默认插值方法是三次插值,ChromaResampler默认的插值方法是线性插值。
三次插值被认为是优越的,但通常使用线性插值(可见差异可以忽略不计)。

大佬总结

以上是大佬教程为你收集整理的解码 jpeg 时,我将如何在 matlab 中反转色度下采样?全部内容,希望文章能够帮你解决解码 jpeg 时,我将如何在 matlab 中反转色度下采样?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。