0

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)

画像のハフマンコードを計算します。

今私はこの関数を使用します:

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

ここで、srcに画像(行列)を配置すると、画像のコード化されたシーケンスが取得されます。

最後はこの関数です:

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を取得する必要があることです。私は何かが足りないのですか?数列(コードが書かれている)ではなく行列があるので、何かを置き換える必要がありますか?

4

1 に答える 1

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

于 2012-06-28T13:41:49.087 に答える