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

up目录

一、理论基础

二、核心程序

三、测试结果


一、理论基础

       SPIHT算法基于分层树的集合划分算法(SetPartitioninginHierarchicalTrees,SPIHT)改进了内嵌零树编码算法(EZW)。在对图像进行小波变换后,它更有效地利用了不同尺度子带重要系数间的相似性。它呈现出良好的特性:不依赖傅立叶变换而在空间域中构造小波;较高的PSNR(PeakSignalNoiseRatio,峰值信噪比)保证了良好的重现图像质量。

       SPIHT编码作为一种优越的嵌入式小波编码,在各种图像压缩中应用广泛。它能够支持图像渐进传输、压缩效率高,比特流按照重要性排序并且能够随时结束编码,允许达到一个目标比特率或失真。该算法充分挖掘了小波图像不同子带之间的相似性,是公认的一种高效图像压缩编码,因此研究SPIHT编码并更好地利用它是非常必要的。提出了只加密SPIHT压缩编码前两层数据的灰度图像部分加密方法;基于SPIHT提出了一种彩色图像的部分加密算法,基于SPIHT提出了一种灰度图像部分加密算法。与编码过程相结合的加密方案能够在编码的同时完成加密,提高了效率,并且能够满足格式兼容性,适应网络实时传输。该算法的实质类似于将码流中的某些关键数据用随机比特替换,容易受到已知明文攻击和选择明文攻击。因此在设计此类加密算法时要考虑如何提高这方面的安全性。

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

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

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

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

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

  SPIHT算法对图像信息采用如下的编码步骤。

  首先,定义三个队列:不显著性系数队列LIP,显著性系数队列LSP和不显著性集合队列LIS。

  设,O(i,j)表示节点(i,j)的直接节点的集合;D(i,j)表示节点(i,j)的子节点集合;L(i,j)表示子节点中排除直接节点后的集合。

  在队列中,每个元素由一个坐标唯一识别,它在LIP和LSP中代表孤立系数(无子节点的根节点),在LIS中代表第一类元素的D(i,j)或者第二类元素的L(i,j)。

  对某个阈值T进行显著性测试。将大于T的元素移入LSP,并在LIP队列中移除该元素。对LIS也进行同样的测试,将显著的元素移入LSP,其他的再进行树的分裂。

       SPIHT算法是一种嵌入式编码,将待编码的比特流按重要性的不同进行排序根据目标码率或失真度大小要求随时结束编码。它具有良好的渐进传输特性,利用集合划分以及有序的位平面传输,优先传输重要系数,优先传输重要系数的重要比特位,其主要步骤如下:

1)初始化:对图像进行小波分解,用固定比特位数表示变换后的系数Ci,j,输出n=|log2 (max(i,j)){|ci,i|}到信道;

2)排序过程:输出满足条件2n≤|ci,j|<2n+1的系数Ci,j的个数Z,以及对应系数的Z对坐标和Z个符号位;

3)细化过程:对于所有满足|ci,j|≥2n+1系数,输出第n位的值;

4)迭代:如需迭代,则n-1转到2)。

二、核心程序

%-----------   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 = 10*log10(Q*Q/MSE)
up00049

三、测试结果

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
SPIHT(Set Partitioning in Hierarchical Trees)算法是一种图像压缩算法,具有逐步逼近、渐进传输、可逆性和压缩比高等特点。 SPIHT算法的完整过程如下: 1. 将原始图像分解为多个子图像。通常使用小波变换(如Haar变换)将图像分解为多个子图像,每个子图像表示不同频率的细节信息。 2. 对每个子图像进行分割。将子图像划分为四个相等大小的子块,每个子块代表不同的频率。 3. 对每个子图像进行排序。根据子块中像素的大小,将像素排序为正(+)、负(-)和未决(?)三个类别。 4. 采用零树编码。对排序后的像素进行分组,并根据分组情况进行编码。首先,对所有非零像素进行编码,然后对所有零像素进行编码,将非零像素和零像素的编码组合在一起。 5. 利用零树编码进行灵活编码。SPIHT算法通过使用零树编码技术来提高压缩性能。它利用具有相同符号和相同绝对的相邻像素之间的零树结构,来减少编码信息的存储空间。 6. 对编码后的数据进行位平面编码。对于每个子图像,将其位平面分成多个层次,并按照从高到低的顺序依次进行编码。在每个位平面层次上,从高到低位依次对每个像素进行编码。 7. 对编码后的数据进行解码。将编码后的数据进行解码,按照相反的顺序重建每个子图像。 8. 进行反变换。使用逆小波变换将解码后的数据重建为压缩后的图像SPIHT算法通过按照像素的重要性进行排序,并利用零树编码和位平面编码技术,从而实现对图像数据的高效压缩。这种分层次、渐进传输和可逆的压缩方式使得SPIHT算法在图像传输和存储等领域广泛应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fpga和matlab

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值