Matlab JPEG压缩的奇怪结果

Matlab JPEG压缩的奇怪结果,matlab,image-processing,huffman-code,Matlab,Image Processing,Huffman Code,我想用MATLAB实现JPEG压缩。在计算符号的概率(哈夫曼编码)时,我可以看到一些负值。我确信这是不正确的!!!如果有人能给我一些帮助或指导,我会非常感激。先谢谢大家。我使用MatlabR2012B。代码如下: clc; clear all; a = imread('test.png'); b = rgb2gray(a); b = imresize(b, [256 256]); b = double(b); final = zeros(256, 256); mask = [1 1

我想用MATLAB实现JPEG压缩。在计算符号的概率(哈夫曼编码)时,我可以看到一些负值。我确信这是不正确的!!!如果有人能给我一些帮助或指导,我会非常感激。先谢谢大家。我使用MatlabR2012B。代码如下:

clc; 
clear all;
a = imread('test.png');
b = rgb2gray(a);
b = imresize(b, [256 256]);
b = double(b);
final = zeros(256, 256);

mask = [1   1   1   1   1   1   1   1 
        1   1   1   1   1   1   1   0
        1   1   1   1   1   1   0   0
        1   1   1   1   1   0   0   0
        1   1   1   1   0   0   0   0
        1   1   1   0   0   0   0   0
        1   1   0   0   0   0   0   0
        1   0   0   0   0   0   0   0];

 qv1 = [ 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];

t = dctmtx(8);
DCT2D = @(block_struct) t*block_struct.data*t';
msk = @(block_struct) mask.*block_struct.data;

for row = 1:8:256
   for column = 1:8:256
       x = (b(row:row+7, column:column+7));
       xf = blockproc(x, [8 8], DCT2D);
       xf1 = blockproc(xf, [8 8], msk);
       xf1 = round(xf1./qv1).*qv1;
       final(row:row+7, column:column+7) = xf1;
   end 
end

[symbols,p] = hist(final,unique(final));
bar(p, symbols);
p = p/sum(p); %NEGATIVE VALUES????

我想您可能已经交换了
hist
symbols
p
)的输出。概率应根据箱子计数计算,这是
hist
的第一个输出

[neelements,centers]=hist(data,xvalues)
返回一个额外的行向量,
centers
,指示每个箱子中心在x轴上的位置。要绘制直方图,可以使用
条形图(中心、元素)

换句话说,不是你现在的路线

[symbols,p] = hist(final,unique(final));
就用,

[p,symbols] = hist(final,unique(final));
另外,
final
是矩阵而不是向量,因此
neelements
将是矩阵:

如果
数据
是一个矩阵,则为每列分别创建一个直方图。每个直方图以不同的颜色显示在同一图形上


谢谢你的快速回复。我认为这一点更清楚。我会继续尝试,这里的反应会很快。不管怎样,如果你遇到其他问题,或者你让它工作了,请告诉我。很高兴能帮上忙。如果我理解正确(也要看代码的结果),符号就是概率。我试图使用符号,但在编译过程中出现了这样的错误:使用huffmandict的错误(第71行)符号输入必须是JPEG 2中的向量错误(第49行)[dict,avglen]=huffmandict(symbols,p);如果我理解正确(也要看代码的结果),符号就是概率。我试图使用符号,但在编译过程中出现了这样的错误:使用huffmandict的错误(第71行)符号输入必须是JPEG 2中的向量错误(第49行)[dict,avglen]=huffmandict(symbols,p);经过谷歌的一些研究,我发现下面的命令:symbols=symbols/sum(symbols)可以解决这个问题。事实上,上面的错误没有再次出现,直方图比以前更加紧凑,没有不同的颜色。但另一个错误与第一个问题有关:使用huffmandict(第85行)的错误输入符号的概率不能是JPEG 2中的负错误(第49行)[dict,avglen]=huffmandict(symbols,p);这些符号不包含任何负值。另一方面,p向量包含很多负值,我认为这导致了错误。答案解决了问题还是有帮助?