Image erzeugen von Huffman-code - Matlab
Habe ich ein Projekt über die Bild-Komprimierung in Matlab. Bisher habe ich erfolgreich umgesetzt Huffman-Codierung, um das Bild, das gibt mir einen Vektor von binären codes. Nach, dass ich die Huffman-Decodierung und ich bekomme ein Vektor enthält die Elemente des Bildes komprimiert. Mein problem ist, dass ich finden kann, wie möglich von diesem Vektor um das Bild zu rekonstruieren und erstellen der image-Datei.
Jede Hilfe wäre dankbar
Update
Basierend auf Ben A. helfen, ich habe Fortschritte gemacht, aber ich habe noch einige Fragen.
Um genauer zu sein. Ich habe eine Bild-matrix. Nach der Suche nach einzigartigen Symbole(Elemente) auf diesem Bild-matrix, berechne ich die Wahrscheinlichkeiten und dann mit dieser Funktion:
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)
ich berechnen Sie die huffman-codes für das Bild.
Nun verwende ich diese Funktion:
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
wo in src-lege ich mein Bild (matrix) und ich bekomme eine codierte Sequenz, die für mein Bild.
Letzten ist diese Funktion:
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
Welche verwendet wird zum decodieren der codierten Sequenz. Das problem ist, dass schließlich als codierte Sequenz bekomme ich einen 1x400 matrix, wo sollte ich bekommen eine 225x400 das ist mein Bild-Dimensionen.
Bin ich etwas fehlt? Vielleicht sollte ich etwas ersetzen, weil ich eine matrix und nicht eine Zahlenfolge (für den der code geschrieben ist)?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht einen Blick auf diese:
http://www.mathworks.com/matlabcentral/answers/2158-huffman-coding-and-decoding-for-image-jpeg-bmp
Dieser scheint wie es ist bis Ihre Gasse. Es sollte letztendlich führen Sie hier:
http://www.mathworks.com/matlabcentral/fileexchange/26384-ppt-for-chapter-9-of-matlabsimulink-for-digital-communication