Matlab에서 이미지 압축에 관한 프로젝트를했습니다. 지금까지 나는 나에게 이진 코드의 벡터를주는 이미지에 허프만 인코딩을 성공적으로 구현했다. 그 후 허프만 디코딩을 실행하면 압축 된 이미지의 요소가 포함 된 벡터가 생성됩니다. 내 문제는이 벡터에서 이미지를 재구성하고 이미지 파일을 만드는 방법을 찾을 수 있다는 것입니다.허프만 코드에서 이미지 만들기 - Matlab
어떤 도움을 내가 진전을하지만 난 여전히 몇 가지 문제가 벤 A. 도움을 바탕으로 업데이트
감사 할 것입니다. 더 정확하게 말하십시오. 나는 이미지 매트릭스를 가지고있다. 본 이미지 행렬에 고유 기호 (요소)를 찾은 후,이 함수에 그 확률을 계산하고 :
function [h,L,H]=Huffman_code(p,opt) % Huffman code generator gives a Huffman code matrix h, % average codeword length L & entropy H % for a source with probability vector p given as argin(1) zero_one=['0'; '1']; if nargin>1&&opt>0, zero_one=['1'; '0']; end if abs(sum(p)-1)>1e-6 fprintf('\n The probabilities in p does not add up to 1!'); end M=length(p); N=M-1; p=p(:); % Make p a column vector h={zero_one(1),zero_one(2)}; if M>2 pp(:,1)=p; for n=1:N % To sort in descending order [pp(1:M-n+1,n),o(1:M-n+1,n)]=sort(pp(1:M-n+1,n),1,'descend'); if n==1, ord0=o; end % Original descending order if M-n>1, pp(1:M-n,n+1)=[pp(1:M-1-n,n); sum(pp(M-n:M-n+1,n))]; end end for n=N:-1:2 tmp=N-n+2; oi=o(1:tmp,n); for i=1:tmp, h1{oi(i)}=h{i}; end h=h1; h{tmp+1}=h{tmp}; h{tmp}=[h{tmp} zero_one(1)]; h{tmp+1}=[h{tmp+1} zero_one(2)]; end for i=1:length(ord0), h1{ord0(i)}=h{i}; end h=h1; end L=0; for n=1:M, L=L+p(n)*length(h{n}); end % Average codeword length H=-sum(p.*log2(p)); % Entropy by Eq.(9.1.4)
내가 이미지 허프만 코드를 계산한다. SRC에 난 내 이미지 (매트릭스) 그리고 난을 넣어 function coded_seq=source_coding(src,symbols,codewords)
% Encode a data sequence src based on the given (symbols,codewords).
no_of_symbols=length(symbols); coded_seq=[];
if length(codewords)<no_of_symbols
error('The number of codewords must equal that of symbols');
end
for n=1:length(src)
found=0;
for i=1:no_of_symbols
if src(n)==symbols(i), tmp=codewords{i}; found=1; break; end
end
if found==0, tmp='?'; end
coded_seq=[coded_seq tmp];
end
내 이미지에 대한 코딩 순서를 얻을 : 지금 나는이 기능을 사용합니다.
function decoded_seq=source_decoding(coded_seq,h,symbols)
% Decode a coded_seq based on the given (codewords,symbols).
M=length(h); decoded_seq=[];
while ~isempty(coded_seq)
lcs= length(coded_seq); found=0;
for m=1:M
codeword= h{m};
lc= length(codeword);
if lcs>=lc&codeword==coded_seq(1:lc)
symbol=symbols(m); found=1; break;
end
if found==0, symbol='?'; end
end
decoded_seq=[decoded_seq symbol];
coded_seq=coded_seq(lc+1:end);
end
코딩 시퀀스를 디코딩하는데 사용된다
마지막
이 함수이다. 문제는 마침내 코딩 된 시퀀스로 내가 1x400 매트릭스를 얻을 수 있는데, 여기서 225x400은 내 이미지 크기입니다. 내가 누락 된 것이 있습니까? 어쩌면 나는 행렬이 있고 숫자 시퀀스가 아니기 때문에 (코드가 작성된) 무언가를 대체해야합니까?
매우 helpfull 실제로 내 초기 코드보다 더 나은 결과를 제공 (그것은 또한 코드 길이 등을 계산). 그러나 나는 아직도 이미지 파일에서 그들을 변환하는 방법을 모르는 코드화 된 시퀀스의 벡터를 가지고있다. – astralreb