Difficulty in applying huffman encoding for image compression

I got the given code to apply Huffman Encoding for image compression. But i am getting the error-
Error using huffmandict (line 71)
The symbol input must be a vector
Error in new (line 5)
[dict,avglen]=huffmandict(symbols,p)
The code is:
A=imread('xyz.jpg');
[symbols,p]=hist(A,double(unique(A)))
p=p/sum(p)
[dict,avglen]=huffmandict(symbols,p)
comp=huffmanenco(A,dict)
Help me as i am new to all these concepts.

回答(2 个)

When I have tested your code with the test image, both symbols and p have different sizes (see in the attached image) Read the documentation about huffmandict Clearly mentioned that-
The length of p must equal the length of symbols.
-------------------------------------------------------------------------------------------------------------------------------------------- Updated Answer
I have suspected another issue if you consider any 1 D array, the following code is working (Note that an image is 2D)
%A=double(imread('test.jpg'));
p=[.5 .125 .125 .125 .0625 .0625];
A=randsrc(100,1,[1:6; p]);
%[symbols,p]=hist(A,double(unique(A)));
[p,symbols]=hist(A,double(unique(A)));
p=p/sum(p);
[dict,avglen]=huffmandict(symbols,p);
comp=huffmanenco(A,dict);

3 个评论

Now i have converted the image to vetor ,but new error is coming -
Source symbols repeat
Also the new 'p' is 256x1 double and 'symbols' is 1x256 double. What should i do now?
I have updated the answer, please check.
Have you read here?
I am using R2014a ,so histcounts() is not present. Can you suggest any other alternative?

请先登录,再进行评论。

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

6 个评论

[symbols, idx] = unique(A(:));
counts = accumarray(idx, 1);
p = counts ./ sum(counts);
[dict,avglen]=huffmandict(symbols,p);
comp=huffmanenco(A,dict);
Error-
The symbol and probability vector must have the same length
[symbols, ~, idx] = unique(A(:));
counts = accumarray(idx, 1);
p = counts ./ sum(counts);
[dict,avglen]=huffmandict(symbols,p);
comp=huffmanenco(A(:),dict);
The output image is a vertical thin line along with the message-
Warning: Image is too big to fit on screen; displaying at 0%
The output is not an image: it is a double vector containing the values 0 and 1.

请先登录,再进行评论。

类别

帮助中心File Exchange 中查找有关 Denoising and Compression 的更多信息

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by