2012-06-25 1 views
1

일부 이미지를 그레이 스케일로 변환하고 허프만 인코딩을 사용하여 압축해야하는 숙제가 있습니다. 나는 그 (것)들을 그레이 스케일로 변환했다, 그리고 나는 그들을 압축하려고 노력했다. 그러나 나는 오류를 얻는다. 내가 찾은 코드를 here으로 사용했습니다.MATLAB - 이미지 허프만 인코딩

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. 각 이미지의 압축률을 어떻게 찾을 수 있습니까?

답변

0

첫째, 시도 :의 유형은 단일 또는 이중해야처럼

whos A 

이 보인다. 그렇지 않다면, imread 라인 다음에 A = double(A)을 수행하십시오. 그런 식으로 작동해야하지만, 나는 hist가 변환을하고 있지 않다는 것에 놀랐다 ... [편집] 방금 테스트했는데, 맞다. hist는 uint8에서 작동하지 않을 것이지만, 변환하자 마자 괜찮아. 내 이미지를 두 배로 늘려라.

+0

나는 그것을했다. 다음은 코드'A = imread ('Gray \ 36.png')입니다. A = 이중 (A); [기호, p] = hist (A, 고유 한) p = p/sum (p) [dict, avglen] = huffmandict (symbols, p) comp = huffmanenco (A, dict)'지금 '오류를 사용하여 오류 huffmandict (줄 71) 기호 입력 벡터합니다' –

+0

그래서 다른 오류가 있습니다. 당신의 행운의 날입니다 : D – CTZStef

+0

symbols은 벡터가 아닙니다. 사실, hist는 각 행의 빈도 수를 제공하고 빈 위치 (예 : 회색 수)를 xout으로 제공합니다. 그것들은 양방향이다. 그래서 제가 이해할 때, 심볼의 값을 각각의 열에 합하면, 여러분이 원하는 벡터를 얻을 수 있습니다. 추측 : symbols = symbols/sum (symbols);) – CTZStef

2

문제점은 bin 위치 ('hist'의 두 번째 입력 인수)를 지정할 때 단일 또는 이중이어야합니다. 그러나 벡터 A 자체는 그렇지 않습니다. 때때로 전체 데이터 세트를 정수 유형에서 부동 정밀도로 변환하고 싶지 않기 때문에 좋습니다. 이렇게하면 코드가 수정됩니다.

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

Click here이 문제는 더 자세히 논의됩니다.