(完整版)整数小波变换作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
小波变换:S 整数变换作业
1. 题目:用整数小波的S 或2/6变换对256*256 Lena 灰度图像进行非标准方法的3级分解与重构。
2. 总体设计:本题目的意义在于通过实验体会整数小波变换,由于MA TLAB 自身对矩阵操作的方便性,以及其丰富的库函数(如可以用来直接显示图象),我决定用MATLAB 编程完成本次作业。要说明的是,这里并不是直接利用MATLAB 中的wavelet 工具箱中的已有小波函数对图象进行整数小波分解,而是用下面的已知分解公式进行小波分解和重构。分解公式:1,,21,21,,21,[]
j k j k j k
j k j k j k d s s s s d -+--=-=+ 重构公式:,21,1,,211,,2[]
j k j k j k j k j k j k s s d s d s --+-=-=+ ,其中[ ]表示取整。
进行非标准小波分解,即交替进行3次行变换和3次列变换,程序对每次变换后的结果都保存为位图文件,运行后可以在程序所在路径下看到保存的6个分解位图文件和6个重构位图文件。最后还会在一个图像中显示每次分解后的图像,以便于对比。
3. 实现方法:编写S 变换的分解和重构子程序,分别对图像数据进行一次行列分解和列行重构,程序返回该次变换后的行列矩阵,在主程序中可以连续三次调用行列变换,即完成对原始图像的3级分解和重构,这里的变换是完全可逆的,也就是能够完全恢复原图像数据。通过对比3次重构后返回的数据与原图像数据后发现它们完全相同。主要用的MA TLAB 工具函数有:
imread( )---------读取图像数据,为uint8类型,需变为double 类型才能进行各种运算 imwrite()---------用于保存图像,这里用它来保存每一级变换后的图像
image( )----------显示图像,需要给出色谱表colormap ,这里是灰度图,用colormap =gray (256)即可
subplot( )--------用于分开绘图,即在一个窗口下绘制多个图像,在这里用于输出变换后的图像,以便对比。
更详细的内容请参考函数文件SDecompose.m 和SRecompose.m ,分别是分解和重构图像的函数,main.m 是演示主程序。
命令行下输入main 运行后,按照提示输入要处理的图像文件名称即可(要求是256×256的灰度图像,否则结果可能会出错。程序所在目录下的lena.bmp 和girl.bmp 就是256×256的灰度图像)可以直接按键盘‘d ’键,程序会默认使用lena.bmp 进行演示。 3级分解完成后,输出后面的3级分解效果图。命令窗中会给出提示,按下任意键将继续进行图像3级重构,完成后会输出后面的3级重构图。
进行分解和重构同时已经将分解和重构得到的图像存盘,在当前工作目录下即可看到保存的12个位图文件,其中分解和重构图像各有6个。若要查看清晰的变换图像,可以 打开它们查看。
4. 经验教训:本次作业用MATLAB 而不是VC 实现,虽然看上去简单许多,但是对于我
这种刚刚接触MATLAB的人来说,仍然是耗了不少时间,需要不断地查找帮助文件来查看函数的用法,开始时错误百出,就像初次使用C++编程一样。在首次成功后发现原图像数据和重构数据总有误差,但是根据S整数变换的可逆性,应该可以完全重构原始数据,在排除了是程序变换运算错误后,发现读出图像数据类型是uint8后,估计是该类型运算出错,上网搜索后终于找到症结所在:由于MATLAB读出的图像数据保存的是uint8类型(单字节0~255),它不能直接参与运算,在变为double类型后才可以进行运算。改造程序后,发现果然如此,此时原始数据和重构数据完全相同。
本次作业是一次挑战和尝试,通过它,学会的不仅仅是一些MATLAB函数和整数小波变换的方法,更重要的是它使我敢于挑战自己以前未接触过的东西,查找资料,编程和调试,最终解决问题。生活和学习中正是有了这种不怕困难,敢于尝试,不折不挠的精神才能使我们不断进步。
5.运行结果截图:
3级分解效果图
3级重构效果图
(左)原始图像(256×256 灰度图)(右)重构图像(256×256 灰度图)
以上两幅经过S整数分解和重构后的图像,可以发现二者几乎没有差别,事实上它们完全一样(因为S整数变换是可逆的)。