基于SPIHT小波变换的图像压缩解压缩matlab仿真,并输出解压后的图像PSNR值

196 阅读2分钟

1.算法描述

       图像在经过小波变换和量化后,还未实现真正意义上的数据量的压缩。因此,需要通过 SPHIT 编码算法对小波系数进行编码压缩。对图像的编码方式有很多,这些编码包括:游程编码、huffman编码以及算数编码等等。

 

        对系数矩阵进行了二维提升小波变换后,小波系数有了空间上的特殊结构,这种特殊的结构称为零树结构。SPIHT 算法编码(set partitioning in hierarchical trees)即多级树集合分裂编码。

 

       SPIHT 算法的主要思想是利用给定的阈值与小波系数集合中的每个系数进行比较,如果值大于阈值,则输出一个二进制的数字作为该系数重要性的标志;这个二进制的标志位就是对图像系数进行编码后所生成的码流。当把所有的小波变换的系数值遍历完以后将阈值减半,再进行扫描小波系数集合,与更新的阈值对比,然后输出相应的图像压缩码流,直到阈值变为 1。

 

       该算法基于嵌入式零树小波变换编码思想,以 EZW 算法的零树结构为基础,将某树节点及其所有后继节点规划为同一集合,创建 LSP、LIP 和 LIS 三个表项,并采用适当的集合分割排序策略,通过初始化、排序过程、细化过程和量化步长更新这四个子过程完成嵌入式编码。

 

      SPIHT 编码是一种渐进的对于不重要的系数集合不断的进行分裂,同时空间方向树也在不断变化的过程,这种过程可以使误差逐渐减小。

 

1.png

2.png

 

2.仿真效果预览

matlab2022a仿真结果如下:

  3.png

4.png

5.png  

3.MATLAB核心程序 `clc;

clear;

close all;

warning off;

addpath(genpath(pwd));

 

% Matlab implementation of SPIHT (without Arithmatic coding stage)

%

 

 

%-----------   Input   ----------------

Orig_I = func_ReadRaw('lena512.raw', 512*512, 512, 512);

rate = 0.6;

 

%-----------   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);

 

 

%-----------   Wavelet Decomposition   ----------------

n = size(Orig_I,1);

n_log = log2(n);

level = n_log;

% wavelet decomposition level can be defined by users manually.

 

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);

 

%-----------   Coding   ----------------

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

 

%-----------   Decoding   ----------------

img_dec = func_SPIHT_Dec(img_enc);

 

%-----------   Wavelet Reconstruction   ----------------

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

 

 

figure;

imshow(Orig_I,[]);

 

figure;

imshow(img_spiht,[]);

% %-----------   PSNR analysis   ----------------

Q = 255;

MSE = sum(sum((img_spiht - Orig_I) .^ 2) / nRow / nColumn);

psnr = 10log10(QQ/MSE)

 A117`