JPEG压缩的奇怪结果

时间:2013-10-08 14:42:08

标签: matlab image-processing huffman-code

我想用MATLAB实现JPEG压缩。在计算符号概率(霍夫曼编码)的点处,我可以看到一些负值。我确信这不正确!如果有人可以提供一些帮助或指示,我会非常感激。提前感谢大家。我使用MATLAB R2012b。这是代码:

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????

1 个答案:

答案 0 :(得分:0)

我认为您可能会交换histsymbolsp)的输出。概率应根据箱数计算,这是hist的第一个输出。

  

[nelements,centers] = hist(data,xvalues)返回一个额外的行向量centers,指示每个bin中心在x轴上的位置。要绘制直方图,您可以使用bar(centers,nelements)

换句话说,而不是你当前的行,

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

只需使用,

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

此外,final是一个矩阵而不是一个向量,因此nelements将是一个矩阵:

  

如果data是矩阵,则为每列单独创建直方图。每个直方图都以不同的颜色显示在同一个图上。