Beruflich Dokumente
Kultur Dokumente
[C,S] = func_Mywavedec2(I,level,Lo_D,Hi_D);
L = length(S);
I_W = zeros(S(L,1),S(L,2));
% approx part
I_W( 1:S(1,1) , 1:S(1,2) ) = reshape(C(1:S(1,3)),S(1,1:2));
for k = 2 : L-1
rows = [sum(S(1:k-1,1))+1:sum(S(1:k,1))];
columns = [sum(S(1:k-1,2))+1:sum(S(1:k,2))];
% horizontal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3);
I_W( 1:S(k,1) , columns ) = reshape( C(c_start:c_stop) , S(k,1:2) );
% vertical part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3);
I_W( rows , 1:S(k,2) ) = reshape( C(c_start:c_stop) , S(k,1:2) );
% diagonal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k,3));
I_W( rows , columns ) = reshape( C(c_start:c_stop) , S(k,1:2) );
end
function [significance_map, refinement] =
func_ezw_enc(img_wavedata,ezw_encoding_threshold);
% img_wavedata: wavelet coefficients to encode
% ezw_encoding_threshold: determine where to stop encoding (a lower
% threshold value gives better image reconstruction quality)
%
% significance_map:
% a string matrix containing significance data for different passes
('p','n','z','t'), where each row contains data for a different scanning
pass.
% refinement: a strubg matrix containing refinement data for different
passes ('0' or '1'), each row contains data for a different scanning pass.
%
subordinate_list = [];
refinement = [];
significance_map = [];
img_wavedata_save = img_wavedata;
img_wavedata_mat = img_wavedata;
if(threshold == init_threshold),
subordinate_list = list;
else
subordinate_list = func_rearrange_list(subordinate_list, list,
scan, img_wavedata_save);
end
[encoded, subordinate_list] =
func_subordinate_pass(subordinate_list, threshold);
refinement = strvcat(refinement, strrep(num2str(encoded), ' ', ''));
threshold = threshold / 2;
end
% significance map
signif_map = [];
signif_index = 1;
% subordinate list
subordinate_list = [];
subordinate_index = 1;
subordinate_list = [];
o_index = 1; % index original_list
a_index = 1; % index add_list
% test index before list, otherwise you get out of matrix dimensions!!
if(size(orig_list,2) >= o_index & wavedata(row, column) ==
orig_list(1,o_index)),
subordinate_list = [subordinate_list orig_list(:,o_index)];
o_index = o_index + 1;
elseif(size(add_list,2) >= a_index & wavedata(row, column) ==
add_list(1,a_index)),
subordinate_list = [subordinate_list add_list(:,a_index)];
a_index = a_index + 1;
end
end
img_ezw_stream_bit = [];
strings = size(significance_map,1);
for i = 1:strings,
% insert significance map using Huffman
index = 1;
while(index <= size(significance_map,2) &
~strcmp(significance_map(i,index),' ')),
if(strcmp(significance_map(i,index),'t')),
img_ezw_stream_bit = [img_ezw_stream_bit '0'];
elseif(strcmp(significance_map(i,index),'z')),
img_ezw_stream_bit = [img_ezw_stream_bit '10'];
elseif(strcmp(significance_map(i,index),'n')),
img_ezw_stream_bit = [img_ezw_stream_bit '110'];
else
img_ezw_stream_bit = [img_ezw_stream_bit '1110'];
end
index = index + 1;
end
% insert seperator
img_ezw_stream_bit = [img_ezw_stream_bit '1111'];
refine = size(strrep(refinement(i,:), ' ', ''),2);
% insert length of refinement (20 bits)
img_ezw_stream_bit = [img_ezw_stream_bit
strrep(char(dec2bin(refine,20)), ' ', '')];
% insert refinement
img_ezw_stream_bit = [img_ezw_stream_bit strrep(refinement(i,:), ' ',
'')];
end
DECOMPRES
significance_map = [];
refinement = [];
complete = 0;
decode = 1;
index = 1;
significance = [];
refine = [];
while(decode),
% get bit
bit = img_ezw_stream_bit(index);
index = index + 1;
if(bit == '1'),
% get next bit
bit = img_ezw_stream_bit(index);
index = index + 1;
if(bit == '1'),
% get next bit
bit = img_ezw_stream_bit(index);
index = index + 1;
if(bit == '1'),
% get next bit
bit = img_ezw_stream_bit(index);
index = index + 1;
if(bit == '1'),
% seperator detected
complete = 1;
else
significance = [significance, 'p'];
end
else
significance = [significance, 'n'];
end
else
significance = [significance, 'z'];
end
else
significance = [significance, 't'];
end
if(complete),
complete = 0;
% get size of refinement data (next 20 bits)
stringlength = bin2dec(img_ezw_stream_bit(1,index:index+19));
index = index + 20;
refine = [refine img_ezw_stream_bit(1,index:index+stringlength-1)];
index = index + stringlength;
img_wavedata_dec = zeros(dim,dim);
img_wavedata_dec = func_decode_refine(img_wavedata_dec,
refinement(step,:), threshold, scan);
threshold = threshold/2;
end
function scan = func_morton(pos,n);
backup = img_wavedata_dec;
n = size(img_wavedata_dec,1);
index = 1;
% x y is the position in the matrix of the node where the EZW tree
% should start; top left is x=1 y=1
%
% dim is the dimension of the mask (should be the same dimension as
% the wavelet data)
%
% mask is the returnend matrix to select the relevant coefficients
% from the wavelet coefficient matrix
% selected = mask .* wavelet_matrix;
% Copyright 2002 Paschalis Tsiaflakis, Jan Vangorp
% Revision 1.0 10/11/2002 19.00u
mask = zeros(dim);
x_min = x;
x_max = x;
y_min = y;
y_max = y;
n = size(img_wavedata_dec,1);
index = 1;
L = length(S);
m = I_W;
C1 = zeros(1,S(1,3)+3*sum(S(2:L-1,3)));
% approx part
C1(1:S(1,3)) = reshape( m( 1:S(1,1) , 1:S(1,2) ), 1 , S(1,3) );
for k = 2:L-1
rows = [sum(S(1:k-1,1))+1:sum(S(1:k,1))];
columns = [sum(S(1:k-1,2))+1:sum(S(1:k,2))];
% horizontal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3);
C1(c_start:c_stop) = reshape( m( 1:S(k,1) , columns ) , 1, c_stop-
c_start+1);
% vertical part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3);
C1(c_start:c_stop) = reshape( m( rows , 1:S(k,2) ) , 1 , c_stop-
c_start+1 );
% diagonal part
c_start = S(1,3) + 3*sum(S(2:k-1,3)) + 2*S(k,3) + 1;
c_stop = S(1,3) + 3*sum(S(2:k,3));
C1(c_start:c_stop) = reshape( m( rows , columns ) , 1 , c_stop-
c_start+1);
end
S(:,3) = [];