Matlab中dct变换后的矢量转换
我正在使用dct变换频域中的矢量(矢量可以是一个8x8窗口中较大矩阵的一行),我希望afterwords能够在类似于jpeg压缩的过程中对该矢量进行量化,因为dct返回浮点,这对我进行任何进一步的操作都没有帮助。非常感谢您对如何做到这一点的任何帮助Matlab中dct变换后的矢量转换,matlab,math,vector,dct,Matlab,Math,Vector,Dct,我正在使用dct变换频域中的矢量(矢量可以是一个8x8窗口中较大矩阵的一行),我希望afterwords能够在类似于jpeg压缩的过程中对该矢量进行量化,因为dct返回浮点,这对我进行任何进一步的操作都没有帮助。非常感谢您对如何做到这一点的任何帮助 谢谢。如果您想知道JPEG/MPEG量化是如何工作的,在计算每个8 x 8块的DCT后,每个DCT编码块都会应用一个量化矩阵 量化的工作原理是量化矩阵也是8x8。通过在原始DCT块和量化矩阵之间进行逐点分割来计算量化DCT块。之后,将值四舍五入到最接
谢谢。如果您想知道JPEG/MPEG量化是如何工作的,在计算每个8 x 8块的DCT后,每个DCT编码块都会应用一个量化矩阵 量化的工作原理是量化矩阵也是8x8。通过在原始DCT块和量化矩阵之间进行逐点分割来计算量化DCT块。之后,将值四舍五入到最接近的整数,以实现高效压缩。如果要将DCT系数(量化后)转换为二进制序列,则通过以之字形顺序访问块内的系数,将系数重新排序为1D系数流(数组)。在重新排序之后,采用了哈夫曼编码或某种无损压缩算法 JPEG标准中常见的量化矩阵如下所示。这是为了在量化后获得50%的图像质量(使用MATLAB语法): 一旦你有了这个量化矩阵,你可以在MATLAB中做类似的事情。让我们假设中的
是一个8 x 8 DCT编码块
in = double(in); % // Ensure double precision
out = round(in ./ quant_matr);
现在,如果您想要恢复量化块以最终恢复重建的DCT块,只需执行逐点乘法并截断结果中的任何小数
让我们假设
中的是一个8x8量化的块。您可以在MATLAB中执行以下操作:
in = double(in); % // Ensure double precision
out = floor(in .* quant_matr);
请记住,这是有损压缩,因为由于量化,您将无法恢复原始DCT块。封装此想法的完整MATLAB函数脚本可能如下所示:
function [out] = JPEGQuantize(in, flag)
[M,N] = size(in);
if(M ~= 8 && N ~= 8)
error('Image must be an 8 x 8 patch');
end
if(nargin == 1)
flag = 0;
elseif(nargin == 2)
if(strcmpi(flag,'f'))
flag = 0;
elseif(strcmpi(flag,'b'));
flag = 1;
else
error('Please specify the right parameter for quantization: (f)wd or (b)wd');
end
else
error('Please specify the right amount of parameters');
end
% // Ensure double precision
in = double(in);
quant_matr = [16 11 10 16 24 40 51 61; ...
12 12 14 19 26 58 60 55; ...
14 13 16 24 40 57 69 56; ...
14 17 22 29 51 87 80 62; ...
18 22 37 56 68 109 103 77; ...
24 35 55 64 81 104 113 92; ...
49 64 78 87 103 121 120 101; ...
72 92 95 98 112 100 103 99];
if(flag == 0) % Quantize
out = round(in ./ quant_matr);
else
out = floor(in .* quant_matr); % Truncate any decimals
end
您将使用2个参数运行此脚本:
- 8 x 8 DCT块,无论是否量化
- A标志:
flag=f
用于向前(原始到量化),而flag=b
用于向后(量化到重构)
输出为量化块或重构块,具体取决于为标志指定的内容
如果您想了解更多信息,请查看以下链接:
链路#2具有不同的量化矩阵,因此重建图像的质量更高。您可以选择不同的量化矩阵以获得更高的质量,但显然,图像大小会更大,因为在执行无损压缩时可利用的空间更少。将DCT的输出转换为十进制数的目的是什么?请原谅我的无知,但除了JPEG/MPEG压缩之外,我从未听说过将DCT系数转换成十进制数。即使如此,系数还是被量化和四舍五入,这样它们无论如何都会变成十进制。然而,从你的问题来看,不清楚你为什么要这样做。@rayryeng我的错是第一次不清楚,是的,基本上帮助我的是做你描述的操作(如与jpeg相同)。因此,我的问题可以改为,在哪里可以找到更多关于量化过程的信息,因为我想自己用Matlab编写量化过程的代码。好的,那更好!JPEG/MPEG具有应用于每个DCT编码块的单个量化矩阵。有关详细信息,请查看此链接:。本质上,您在DCT块和量化矩阵之间进行逐点分割,并舍入到最接近的整数。要恢复DCT块,只需执行乘法。请记住,这是JPEG/MPEG中有损部分出现的地方。一旦你这样做了,数据就会用无损压缩(熵编码)来压缩。是的,我知道会有一些信息丢失。尽管如此,链接还是很有趣。听起来不错!我把链接改成了维基百科上的一个链接,上面有一个更全面的例子。让我知道进展如何。
function [out] = JPEGQuantize(in, flag)
[M,N] = size(in);
if(M ~= 8 && N ~= 8)
error('Image must be an 8 x 8 patch');
end
if(nargin == 1)
flag = 0;
elseif(nargin == 2)
if(strcmpi(flag,'f'))
flag = 0;
elseif(strcmpi(flag,'b'));
flag = 1;
else
error('Please specify the right parameter for quantization: (f)wd or (b)wd');
end
else
error('Please specify the right amount of parameters');
end
% // Ensure double precision
in = double(in);
quant_matr = [16 11 10 16 24 40 51 61; ...
12 12 14 19 26 58 60 55; ...
14 13 16 24 40 57 69 56; ...
14 17 22 29 51 87 80 62; ...
18 22 37 56 68 109 103 77; ...
24 35 55 64 81 104 113 92; ...
49 64 78 87 103 121 120 101; ...
72 92 95 98 112 100 103 99];
if(flag == 0) % Quantize
out = round(in ./ quant_matr);
else
out = floor(in .* quant_matr); % Truncate any decimals
end