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(symbolsp) の出力が入れ替わっている可能性があると思います。確率は、 の最初の出力であるビン カウントから計算する必要がありますhist

[nelements,centers] = hist(data,xvalues)centersx 軸上の各ビンの中心の位置を示す、追加の行ベクトル を返します。ヒストグラムをプロットするには、 を使用できますbar(centers,nelements)

つまり、現在の行の代わりに、

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

使うだけで、

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

また、finalはベクトルではなく行列であるためnelements、行列になります。

が行列の場合data、ヒストグラムは列ごとに個別に作成されます。各ヒストグラム プロットは、同じ Figure に異なる色で表示されます。

于 2013-10-08T15:56:11.260 に答える