2012-06-25 61 views
1

我有一個作業,我必須將一些圖像轉換爲灰度並使用哈夫曼編碼進行壓縮。我將它們轉換爲灰度,然後嘗試壓縮它們,但出現錯誤。我用我發現的代碼hereMATLAB - 圖像哈夫曼編碼

這裏是我使用的代碼:

A=imread('Gray\36.png'); 
[symbols,p]=hist(A,unique(A)) 
p=p/sum(p) 
[dict,avglen]=huffmandict(symbols,p) 
comp=huffmanenco(A,dict) 

這是我的錯誤。它發生在第二行。

Error using eps 
Class must be 'single' or 'double'. 

Error in hist (line 90) 
    bins = xx + eps(xx); 

我在做什麼錯?

謝謝。

P.S.我怎樣才能找到每個圖像的壓縮率?

回答

0

第一,嘗試:

whos A 

好像它的類型必須是單或雙。如果沒有,只要在imread行後執行A = double(A)即可。應該這樣工作,但是我很驚訝hist沒有在做轉換... [編輯]我剛剛測試過它,我說得對,hist不會在uint8中工作,但是一轉換就可以了我的形象翻了一番。

+0

我做到了。這裏是代碼'A = imread('Gray \ 36.png'); A =雙(A); [symbols,p] = hist(A,unique(A)) p = p/sum(p) [dict,avglen] = huffmandict(symbols,p) comp = huffmanenco(A,dict)我得到的錯誤,'錯誤使用huffmandict(71行) 符號輸入必須是一個向量' –

+0

所以你有另一個錯誤。這是你猜我幸運的一天:D – CTZStef

+0

符號不是矢量。實際上,hist會給出每行中的頻率計數,並且給出bin位置(即灰度級的數量)。他們是二維的。據我瞭解,只需將符號中的值分別總結到列中,即可得到您想要的矢量。 GUESS:symbols = symbols/sum(symbols);) – CTZStef

2

問題是,當您指定倉位('hist'的第二個輸入參數)時,它們需要是單或雙。向量A本身不,但。這很好,因爲有時你不想將整個數據集從整數類型轉換爲浮點精度。這會修復你的代碼:

[symbols,p]=hist(A,double(unique(A))) 

Click here看到這個問題會更詳細的討論。