matlab自定义函数实现图像小波变换

matlab中提供了小波变换函数lwt和ilwt,可以方便地实现提升小波变换。

我们按照小波变换的定义,粗糙地实现一个针对图像的小波变换,如下:


% 使用方法:
img = imread('lena256.bmp');  % 假设lena.png是灰度图像
subplot(2,2,1),imshow(img,[]);title('原始图像');
[m,n]=size(img);
result = wavelet_transform(img);
subplot(2,2,2),imshow(result,[]);title('小波');
subplot(2,2,3),imshow(result(1:m/2,1:n/2),[]);title('小波LL');
image = inverse_wavelet_transform(result);
subplot(2,2,4),imshow(image,[]);title('粗糙复原');function temp = wavelet_transform(image)
% 对输入图像进行一次5/3小波变换
% image: 输入的灰度图像
% LL, LH, HL, HH: 分解得到的四个子带图像
% 预处理 - 将图像转为double类型
image = double(image);% 水平方向提升小波变换
[rows, cols] = size(image);
temp = zeros(size(image));  % 用于存储水平方向处理后的临时结果
for i = 1:rows[sL, dL] = lifting_scheme(image(i, :));temp(i, 1:end/2) = sL;  % 放在前面temp(i, end/2+1:end) = dL;  % 放在后面
end% 垂直方向提升小波变换
for j = 1:cols[sL, dL] = lifting_scheme(temp(:, j)');temp(1:end/2,j) = sL;  %放前面temp(end/2+1:end,j) = dL;  %放后面
endendfunction [s, d] = lifting_scheme(x)
% 提升小波分解
% 输入序列 x 应为偶数长度
% 输出 s 为近似系数序列,d 为细节系数序列% 分裂步骤
e = x(1:2:end);
o = x(2:2:end);% 预测步骤
p = (e + [e(2:end), e(end)]) / 2;  % 使用边界延拓对最后一个元素进行处理
d = o - p;  % 计算细节系数% 更新步骤
u = (d + [d(2:end), d(end)]) / 4;  % 类似地处理最后一个元素
s = e + u;  % 更新近似系数
endfunction image = inverse_wavelet_transform(temp)
% 对输入的小波变换结果进行逆变换
% temp: 小波变换的结果
% image: 重建后的灰度图像% 先进行垂直方向的逆变换
[rows, cols] = size(temp);
image = zeros(size(temp));  % 用于存储垂直方向处理后的临时结果
for j = 1:colssL = temp(1:end/2, j)';dL = temp(end/2+1:end, j)';image(:, j) = inverse_lifting_scheme(sL, dL);
end% 再进行水平方向的逆变换
for i = 1:rowssL = image(i, 1:end/2);dL = image(i, end/2+1:end);image(i, :) = inverse_lifting_scheme(sL, dL);
end% 后处理 - 将图像转为uint8类型(如果需要)
image = uint8(image);endfunction x = inverse_lifting_scheme(s, d)
% 提升小波重建
% s: 近似系数序列
% d: 细节系数序列
% x: 重建后的序列% 逆更新步骤
u = (d + [d(2:end), d(1)]) / 4;  % 注意这里首尾相接的方式不同于上面
e = s - u;% 逆预测步骤
p = (e + [e(1), e(1:end-1)]) / 2;  % 同理,这里使用的也是不同的边界延拓方式
o = d + p;% 合并步骤
x(1:2:length(e)*2) = e;
x(2:2:length(o)*2) = o;end%% 下面的代码进行图像本身的拓边,保证在预测、更新过程中能被除尽
% % 检查 e 和 o 的长度,确保它们匹配
% if length(e) > length(o)
%     % 如果 e 的长度比 o 长,则需要扩展 o
%     o(end+1) = 2 * o(end) - e(end); % 可以是其他边界扩展策略
% end%% 下面的代码涉及到边界拓展模式,可以作为参考。% function [s, d] = lifting_scheme(x)
%     % 提升小波分解
%     % 输入序列 x 应为偶数长度
%     % 输出 s 为近似系数序列,d 为细节系数序列
%
%     % 分裂步骤
%     e = x(1:2:end);
%     o = x(2:2:end);
%
%     % 预测步骤
%     p = zeros(1, length(o));
%     p(1) = e(1);  % 对于序列的首端,直接取值(或使用其他边界延拓策略)
%     p(2:end) = (e(1:end-1) + e(2:end)) / 2;  % 平均相邻的e值进行预测
%     d = o - floor(p);
%
%     % 更新步骤
%     u = zeros(1, length(e));
% %     u(1:end-1) = (d(1:end-1) + [d(2:end), 0]) / 4;  % 更新e值,除最后一个d外
%     u(1:end-1) = (d(1:end-1) + d(2:end)) / 4;  % 更新e值,除最后一个d外
%     u(end) = (d(end) + d(end-1)) / 4;  % 最后一个e值的更新
%     s = e + floor(u);
% end% function [s, d] = lifting_scheme(x)
% % 提升小波分解
% % 输入序列 x 应为偶数长度
% % 输出 s 为近似系数序列,d 为细节系数序列
%
% % 分裂步骤
% e = x(1:2:end);
% o = x(2:2:end);
%
% %     % 预测步骤
% %     p = [e(1); (e(1:end-1) + e(2:end)) / 2];  % 对于序列的首端,使用边界延拓
% %     d = o - floor(p);
% %
% %     % 更新步骤
% %     u = [(d(1) + d(2)) / 4; (d(1:end-1) + d(2:end)) / 4];
% %     s = e + floor(u);
%
% % 预测步骤
% % 对于序列的首端和末端,使用边界延拓
% p = [(e(1) + e(2)) / 2; (e(1:end-1) + e(2:end)) / 2; (e(end-1) + e(end)) / 2];
% p = p(1:length(o)); % 使 p 和 o 长度一致
% d = o - floor(p);
%
% % 更新步骤
% u = [(d(1) + d(2)) / 4; (d(1:end-1) + d(2:end)) / 4; (d(end) + d(end-1)) / 4];
% u = u(1:length(e)); % 使 u 和 e 长度一致
% s = e + floor(u);
% end

运行结果如下:

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

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

相关文章

上门服务系统|如何搭建一款高质量的上门服务软件

预约上门系统源码开发是一项复杂而有挑战性的任务,但也是实现智能化预约服务的关键一步。通过自主开发预约上门系统的源码,企业可以完全定制系统的功能、界面和安全性,从而为用户提供更高效、便捷、个性化的预约体验。本文将带你深入了解预约…

S275智慧煤矿4G物联网网关:矿山开采的未来已来

随着经济发展煤矿需求不断激增,矿山矿井普遍处于偏远山区,生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题,利用网关对现场终端设备连接组网,实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛,户外环…

(学习日记)2024.01.27

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

GNU链接脚本的MEMORY命令解析

1、GUN中对MEMORY指令的描述 《GUN的官网描述》 2、MEMORY命令的格式 MEMORY{name [(attr)] : ORIGIN origin, LENGTH len…}实例: MEMORY {/* 描述设备的内存区域 */rom (rxa) : ORIGIN 0x80000000, LENGTH 512Kram (wxa) : ORIGIN 0x80080000, LENGTH 51…

Vue2中给对象添加新属性界面不刷新?

在 Vue.js 中,如果你在对象上添加新属性而界面没有刷新,这可能是由于Vue的响应性系统的特性所导致的。Vue在初始化时会对数据进行响应式转换,这意味着只有在初始时存在的属性才会被监听,后来添加的属性不会自动触发视图更新。 我…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献&#xff1a;《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心 一、独立中线模块的三相四线拓扑 独立中线模块是控制中线电压恒为母线一半&#xff0c;同时为零序电流ineu提供通路。不平衡负载的零序电流会导致中线电压脉动&#xff0c;因此需要控制…

微信小程序引导用户打开定位授权通用模版

在需要使用位置信息的页面&#xff08;例如 onLoad 或 onShow 生命周期函数&#xff09;中调用 wx.getSetting 方法检查用户是否已经授权地理位置权限&#xff1a; Page({onLoad: function() {wx.getSetting({success: res > {if (res.authSetting[scope.userLocation]) {/…

力扣hot100 分割回文串 集合 dfs

Problem: 131. 分割回文串 文章目录 思路Code&#x1f496; DP预处理版 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {int n;//字符…

卷子怎么扫描成电子版?试试这些软件

卷子怎么扫描成电子版&#xff1f;随着科技的进步&#xff0c;越来越多的纸质文档正在被数字化所取代。如果你手头有一份纸质试卷&#xff0c;想要将其转化为电子版&#xff0c;却不知道该如何操作&#xff0c;那么今天我们将为你介绍5款软件&#xff0c;让你轻松实现这一目标。…

倒计时68天

题单详情 - 蓝桥云课 (lanqiao.cn) 2.2.串门 - 蓝桥云课 (lanqiao.cn) #include<bits/stdc.h> using namespace std; #define int long long const int N2e55; const int inf0x3f3f3f3f; typedef pair<int,int> pii; vector<pii>ve[N]; int dis[N];//记录以…

探索美颜技术:美颜SDK是什么?

今天&#xff0c;笔者将于大家一同探讨美颜技术&#xff0c;重点聚焦于美颜SDK的定义、工作原理以及在不同领域的应用&#xff0c;以期为读者带来一场有关美颜技术背后秘密的深度探索。 一、什么是美颜SDK&#xff1f; 美颜SDK是一套旨在为开发者提供美颜算法和功能的工具包。…

安卓主板_紫光展锐T820安卓主板方案定制

安卓主板采用了性能强劲的紫光展锐T820八核处理器&#xff0c;搭载了Android 13系统&#xff0c;为用户带来更加顺畅的操作体验。该主板不仅采用了6nm工艺&#xff0c;更加强大的算力和优越的性能&#xff0c;能够轻松实现多任务运行&#xff0c;不会出现卡顿现象。 此外&#…

和朋友随时随地玩——幻兽帕鲁服务器极简部署流程

什么是游戏服务器&#xff1f;通俗来说就是一个公共的电脑&#xff0c;玩家可以在任意时刻进入服务器游玩&#xff0c;不需要等待某个玩家创建房间&#xff0c;即可任意在一个世界一起游戏 本文将为您提供极简部署幻兽帕鲁服务器的指引&#xff0c;「仅需轻点三次鼠标&#xff…

C++ 手记

extern关键字 extern 存储类用于提供一个全局变量的引用&#xff0c;全局变量对所有的程序文件都是可见的。 当有多个文件且定义了一个可以在其他文件中使用的全局变量或函数时&#xff0c;可以在其他文件中使用 extern 来得到已定义的变量或函数的引用。通常用于当有两个或多…

大数据学习之Redis,十大数据类型的具体应用(二)

目录 3.5 Redis 集合&#xff08;Set&#xff09; 单值多value&#xff0c;且无重复 sadd / smembers / sismember / srem / scard srandmember / spop smove 集合运算 应用场景 3.6 Redis有序集合Zset&#xff08;sorted set&#xff09; 有序有重复 zadd / zrange …

计算机设计大赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

代码随想录算法训练营29期Day35|LeetCode 860,406,452

文档讲解&#xff1a;柠檬水找零 根据身高重建队列 用最小数量的箭引爆气球 860.柠檬水找零 题目链接&#xff1a;https://leetcode.cn/problems/lemonade-change/description/ 思路&#xff1a; 很简单&#xff0c;模拟即可。统计五美元、十美元和十五美元的个数。给五美元…

cesium-加载地形图

废话不多说 直接代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item>…