整数小波 S 变换对图像进行分解和重构
题目:用整数小波的 S 变换对 256*256 Lena 灰度图像进行非标准方法的 3 级分解与重构。
本案例的意义在于通过实验体会到整数小波变换。案例并不是直接利用 MATLAB 工具箱中
的已有小波函数对图象进行整数小波分解,而是用下面的分解公式进行小波分解和重构。
分解公式:
1, ,2 1 ,2
1, ,2 1,
[ ]
j k j k j k
j k j k j k
d s s
s s d
- +
- -
= -
= +
重构公式:
,2 1, 1,
,2 1 1, ,2
[ ]
j k j k j k
j k j k j k
s s d
s d s
- -
+ -
= -
= +
,其中[ ]表示取整。
进行非标准小波分解,交替进行 3 次行变换和 3 次列变换。
程序对每次变换后的结果都保存为位图文件,运行后可以在程序所在路径下看到保存的 6 个
分解位图文件和 6 个重构位图文件。最后在一个图像中显示每次分解后的图像,便于对比。
实现方法:编写 S 变换的分解和重构子程序,分别对图像数据进行一次行列分解和列行重
构,程序返回该次变换后的行列矩阵,在主程序中可以连续三次调用行列变换,即完成对原
始图像的 3 级分解和重构,这里的变换是完全可逆的,也就是能够完全恢复原图像数据。通
过对比 3 次重构后返回的数据与原图像数据后发现它们完全相同。
主要用的 MATLAB 工具函数有:
imread( )---------读取图像数据,为 uint8 类型,需变为 double 类型才能进行各种运算
imwrite()---------用于保存图像,这里用它来保存每一级变换后的图像
image( )----------显示图像,需要给出色谱表 colormap,这里是灰度图,用 colormap =gray
(256)即可
subplot( )--------用于在一个窗口下绘制多个图像,在这里用于输出变换后的图像,以便对比。
更详细的内容请参考函数文件 SDecompose.m 和 SRecompose.m,分别是分解和重构图像的
函数,main.m 是演示主程序。
注意事项:在首次成功后发现原图像数据和重构数据总有误差,但是根据 S 整数变换的可
逆性,应该可以完全重构原始数据,在排除了是程序变换运算错误后,发现读出图像数据
类型是 uint8 后,估计是该类型运算出错,上网搜索后终于找到症结所在:由于 MATLAB
读出的图像数据保存的是 uint8 类型(单字节 0~255),它不能直接参与运算,在变为 double
类型后才可以进行运算。改造程序后,发现果然如此,此时原始数据和重构数据完全相同。
运行结果: