0

我想通过使用 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????
4

1 回答 1

0

我认为您可能交换了hist(symbols和) 的输出。p概率应根据 bin 计数计算,这是 的第一个输出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是矩阵,则为每列单独创建一个直方图。每个直方图都以不同的颜色显示在同一图形上。

于 2013-10-08T15:56:11.260 回答