基于SPIHT小波变换的图像解压缩matlab仿真,输出PSNR值评价图像解压后质量
Posted fpga和matlab
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于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
三、测试结果
以上是关于基于SPIHT小波变换的图像解压缩matlab仿真,输出PSNR值评价图像解压后质量的主要内容,如果未能解决你的问题,请参考以下文章
Matlab/CV系列基于SIFT/SURF配准和小波变换图像融合Matlab仿真