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

news2024/12/24 9:53:30

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;  %放后面
end

end

function [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;  % 更新近似系数
end


function image = inverse_wavelet_transform(temp)
% 对输入的小波变换结果进行逆变换
% temp: 小波变换的结果
% image: 重建后的灰度图像

% 先进行垂直方向的逆变换
[rows, cols] = size(temp);
image = zeros(size(temp));  % 用于存储垂直方向处理后的临时结果
for j = 1:cols
    sL = temp(1:end/2, j)';
    dL = temp(end/2+1:end, j)';
    image(:, j) = inverse_lifting_scheme(sL, dL);
end

% 再进行水平方向的逆变换
for i = 1:rows
    sL = image(i, 1:end/2);
    dL = image(i, end/2+1:end);
    image(i, :) = inverse_lifting_scheme(sL, dL);
end

% 后处理 - 将图像转为uint8类型(如果需要)
image = uint8(image);

end

function 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.coloradmin.cn/o/1422211.html

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

相关文章

dom监听元素 从display: none到页面中

其实业务中还是会碰见这样的需求的,特别是一些框架内不,这个并不是很复杂,我们可以考虑如何去监听到 dom元素样式属性的变化就可以 很多童鞋可能对原生js的不够熟悉,现在大多数同学 只要会写简单的vue操作 就可以 做一些基础的前…

华为配置在用户物理位置变化时部署业务随行示例(V200R006C00、V200R007C00、V200R008C00)

配置在用户物理位置变化时部署业务随行示例(V200R006C00、V200R007C00、V200R008C00) 业务随行简介配置注意事项组网需求需求分析数据规划配置思路操作步骤配置文件 组网图形 图1 组网图 业务随行简介配置注意事项组网需求需求分析数据规划配置思路操作步…

【Time Series】LSTM代码实战

一、简介 还是那句话,"时间序列金融"是一个很有"钱"景的话题,还是想尝试采用Stock时间序列预测任务DeepLearning。本文提供了LSTM预测股票的源代码。 二、算法原理 长短期记忆网络(LSTM)是一种特殊的循环神经…

瑞士0.5米高程地形瓦片数据介绍

一、背景 瑞士是位于中欧的一个国家,以其美丽的自然风光、高质量的生活和强大的金融体系而闻名,其位于欧洲中部,四面环山,与德国、法国、意大利、奥地利和列支敦士登等国家接壤。瑞士境内有许多湖泊和阿尔卑斯山脉的一部分。瑞士…

Redis常见数据类型[上]

目录 前言: 基本全局命令 KEYS EXISTS DEL EXPIRE TTL TYPE 数据结构和内部编码 内部编码: 单线程架构 引出单线程模型: 为什么单线程还这么快? String字符串 字符串数据类型: 常见命令: S…

uniapp微信小程序-分包

一、为什么要分包 微信小程序每个分包的大小是2M,总体积一共不能超过20M,当然你也可以提升启动速度,降低首次加载时间,模块化开发,按需加载,提高性能。 二、分包步骤 1.首先在 mainfest.json mp-weixin添加以下代码&a…

用Python库pillow处理图像

入门知识 颜色。如果你有使用颜料画画的经历,那么一定知道混合红、黄、蓝三种颜料可以得到其他的颜色,事实上这三种颜色就是美术中的三原色,它们是不能再分解的基本颜色。在计算机中,我们可以将红、绿、蓝三种色光以不同的比例叠加…

Git快速入门+常用指令

Git创建本地仓库 1、创建一个文件夹,右键选择Git Bash Here 2、选择下列其中一个方法 方法一:创建初始化仓库 git init 方法二:克隆远程仓库 git clone [url] IDEA集成Git 按步骤操作会自动创建本地仓库 上传步骤 1、提交 2、输入上…

客户端熔断器基于golang Grpc具体实现

目录 前言 一、什么是Google SRE 二、Google SRE 熔断器的工作流程: 三、Google SRE GRPC 代码实现 四、测试用例 大家可以关注个人博客:xingxing – Web Developer from Somewhere 有关后端问题探讨 前言 当某个用户超过资源配额时&#xff0c…

EPSON RC 机器人-第一个程序

创建项目 有机械人且用USB线连接好。可以USB。没有真机的选择 C4 Sample 可以运行程序。 否刚会提示【不能连接到控制器,未安装USB驱动器】 代码 按F5打开运行窗口 再点【开始】 点 【是】,查看运行结果

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID? 日常开发中,我们需要对系统中的各种数据使用 ID 唯一表示,比如用户 ID 对应且仅对应一个人,商品 ID 对应且仅对应一件商品,订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

[BUUCTF]-Web:[GXYCTF2019]Ping Ping Ping解析

先看网页 按照正常流程&#xff0c;先ipls&#xff0c;可以看到flag 但是不能直接得flag&#xff0c;他应该是过滤掉了一点东西。 这里考虑过滤掉了空格 空格过滤绕过&#xff1a; %20 %09 ${IFS} $IFS$1 {IFS} < <> 空格绕过之后发现还是打不开flag.php,但报错语句…

【Vue】二、Vue 组件展示控制的优雅解决方案

vue项目中展示的组件&#xff0c;我平常都是通过v-show进行展示控制&#xff0c;类似这样 通常情况下&#xff0c;一个正常展示组件的流程&#xff0c;是通过前端用户点击触发函数&#xff0c;在函数中对data数据进行操作&#xff0c;从而展示不同的页面 showWork: false, sho…

ansible 常用命令 基本说明 个人备忘

linux下设置一台机器的名称为ansible hostnamectl set-hostname ansible //设置一台机器的名称为master-01 hostnamectl set-hostname master-01 hostnamectl set-hostname master-02 hostnamectl set-hostname node01 hostnamectl set-hostname node02 hostnamectl set-…

仅2个月就实现37家门店自动化覆盖100%的集团公司,到底做对了啥?

在各种AI技术不断被广泛运用于各大企业数字化转型的2024年&#xff0c;有这样一家拥有全国数百家汽车销售门店的500强集团公司&#xff0c;在迎接不断激增门店业务量的同时&#xff0c;持续探索能够确保数百家门店准确、高效运转&#xff0c;并努力将客户满意度维持在一个较高水…

虹科方案|释放总线潜力:汽车总线离线模拟解决方案

导读&#xff1a;传统的ECU模拟工具通常需要依赖上位机软件来发起通信&#xff0c;这在离线场景和自动化产线中带来不便。为了应对这一挑战&#xff0c;虹科推出了创新的汽车总线离线模拟解决方案&#xff0c;基于PCAN-Router系列网关&#xff0c;通过内部可编程固件&#xff0…

配电箱设计软件SuperBox V3.0新功能分享

功能亮点 1 多软件平台互通 SuperBox与图晓晓、ExWinner、D-Hub、SuperWORKS、SuperHarness全打通&#xff0c;报价工程师、技术工程师协同高效工作&#xff0c;配电箱报价、设计、出图火速提升。 2 软件平台更加开放 SuperBox V3.0我们开放了图章库&#xff0c;壳体库&…

python coding with ChatGPT 打卡第15天| 二叉树:翻转二叉树、对称二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 文章目录 翻转二叉树Key Points相关题目视频讲解重点分析递归遍历…

Leetcode—2396. 严格回文的数字【中等】

2024每日刷题&#xff08;一零六&#xff09; Leetcode—2396. 严格回文的数字 算法思想 实现代码 class Solution { public:bool isStrictlyPalindromic(int n) {return false;} };运行结果 之后我会持续更新&#xff0c;如果喜欢我的文章&#xff0c;请记得一键三连哦&…