Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab中dct变换后的矢量转换_Matlab_Math_Vector_Dct - Fatal编程技术网

Matlab中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块。之后,将值四舍五入到最接

我正在使用dct变换频域中的矢量(矢量可以是一个8x8窗口中较大矩阵的一行),我希望afterwords能够在类似于jpeg压缩的过程中对该矢量进行量化,因为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