2013-10-08 88 views
0

我想用MATLAB來實現JPEG壓縮。那麼在符號概率(霍夫曼編碼)計算的地方,我可以看到一些負值。我相信這是不正確的!如果有人可以提供一些幫助或指示,我會非常感激。感謝你們所有人提前。我使用MATLAB R2012b。下面是代碼:用JPEG壓縮奇怪的結果

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

答案是否已解決問題或幫助? – chappjc

回答

0

我想你可能有histsymbolsp)輸出交換。概率應該從箱數計算,這是hist的第一個輸出。

[nelements,centers] = hist(data,xvalues)返回一個額外的行向量,centers,指示每個倉中心在x軸上的位置。要繪製直方圖,可以使用bar(centers,nelements)

換句話說,代替目前的線,

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

只使用,

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

此外,final是一個矩陣,而不是一個矢量,所以nelements將是一個矩陣:

如果data是一個矩陣,然後爲每列分別創建一個直方圖。每個直方圖都以不同的顏色顯示在同一個圖上。

+0

感謝您的快速響應。我認爲知道更清楚。我會繼續嘗試 – anarnik

+0

在這裏,回覆往往很快。無論如何,讓我知道如果你遇到其他問題或如果你得到它的工作。樂意效勞。 – chappjc

+0

那麼,如果我理解正確(也看代碼的結果),符號將是概率。我試圖用符號但編譯期間這樣的錯誤發生這種情況:使用huffmandict(線71) 錯誤符號輸入必須是一個矢量 錯誤JPEG2(線49) [字典,avglen] = huffmandict(符號,p); – anarnik