2012-06-28 5 views
0

У меня есть проект об сжатии изображения в Matlab. До сих пор я успешно реализовал кодировку Хаффмана для изображения, которое дает мне вектор двоичных кодов. После этого я запускаю декодирование Хаффмана, и я получаю вектор, содержащий элементы сжатого изображения. Моя проблема в том, что я могу найти, как это возможно из этого вектора, чтобы восстановить изображение и создать файл изображения.Создать изображение из кода Хаффмана - Matlab

Любой помощь будет признательна

Update

на основе Бен А. помощью я добился прогресса, но я до сих пор есть некоторые проблемы. Точнее. У меня есть матрица изображений. После обнаружения уникальных символов (элементы) на этой матрице изображения, я вычислить вероятности, а затем с помощью этой функции:

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) 

я вычислить Хаффман коды для изображения.

Теперь я использую эту функцию:

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, который является моим размером изображения. Я что-то не хватает? Может быть, мне нужно что-то заменить, потому что у меня есть матрица, а не последовательность чисел (для которой написан код)?

ответ

1

Вы можете посмотреть на это:

http://www.mathworks.com/matlabcentral/answers/2158-huffman-coding-and-decoding-for-image-jpeg-bmp

Это кажется, что это правильно Ваш переулок. Это в конечном итоге должно привести вас сюда:

http://www.mathworks.com/matlabcentral/fileexchange/26384-ppt-for-chapter-9-of-matlabsimulink-for-digital-communication

+0

Очень полезно и на самом деле речь идет о лучших результатах, чем мой исходный код (он также вычисляет код длину и т.д.). Однако у меня все еще есть вектор кодированных последовательностей, которые я не знаю, как их преобразовать в файл изображения. – astralreb

Смежные вопросы