www.pudn.com > SPIHT_bandelet.rar > func_SPIHT_Main.m


%function func_SPIHT_bandelet_Main 
% Matlab implementation of SPIHT (without Arithmatic coding stage) 
% 
% Main function  
% 
% input:    Orig_I : the original image. 
%           rate : bits per pixel 
% output:   img_spiht  
% 
% Jing Tian 
% Contact me : scuteejtian@hotmail.com 
% This program is part of my undergraduate project in GuangZhou, P. R. China. 
% April - July 1999 
clear all; 
clc; 
warning off; 
%-----------   Input   ---------------- 
Orig_I = func_ReadRaw('lena512.raw', 512*512 , 512 , 512); 
%Orig_I =rgb2gray(imread('lena256.bmp')); 
%Orig_I=mat2gray(Orig_I1); 
figure;imshow(Orig_I,[]); 
 
M=Orig_I; 
rate =0.5; 
 
%-----------   Pre-processing   ---------------- 
 
OrigSize = size(Orig_I, 1); 
max_bits = floor(rate * OrigSize^2); 
 
OutSize = OrigSize; 
image_spiht = zeros(size(Orig_I)); 
% "image " is the input of codec 
[nRow, nColumn] = size(Orig_I); 
 
 
%-----------  bandelet Decomposition   ---------------- 
options.use_single_qt = 1;  
options.wavelet_vm=[4,4]; 
%set to: 
%   1 if you want the 3 wavelets bands H/V/D to share the same quadtree 
%   0 for 3 different quadtree (more adaptivity but more bits for 
%   geometry).% set to: 
[m,n] = size(Orig_I); 
s=Inf; 
Jmin =4; 
Jmax = log2(n)-1; 
j_min = 3; 
j_max = 4; 
level=Jmax-Jmin+1; 
T =0.9; 
%rates=[ 0.2, 0.25, 0.4, 0.5, 1 ]; 
 
block_size=2; 
 
%for  i=1:5 
%   rate=rates(i); 
    disp('computing quadtree'); 
    [QT,Theta] = compute_wavelet_quadtree_xhl(M,Jmin,T,j_min,j_max,s, options,'biorthogonal'); 
    [MB,Rbandg] = perform_wavelet_bandelet_transform_xhl(M,Jmin,QT,Theta,1, options,'biorthogonal'); 
 
    %-----------   Coding   ---------------- 
    img_enc = func_SPIHT_Enc(MB, max_bits, nRow*nColumn, level);   
    [p,q]=size(QT); 
    temp_QT1=zeros(1,p*q/8); 
    QT1=reshape(QT,p*q/8,8); 
    for i=1:p*q/8 
        for j=1:8 
          if QT1(i,j)==3 
              temp_QT1(1,i)=bitset(temp_QT1(1,i),j,0); 
          else 
              temp_QT1(1,i)=bitset(temp_QT1(1,i),j,1); 
          end 
        end 
    end 
            
%     temp_QT= rle(QT); 
%     %temp_Theta=btc_encode(Theta,2); 
%     [tmp1,Mu,Mi]=btc_encode(Theta,block_size); 
    %-----------   Decoding   ---------------- 
    img_dec = func_SPIHT_Dec(img_enc); 
    QT2=zeros(p*q/8,8); 
    
     for i=1:p*q/8 
        for j=1:8 
          if bitget(temp_QT1,j)==0 
           QT2(i,j)=3; 
          else 
           QT2(i,j)=4; 
          end   
        end 
    end 
   QT3=reshape(QT2,p,q); 
        
%   QT1= rle(temp_QT); 
    %Theta1=btc_image_decode(temp_Theta,2,m,n); 
%   Theta1=btc_decode(tmp1,Mu,Mi,block_size); 
    %-----------  bandelet Reconstruction   ---------------- 
    MB1=img_dec; 
    disp('Computing inverse bandelet transform.'); 
    [Mb,Rbandg] = perform_wavelet_bandelet_transform_xhl(MB1,Jmin,QT,Theta,-1, options,'biorthogonal'); 
    img_spiht=Mb; 
    %-----------   PSNR analysis   ---------------- 
    Q = 255; 
    OrigSize = nRow*nColumn; 
    MSE = sum(sum((img_spiht - Orig_I) .^ 2)) / OrigSize; 
    psnr = 10*log10(Q*Q/MSE); 
    % --------------compute the rate of the image compression ---------- 
     
    %total_bit=max_bits+size 
    %----------------------------------------------------- 
    figure; 
    imshow(img_spiht,[]); 
    title(['imge spiht psnr=',num2str(psnr),' rate=',num2str(rate),' T=',num2str(T)]); 
%end