0% found this document useful (0 votes)
205 views21 pages

Spiht

The document is the code for an implementation of SPIHT (Set Partitioning In Hierarchical Trees), an image compression algorithm, in MATLAB. It includes functions for encoding and decoding images using SPIHT. The main func_SPIHT_Main function calls various subfunctions to load an image, perform wavelet decomposition, SPIHT encoding, decoding, reconstruction and calculate PSNR to analyze compression performance.

Uploaded by

Muhammad Azhar
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
205 views21 pages

Spiht

The document is the code for an implementation of SPIHT (Set Partitioning In Hierarchical Trees), an image compression algorithm, in MATLAB. It includes functions for encoding and decoding images using SPIHT. The main func_SPIHT_Main function calls various subfunctions to load an image, perform wavelet decomposition, SPIHT encoding, decoding, reconstruction and calculate PSNR to analyze compression performance.

Uploaded by

Muhammad Azhar
Copyright
© Attribution Non-Commercial (BY-NC)
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as DOCX, PDF, TXT or read online on Scribd
You are on page 1/ 21

function func_SPIHT_Main % Matlab implementation of SPIHT (without Arithmatic coding stage) % % Main function % % input: % % output: % % By Jing Tian,

[email protected] Orig_I : the original image. rate : bits per pixel img_spiht

fprintf('-----------

Welcome to SPIHT Matlab Demo!

----------------\n');

fprintf('-----------

Load Image

----------------\n');

infilename = 'lena512.bmp'; outfilename = 'lena512_reconstruct.bmp';

Orig_I = double(imread(infilename));

rate = 1;

OrigSize = size(Orig_I, 1); max_bits = floor(rate * OrigSize^2);

OutSize = OrigSize; image_spiht = zeros(size(Orig_I)); [nRow, nColumn] = size(Orig_I);

fprintf('done!\n'); fprintf('----------n = size(Orig_I,1); n_log = log2(n); level = n_log; % wavelet decomposition level can be defined by users manually. Wavelet Decomposition ----------------\n');

type = 'bior4.4'; [Lo_D,Hi_D,Lo_R,Hi_R] = wfilters(type);

[I_W, S] = func_DWT(Orig_I, level, Lo_D, Hi_D);

fprintf('done!\n');

fprintf('-----------

Encoding

----------------\n');

img_enc = func_SPIHT_Enc(I_W, max_bits, nRow*nColumn, level);

fprintf('done!\n'); fprintf('----------Decoding ----------------\n');

img_dec = func_SPIHT_Dec(img_enc);

fprintf('done!\n'); fprintf('----------Wavelet Reconstruction ----------------\n');

img_spiht = func_InvDWT(img_dec, S, Lo_R, Hi_R, level);

fprintf('done!\n'); fprintf('----------PSNR analysis ----------------\n');

imwrite(img_spiht, gray(256), outfilename, 'bmp');

Q = 255; MSE = sum(sum((img_spiht-Orig_I).^2))/nRow / nColumn; fprintf('The psnr performance is %.2f dB\n', 10*log10(Q*Q/MSE));

... function m = func_SPIHT_Dec(in) % Matlab implementation of SPIHT (without Arithmatic coding stage) % % Decoder % % input: % % output: m : reconstructed image in wavelet domain in : bit stream

% % By Jing Tian, [email protected]

%-----------

Initialization

-----------------

% image size, number of bit plane, wavelet decomposition level should be % written as bit stream header. m = zeros(in(1,1)); n_max = in(1,2); level = in(1,3); ctr = 4;

%----------temp = [];

Initialize LIP, LSP, LIS

----------------

bandsize = 2.^(log2(in(1,1)) - level + 1); temp1 = 1 : bandsize; for i = 1 : bandsize temp = [temp; temp1]; end LIP(:, 1) = temp(:); temp = temp'; LIP(:, 2) = temp(:);

LIS(:, 1) = LIP(:, 1);

LIS(:, 2) = LIP(:, 2); LIS(:, 3) = zeros(length(LIP(:, 1)), 1); pstart = 1; pend = bandsize / 2; for i = 1 : bandsize / 2 LIS(pstart : pend, :) = []; pdel = pend - pstart + 1; pstart = pstart + bandsize - pdel; pend = pend + bandsize - pdel; end LSP = [];

%----------n = n_max;

coding

----------------

while (ctr <= size(in,2))

%Sorting Pass LIPtemp = LIP; temp = 0; for i = 1:size(LIPtemp,1) temp = temp+1; if ctr > size(in,2) return end

if in(1,ctr) == 1 ctr = ctr + 1; if in(1,ctr) > 0 m(LIPtemp(i,1),LIPtemp(i,2)) = 2^n + 2^(n-1); else m(LIPtemp(i,1),LIPtemp(i,2)) = -2^n end LSP = [LSP; LIPtemp(i,:)]; LIP(temp,:) = []; temp = temp - 1; end ctr = ctr + 1; end - 2^(n-1);

LIStemp = LIS; temp = 0; i = 1; while ( i <= size(LIStemp,1)) temp = temp + 1; if ctr > size(in,2) return end if LIStemp(i,3) == 0 if in(1,ctr) == 1 ctr = ctr + 1; x = LIStemp(i,1); y = LIStemp(i,2);

if ctr > size(in,2) return end if in(1,ctr) == 1 LSP = [LSP; 2*x-1 2*y-1]; ctr = ctr + 1; if in(1,ctr) == 1 m(2*x-1,2*y-1) = 2^n + 2^(n-1); else m(2*x-1,2*y-1) = -2^n end ctr = ctr + 1; else LIP = [LIP; 2*x-1 2*y-1]; ctr = ctr + 1; end - 2^(n-1);

if ctr > size(in,2) return end if in(1,ctr) == 1 ctr = ctr + 1;

LSP = [LSP; 2*x-1 2*y]; if in(1,ctr) == 1; m(2*x-1,2*y) = 2^n + 2^(n-1); else m(2*x-1,2*y) = -2^n end ctr = ctr + 1; else LIP = [LIP; 2*x-1 2*y]; ctr = ctr + 1; end - 2^(n-1);

if ctr > size(in,2) return end if in(1,ctr) == 1 ctr = ctr + 1; LSP = [LSP; 2*x 2*y-1]; if in(1,ctr) == 1 m(2*x,2*y-1) = 2^n + 2^(n-1); else m(2*x,2*y-1) = -2^n end - 2^(n-1);

ctr = ctr + 1; else LIP = [LIP; 2*x 2*y-1]; ctr = ctr + 1; end

if ctr > size(in,2) return end if in(1,ctr) == 1 ctr = ctr + 1; LSP = [LSP; 2*x 2*y]; if in(1,ctr) == 1 m(2*x,2*y) = 2^n + 2^(n-1); else m(2*x,2*y) = -2^n end ctr = ctr + 1; else LIP = [LIP; 2*x 2*y]; ctr = ctr + 1; end - 2^(n-1);

if ((2*(2*x)-1) < size(m) & (2*(2*y)-1) < size(m)) LIS = [LIS; LIStemp(i,1) LIStemp(i,2) 1]; LIStemp = [LIStemp; LIStemp(i,1) LIStemp(i,2) 1]; end LIS(temp,:) = []; temp = temp-1;

else ctr = ctr + 1; end else if in(1,ctr) == 1 x = LIStemp(i,1); y = LIStemp(i,2); LIS = [LIS; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; LIStemp = [LIStemp; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; LIS(temp,:) = []; temp = temp - 1; end ctr = ctr + 1; end i = i+1; end

% Refinement Pass

temp = 1; value = m(LSP(temp,1), LSP(temp,2)); while (abs(value) >= 2^(n+1) & (temp <= size(LSP,1))) if ctr > size(in,2) return end

value = value + ((-1)^(in(1,ctr) + 1)) * (2^(n1))*sign(m(LSP(temp,1),LSP(temp,2))); m(LSP(temp,1),LSP(temp,2)) = value; ctr = ctr + 1; temp = temp + 1; if temp <= size(LSP,1) value = m(LSP(temp,1),LSP(temp,2)); end end

n = n-1; end ... function out = func_MySPIHT_Enc(m, max_bits, block_size, level) % Matlab implementation of SPIHT (without Arithmatic coding stage) % % Encoder

% % input: % % % % % output: % % By Jing Tian, [email protected] out : bit stream m : input image in wavelet domain max_bits : maximum bits can be used block_size : image size level : wavelet decomposition level

%----------bitctr = 0;

Initialization

-----------------

out = 2*ones(1,max_bits); n_max = floor(log2(abs(max(max(m)')))); Bits_Header = 0; Bits_LSP = 0; Bits_LIP = 0; Bits_LIS = 0;

%-----------

output bit stream header

----------------

% image size, number of bit plane, wavelet decomposition level should be % written as bit stream header.

out(1,[1 2 3]) = [size(m,1) n_max level]; bitctr = bitctr + 24; index = 4; Bits_Header = Bits_Header + 24;

%----------temp = [];

Initialize LIP, LSP, LIS

----------------

bandsize = 2.^(log2(size(m, 1)) - level + 1); temp1 = 1 : bandsize; for i = 1 : bandsize temp = [temp; temp1]; end LIP(:, 1) = temp(:); temp = temp'; LIP(:, 2) = temp(:); LIS(:, 1) = LIP(:, 1); LIS(:, 2) = LIP(:, 2); LIS(:, 3) = zeros(length(LIP(:, 1)), 1); pstart = 1; pend = bandsize / 2; for i = 1 : bandsize / 2 LIS(pstart : pend, :) = []; pdel = pend - pstart + 1; pstart = pstart + bandsize - pdel;

pend = pend + bandsize - pdel; end LSP = [];

n = n_max;

%-----------

coding

----------------

while(bitctr < max_bits)

% Sorting Pass LIPtemp = LIP; temp = 0; for i = 1:size(LIPtemp,1) temp = temp+1; if (bitctr + 1) >= max_bits if (bitctr < max_bits) out(length(out))=[]; end return end if abs(m(LIPtemp(i,1),LIPtemp(i,2))) >= 2^n % 1: positive; 0: negative out(index) = 1; bitctr = bitctr + 1; index = index +1; Bits_LIP = Bits_LIP + 1;

sgn = m(LIPtemp(i,1),LIPtemp(i,2))>=0; out(index) = sgn; bitctr = bitctr + 1; index = index +1; Bits_LIP = Bits_LIP + 1; LSP = [LSP; LIPtemp(i,:)]; LIP(temp,:) = []; temp = temp - 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIP = Bits_LIP + 1; end end

LIStemp = LIS; temp = 0; i = 1; while ( i <= size(LIStemp,1)) temp = temp + 1; if LIStemp(i,3) == 0 if bitctr >= max_bits return end max_d = func_MyDescendant(LIStemp(i,1),LIStemp(i,2),LIStemp(i,3),m); if max_d >= 2^n out(index) = 1; bitctr = bitctr + 1;

index = index +1; Bits_LIS = Bits_LIS + 1; x = LIStemp(i,1); y = LIStemp(i,2);

if (bitctr + 1) >= max_bits if (bitctr < max_bits) out(length(out))=[]; end return end if abs(m(2*x-1,2*y-1)) >= 2^n LSP = [LSP; 2*x-1 2*y-1]; out(index) = 1; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; sgn = m(2*x-1,2*y-1)>=0; out(index) = sgn; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; LIP = [LIP; 2*x-1 2*y-1]; end

if (bitctr + 1) >= max_bits

if (bitctr < max_bits) out(length(out))=[]; end return end if abs(m(2*x-1,2*y)) >= 2^n LSP = [LSP; 2*x-1 2*y]; out(index) = 1; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; sgn = m(2*x-1,2*y)>=0; out(index) = sgn; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; LIP = [LIP; 2*x-1 2*y]; end

if (bitctr + 1) >= max_bits if (bitctr < max_bits) out(length(out))=[]; end return

end if abs(m(2*x,2*y-1)) >= 2^n LSP = [LSP; 2*x 2*y-1]; out(index) = 1; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; sgn = m(2*x,2*y-1)>=0; out(index) = sgn; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; LIP = [LIP; 2*x 2*y-1]; end

if (bitctr + 1) >= max_bits if (bitctr < max_bits) out(length(out))=[]; end return end if abs(m(2*x,2*y)) >= 2^n LSP = [LSP; 2*x 2*y]; out(index) = 1; bitctr = bitctr + 1;

index = index +1; Bits_LIS = Bits_LIS + 1; sgn = m(2*x,2*y)>=0; out(index) = sgn; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; LIP = [LIP; 2*x 2*y]; end

if ((2*(2*x)-1) < size(m) & (2*(2*y)-1) < size(m)) LIS = [LIS; LIStemp(i,1) LIStemp(i,2) 1]; LIStemp = [LIStemp; LIStemp(i,1) LIStemp(i,2) 1]; end LIS(temp,:) = []; temp = temp-1;

else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; end else if bitctr >= max_bits return

end max_d = func_MyDescendant(LIStemp(i,1),LIStemp(i,2),LIStemp(i,3),m); if max_d >= 2^n out(index) = 1; bitctr = bitctr + 1; index = index +1; x = LIStemp(i,1); y = LIStemp(i,2); LIS = [LIS; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; LIStemp = [LIStemp; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; LIS(temp,:) = []; temp = temp - 1; else out(index) = 0; bitctr = bitctr + 1; index = index +1; Bits_LIS = Bits_LIS + 1; end end i = i+1; end

% Refinement Pass temp = 1; value = floor(abs(2^(n_max-n+1)*m(LSP(temp,1),LSP(temp,2)))); while (value >= 2^(n_max+2) & (temp <= size(LSP,1)))

if bitctr >= max_bits return end s = bitget(value,n_max+2); out(index) = s; bitctr = bitctr + 1; index = index +1; Bits_LSP = Bits_LSP + 1; temp = temp + 1; if temp <= size(LSP,1) value = floor(abs(2^(n_max-n+1)*m(LSP(temp,1),LSP(temp,2)))); end end

n = n - 1; end

You might also like