11 S整数小波分解图像(matlab程序)

news2024/9/23 21:32:04

1.简述

学习目标:  非标准小波分解(用S整数变换)

      小波分解过程:读取加入噪声后的图片后,数据即是高度*宽度个数据点。对此矩阵数据要做二维离散小波分解,二维小波变换和一维小波变换的区别从原理上来说就是一和二的关系。首先对数据做行分解,写入循环,有多少行就做多少次小波分解。对于每一行的数据来说,做小波分解就是一维的,而一维小波分解就是咱们要写的程序中的基石。选择小波,以Haar小波为例,也叫db1,用函数调用此小波,将咱们的数据(就是之前的行数据)先与高通做卷积得出高频系数,这里建议卷积过程别手写,计算太慢了,计算函数直接调用即可。然后使用下采样得出高频系数cD,再与低通做卷积加下采样得出低频系数cA。这里说明一下由于是下采样,所以得到的每个系数矩阵是原矩阵的一半大小。最后将低频系数cA和高频系数cD组成系数矩阵。这是一次小波分解,如果需要二次小波分解,则是按照小波分解定义,将第一次小波分解的低频系数cA作为第二次分解的输入重复卷积和采样操作,再得出新的cA、cD,编程写循环即可。回到咱们每一行都做一维小波分解,将做完行分解后得到的新矩阵再对每一列进行列分解,按照同样的道理将系数组合起来得到最终的矩阵(这里注意一下行分解的矩阵和列分解的矩阵在组合系数时的行列转换问题)。最终的矩阵分为四块,左上角是低频系数cA,其余三块分别是高频系数cH、cV、cD,具体形式是[cA,cH;cV,cD]。别忘了一维小波分解咱们能做好几次,二维也是,用同样的道理,低频系数cA进入下一层,还是先做行分解再做列分解然后出结果,也是写循环解决。到此小波分解结束。

整数小波S变换对图像进行分解和重构

题目用整数小波的S变换对256*256 Lena灰度图像进行非标准方法的3级分解与重构。

 

本案例的意义在于通过实验体会到整数小波变换。案例并不是直接利用MATLAB工具箱中的已有小波函数对图象进行整数小波分解,而是用下面的分解公式进行小波分解和重构。

 

进行非标准小波分解,交替进行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类型后才可以进行运算。改造程序后,发现果然如此,此时原始数据和重构数据完全相同。

2.代码

主程序:
filename = input('Input the image file name: (size: 256×256 gray image)\nor press d key for default image:lena.bmp > ', 's');
if filename == 'd'
    filename = 'lena.bmp';
end
im = imread(filename);
de = SDecompose(im, 256);
input('Press any key to recompose the image ...'); 
re = SRecompose(de, 256);

 

子程序:

function imde = SDecompose( imMat, dim )
%%  非标准小波变换,用S整数变换3级分解图像数据,
% 输入参数imMat为原始256×256灰度图像数据方阵,
% imde为3级分解后的图像矩阵,分解灰度图
% S变换方法:分解式 Dj-1, k = Sj, 2k +1 - Sj, 2k;Sj-1, k =     Sj, 2k + [Dj-1, k / 2] 
% 重构式 Sj, 2k = Sj-1, k - [Dj-1, k / 2] Sj, 2k +1 = Dj-1, k + Sj, 2k
% 其中 S为对应图象数据
% dim = 256;
imMat = double(imMat);
map = gray(256);
subplot(4, 4, 1); image(imMat);colormap(map); title('原 图 像'); axis square; axis off;
% 对每一行和列交替进行第一次S分解变换
[imder, imdec] = decompose(imMat, dim);
% imder
% imdec
imgray = mat2gray(imder);          % 转为灰度矩阵
imwrite(imgray, 'imgraylr.bmp');   % 保存1次列变换后的灰度图
subplot(4, 4, 2); image(imder);colormap(map); title('1次行分解'); axis square; axis off;
imgray = mat2gray(imdec);
imwrite(imgray, 'imgray1c.bmp');
subplot(4, 4, 6); image(imdec);colormap(map); title('1次列分解'); axis square; axis off;

%%   对每一行和列交替进行第二次S分解变换
[imder, imdec] = decompose(imdec, dim/2);
imgray = mat2gray(imder);        % 转为灰度矩阵
imwrite(imgray, 'imgray2r.bmp'); % 保存2次行变换后的灰度图
subplot(4, 4, 7); image(imder);colormap(map); title('2次行分解'); axis square; axis off;
imgray = mat2gray(imdec);
imwrite(imgray, 'imgray2c.bmp');
%%     显示2次列变换后的灰度图
subplot(4, 4, 11); image(imdec);colormap(map); title('2次列分解'); axis square; axis off;

%%      对每一行和列交替进行第三次S分解变换
[imder, imdec] = decompose(imdec,dim/4);
imde = imdec;
imgray = mat2gray(imder);        % 转为灰度矩阵
imwrite(imgray, 'imgray3r.bmp'); % 保存3次行变换后的灰度图
subplot(4, 4, 12); image(imder);colormap(map); title('3次行分解'); axis square; axis off;

imgray = mat2gray(imdec);
imwrite(imgray, 'imgray3c.bmp');
subplot(4, 4, 16); image(imdec);colormap(map); title('3次列分解'); axis square; axis off;

%-----------------------------子程序decompose---------------------------------
function [imder, imdec] = decompose(imMat, dim)
%%   对每一行和列交替进行一次S分解变换, dim是维数
imder = imMat;
imdec = imMat;
for i = 1:dim                                                               % 对每一行进行S分解变换
    for j = 1:2:dim  
        imder(i, dim/2+(j+1)/2) = imMat(i, j+1) - imMat(i, j);              % 计算该行后半部分即Dj-1,k
        imder(i, (j+1)/2) = imMat(i, j) + floor(imder(i, dim/2+(j+1)/2)/2); % 计算该行前半部分即Sj-1,k
    end
end
%%  列变换
for i = 1:dim                                                             % 对每一列进行S分解变换
    for j = 1:2:dim
        imdec(dim/2+(j+1)/2, i) = imder(j+1, i) - imder(j, i); 
        imdec((j+1)/2, i) = imder(j, i) + floor(imdec(dim/2+(j+1)/2, i)/2);
    end
end

 

3.运行结果

a1a02d1792244323ba8cb06e4564b576.png

 

3级分解效果图

                                                                      

 

5cd4ad72997445c68970f868fca4aa19.png

 

3级重构效果图

 

                          

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/710733.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stable diffusion webui 下载和使用civitai中的模型

1.网址 C站网址为:https://civitai.com/。注:这里需要科学上网 2.下载模型 1.选择想要的模型,点击【Download】按钮,这里演示【Deliberate】模型的下载和使用 2.将下载的模型,存放到【/models/Stable-diffusion】目…

基于圆弧搜索和最小似然圆估计的圆查找算法

在这里提出一种算法,其实是将两篇papers的想法的结合。没有什么创新点,只是做一下算法原理的记录,防止后面重新看代码的时候一头雾水。 算法的目的在于查找特定半径范围的圆,而不致力于查找所有的圆,当然它也支持查找所…

04约瑟夫环

约瑟夫问题 设编号为1&#xff0c;2&#xff0c;3……n的n个人围坐成一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人出列&#xff0c;它的下一位又从1开始报数&#xff0c;数到m的那个人又出列&#xff0c;以此类推&#xff0c;直到所有人…

新手简单看懂Servlet里面的web.xml配置

背景&#xff1a; ecplisetomcatservlet 我们在学习servlet时候&#xff0c;因为前面基础没学好&#xff0c;导致servlet看不懂&#xff0c;比如笔者当时就是servlet的web.xml看不懂&#xff0c;如果我们能先看懂web.xml&#xff0c;知道前端访问哪个接口&#xff0c;调用哪个…

一个VBA的概率的模型(草稿)(未完成)

现在 可以让概率变化一般的抽奖&#xff0c;都是 概率稳定的&#xff0c;好处是稳定&#xff0c;没啥好处坏处是&#xff0c;不同的人次数差距很大&#xff0c;无法形成稳定的预期 概率0.1 变成概率0.1&#xff0c;如果失败就增加概率 这个增加概率可以是&#xff0c;已经失…

Flutter学习四:Flutter开发基础(五)资源管理

目录 0 引言 1 资源管理 1.1 指定 assets 1.2 Asset 变体&#xff08;variant&#xff09; 1.3 加载 assets 1.3.1 加载文本 1.3.2 加载图片 1.3.2.1 声明分辨率相关的图片 1.3.2.2 加载图片 1.3.3 依赖包中的资源图片 1.3.4 打包包中的 assets 1.3.5 特定平台 as…

B062-组件 路由 属性扩展 webpack Vue-cli

目录 一&#xff1a;组件1.何为组件2.组件的定义方式全局组件局部组件 3.组件的注意事项4.template的定义方式5.组件获取数据的方式 二&#xff1a;路由1.什么是路由&#xff1f;2.路由的使用步骤 三&#xff1a;Vue属性扩展1.计算属性 computed和监听属性 watch3.钩子函数 mou…

【Redis 三种模式----主从复制、哨兵以及集群】

目录 一、主从复制1.1、主从复制的概念1.2、主从复制的作用1.3、主从复制流程1.4、搭建Redis 主从复制1、环境准备2、安装Redis3、修改 Redis 配置文件&#xff08;Master节点操作&#xff09;4、修改 Redis 配置文件&#xff08;Slave节点操作&#xff09;5、验证主从效果 二、…

[牛客周赛复盘] 牛客周赛 Round 1 20230702

[牛客周赛复盘] 牛客周赛 Round 1 20230702 总结游游画U1. 题目描述2. 思路分析3. 代码实现 游游的数组染色1. 题目描述2. 思路分析3. 代码实现 游游的交换字符1. 题目描述2. 思路分析3. 代码实现 游游的9的倍数1. 题目描述2. 思路分析3. 代码实现 六、参考链接 总结 牛客第一…

时序预测 | MATLAB实现BO-NARX和BO-LSTM贝叶斯优化神经网络股票价格预测比较

时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较 目录 时序预测 | MATLAB实现BO-NARX贝叶斯优化非线性自回归外生模型和BO-LSTM贝叶斯优化长短期记忆神经网络股票价格预测比较效果一览基本介绍研究过程程序…

《分布式中间件技术实战:Java版》学习笔记(二):RabbitMQ死信队列/延迟队列实现商品扣库存

一.关于RabbitMQ 1.RabbitMQ交换机类型 (1).FanoutExchange&#xff1a;广播交换机。消息发送到交换机后&#xff0c;会广播到所有队列&#xff0c;不需要经过路由。 (2).DirectExchange&#xff1a;直通交换机。生产者发送消息到交换机(Exchange)&#xff0c;再经过路由(Ro…

自然语言处理从入门到应用——预训练模型总览:预训练模型的拓展

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …

Fully-Convolutional Siamese Networks for Object Tracking(SiamFC)

Fully-Convolutional Siamese Networks for Object Tracking&#xff08;SiamFC&#xff0c;ECCV2016&#xff09; 全卷积网络的优势在于&#xff0c;可以将一个更大的搜索图像作为输入提供给网络&#xff0c;它将在单个评估中计算所有平移后的子窗口的相似度&#xff0c;而不…

安全中级11:sql注入+联合、报错、时间盲注+sqlmap使用

目录 一、sql注入原理 二、联合SQL注入的方法 1.总体的思路 &#xff08;1&#xff09;先进行闭合&#xff0c;进行报错 &#xff08;2&#xff09;进行逃逸 &#xff08;3&#xff09;外带数据 &#xff08;4&#xff09;获取库名 表名 列名 数据 &#xff08;5&#…

【PADS封装】Dsub(DB9,DB15d等)公母头座子封装(带3D)

包含了我们平时常用的贴片Dsub(DB9,DB15等)公母头座子封装&#xff0c;总共28种封装及精美3D模型。完全能满足日常设计使用。每个封装都搭配了精美的3D模型哦。 1.D-Sub是被用来连接数据生成设备和数据输出设备&#xff0c;D-Sub和VGA&#xff0c;两者叫法不同。VGA是IBM在1987…

node-sass 安装失败解决办法

前言 很多小伙伴在安装 node-sass 的时候都失败了&#xff0c;主要的原因是 node 版本和项目依赖的 node-sass 版本不匹配。 解决方案 解决方案&#xff1a;把项目中的 node-sass 替换为 sass&#xff0c;其实 node-sass 已被官方弃用。 官方公告&#xff1a; LibSass and …

Echarts X轴label标签文本和刻度线对齐显示,而不是呈现在两个刻度线之间

如下图所示X轴标签文本Mon位于两个刻度线中间&#xff1a; 想要的效果是如下图&#xff0c;刻度线正下方是标签文本Mon&#xff1a; 只需要在xAxis中添加axisTick的alignWithLabel属性&#xff0c;属性值设为true即可&#xff1a; option {xAxis: {type: category,axisTick: …

Nginx【Nginx虚拟主机单网卡多IP配置、Nginx虚拟主机基于域名的配置 】(四)-全面详解(学习总结---从入门到深化)

Nginx虚拟主机单网卡多IP配置 通过不同的IP区分不同的虚拟主机&#xff0c;此类虚拟主机对应的企业应用非常少见&#xff0c;一般不同业务需要使用多IP的常见都会在负载均衡器上进行VIP绑定&#xff0c;而不是在Web上通过绑定IP区分不同的虚拟机。 需求 一台Linux服务器绑定两…

Hadoop基础——MapReduce

1. Hadoop序列化和反序列化及自定义bean对象实现序列化&#xff1f; 1) 序列化和反序列化的含义序列化是将内存中的对象转换为字节序列&#xff0c;以便持久化和网络传输。 反序列化就是将字节序列或者是持久化数据转换成内存中的对象。 Java的序列化是一个重量级序列化框架&a…

《TCP IP网络编程》第一章

2023.6.28 正式开始学习网络编程。 每一章每一节的笔记都会记录在博客中以便复习。 第1章 1.1理解网络编程和套接字 网络编程又叫套接字编程。所谓网络编程&#xff0c;就是编写程序使两台连网的计算机相互交换数据。 为什么叫套接字编程&#xff1f; 我们平常将插头插入插座上…