我有一個關於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)
我計算霍夫曼碼的圖像。
現在,我使用這個功能:
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這是我的圖像尺寸。 我錯過了什麼?也許我應該替換一些東西,因爲我有一個矩陣,而不是一個數字序列(代碼寫入)?
非常有益的,實際上它涉及到比我最初的代碼更好的結果(也計算碼長等)。不過,我仍然有一個編碼序列的矢量,我不知道如何將它們轉換爲圖像文件。 – astralreb