【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
💥1 概述
📚2 运行结果
2.1 non_aniso
2.2 inhomo_iso
2.3 heat_imp
2.4 heat_explicit
🎉3 参考文献
🌈4 Matlab代码实现
💥1 概述
【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波
各种基于扩散的图像滤波方法:
1.使用热方程的线性扩散滤波 - 使用隐式和显式欧拉方法求解。
2. 边缘增强线性各向异性扩散滤波。
3. 边缘增强非线性各向异性扩散滤波。
在图像处理领域,去除图像中的噪点和提升细节是非常重要的任务。为此,发展了各种基于扩散的图像滤波方法,旨在改善图像质量和增强图像特征。以下是其中几种常见的滤波方法:
1. 线性扩散滤波:使用热方程模型来进行线性扩散滤波。这种方法可以使用隐式和显式欧拉方法来求解,以改善图像的平滑度和减少噪声。线性扩散滤波能够通过自适应地调整邻域像素的亮度值,实现图像的去噪和平滑。
2. 边缘增强线性各向异性扩散滤波:这种方法结合了线性扩散滤波和各向异性过滤的思想,在保持图像平滑的同时突出了图像中的边缘特征。通过对邻域像素的梯度进行加权处理,边缘增强线性各向异性扩散滤波能够有效地提升图像的边缘细节,使图像更加清晰和锐利。
3. 边缘增强非线性各向异性扩散滤波:与线性滤波相比,非线性滤波方法在处理图像时更加灵活和精确。边缘增强非线性各向异性扩散滤波通过考虑像素之间的非线性关系,使得处理后的图像在细节和边缘保留方面更具优势。这种方法能够在去除噪点的同时保持图像的细节和纹理信息。
这些基于扩散的图像滤波方法为图像去噪和增强提供了强大的工具。根据不同的应用需求和图像特征,选择合适的滤波方法能够显著改善图像质量,并提高图像的可视化效果。无论是在科学研究、医学影像还是图形设计领域,这些滤波方法都发挥着重要作用,为用户带来更好的图像处理体验。
📚2 运行结果
2.1 non_aniso
2.2 inhomo_iso
2.3 heat_imp
2.4 heat_explicit
部分代码:
% set up finite difference parameters
alpha =.5;
k = 1;
h = 1;lambda = (alpha^2)*(k/(h^2));[m n] = size(w);
%stick image into a vector
w_vec = reshape(w,n*n,1);
w_old = w;
w_new = w;%smooth the image
im_smth = filter_function(w,1);
im_smth = im_smth';
% required for g() calculation
[dx_im_smth dy_im_smth] = gradient(im_smth);
gr_im_smth = dx_im_smth.^2 + dy_im_smth.^2;[mmm nnn] = size(gr_im_smth);
% g() calculation
for i=1:mmmfor j=1:nnng(i,j) = 1/(1+(gr_im_smth(i,j)/32));end
end
%g = g';
jj=1;[im_sx im_sy] = gradient(im_smth);
% diffusion tensor D is preconputed here
D = zeros(n*n,2,2);
for i=1:n*nrow = ceil(i/n);col = i - (row-1) * n;% if((col > 1) && (col < n) && (row > 1) && (row < n))% choose eigenvector parallel and perpendicular to gradienteigen_vec = [im_sx(row,col) im_sy(row,col); im_sy(row,col) -im_sx(row,col) ];%choose eigenvalueseigen_vec(:,1) = eigen_vec(:,1) ./ norm(eigen_vec(:,1));eigen_vec(:,2) = eigen_vec(:,2) ./ norm(eigen_vec(:,2));eigen_val = [g(row,col) 0;0 1];% form diffusion tensorD(i,:,:) = eigen_vec * eigen_val * (eigen_vec'); % end
endfigure;
for k=1:400 % for each iterationfor i=1:n*n % solve using Jacobi iterations schemerow = ceil(i/n); %compute what row this pixel belongs to in original imagecol = i - (row-1) * n; % compute cols similarly%different if conditions handles pixels at different location in%the image as depending on their location they may or may not have%all their neighbor pixels which will be required for finite%differencesif((col > 1) && (col < n) && (row > 1) && (row < n))s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));w_new(i) = (-s + w_old(i))/(1 + lambda * (2 * D(i,1,1) + 2 * D(i,2,2) - D(i,1,2) - D(i,2,1)));elseif((row == 1) && (col > 1) && (col < n))s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));%s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i+n));w_new(i) = (-s + w_old(i))/(1+4*lambda);elseif((row == n) && (col > 1) && (col < n))s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...(D(i,2,2) * w_old(i-n)));%s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i-n));w_new(i) = (-s + w_old(i))/(1+4*lambda);elseif((col == 1) && (row > 1) && (row < n))s = -lambda * (((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));%s = -(lambda) * (w_old(i+1) + w_old(i+n) + w_old(i-n));w_new(i) = (-s + w_old(i))/(1+4*lambda);elseif((col == n) && (row > 1) && (row < n))s = -lambda * ((D(i,1,1) * w_old(i-1)) + ...(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n)))); %s = -(lambda) * (w_old(i-1) + w_old(i+n) + w_old(i-n));w_new(i) = (-s + w_old(i))/(1+4*lambda);elseif((col==1) && (row==1))
% set up finite difference parameters
alpha =.5;
k = 1;
h = 1;
lambda = (alpha^2)*(k/(h^2));
[m n] = size(w);
%stick image into a vector
w_vec = reshape(w,n*n,1);
w_old = w;
w_new = w;
%smooth the image
im_smth = filter_function(w,1);
im_smth = im_smth';
% required for g() calculation
[dx_im_smth dy_im_smth] = gradient(im_smth);
gr_im_smth = dx_im_smth.^2 + dy_im_smth.^2;
[mmm nnn] = size(gr_im_smth);
% g() calculation
for i=1:mmm
for j=1:nnn
g(i,j) = 1/(1+(gr_im_smth(i,j)/32));
end
end
%g = g';
jj=1;
[im_sx im_sy] = gradient(im_smth);
% diffusion tensor D is preconputed here
D = zeros(n*n,2,2);
for i=1:n*n
row = ceil(i/n);
col = i - (row-1) * n;
% if((col > 1) && (col < n) && (row > 1) && (row < n))
% choose eigenvector parallel and perpendicular to gradient
eigen_vec = [im_sx(row,col) im_sy(row,col); im_sy(row,col) -im_sx(row,col) ];
%choose eigenvalues
eigen_vec(:,1) = eigen_vec(:,1) ./ norm(eigen_vec(:,1));
eigen_vec(:,2) = eigen_vec(:,2) ./ norm(eigen_vec(:,2));
eigen_val = [g(row,col) 0;0 1];
% form diffusion tensor
D(i,:,:) = eigen_vec * eigen_val * (eigen_vec');
% end
end
figure;
for k=1:400 % for each iteration
for i=1:n*n % solve using Jacobi iterations scheme
row = ceil(i/n); %compute what row this pixel belongs to in original image
col = i - (row-1) * n; % compute cols similarly
%different if conditions handles pixels at different location in
%the image as depending on their location they may or may not have
%all their neighbor pixels which will be required for finite
%differences
if((col > 1) && (col < n) && (row > 1) && (row < n))
s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...
(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
w_new(i) = (-s + w_old(i))/(1 + lambda * (2 * D(i,1,1) + 2 * D(i,2,2) - D(i,1,2) - D(i,2,1)));
elseif((row == 1) && (col > 1) && (col < n))
s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...
((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
%s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i+n));
w_new(i) = (-s + w_old(i))/(1+4*lambda);
elseif((row == n) && (col > 1) && (col < n))
s = -lambda * ((D(i,1,1) * w_old(i-1)) + ((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...
(D(i,2,2) * w_old(i-n)));
%s = -(lambda) * (w_old(i+1) + w_old(i-1) + w_old(i-n));
w_new(i) = (-s + w_old(i))/(1+4*lambda);
elseif((col == 1) && (row > 1) && (row < n))
s = -lambda * (((D(i,1,1) - D(i,1,2) - D(i,2,1)) * (w_old(i+1))) + ...
(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))) + ((D(i,1,2) + D(i,2,1)) * w_old(i+n+1)));
%s = -(lambda) * (w_old(i+1) + w_old(i+n) + w_old(i-n));
w_new(i) = (-s + w_old(i))/(1+4*lambda);
elseif((col == n) && (row > 1) && (row < n))
s = -lambda * ((D(i,1,1) * w_old(i-1)) + ...
(D(i,2,2) * w_old(i-n)) + ((D(i,2,2) - D(i,1,2) - D(i,2,1)) * (w_old(i+n))));
%s = -(lambda) * (w_old(i-1) + w_old(i+n) + w_old(i-n));
w_new(i) = (-s + w_old(i))/(1+4*lambda);
elseif((col==1) && (row==1))
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]张建伟,王译禾,陈允杰.基于非线性扩散滤波结构信息的图像去噪方法[J].计算机工程与设计, 2016, 37(11):8.DOI:10.16208/j.issn1000-7024.2016.11.021.
[2]文武,苗放.复数域非线性扩散滤波在图像处理中的应用[J].微电子学与计算机, 2012.DOI:CNKI:SUN:WXYJ.0.2012-06-015.
[3]傅艳莉,李超,陈浩,等.各向异性扩散滤波远探测声波测井图像降噪方法[J].应用声学, 2022, 41(4):10.
[4]许韬.非线性扩散图像混合滤波去噪方法研究[J].计算机仿真, 2020, 037(012):460-464.
[5]李志伟,冯象初.维纳滤波和非线性扩散相结合的图像去噪[J].电子科技, 2007(9):4.DOI:10.3969/j.issn.1007-7820.2007.09.016.
🌈4 Matlab代码实现
相关文章:

【图像去噪的扩散滤波】图像线性扩散滤波、边缘增强线性和非线性各向异性滤波(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

4、在docker容器内的tomcat 中发布项目
1、查看本地是否有tomcat镜像,如果不存在则去下载 docker images 2、查看本地是否有tomcat容器,如存在跳过第3步 docker ps 3、创建tomcat容器 此容器用于复制tomcat的配置文件,配置文件复制后需删除此容器,如果已经存在跳过此步…...

数学建模——人工神经网络模型
一、人工神经网络简介 1、神经网络起源与应用 1943年心理学家McCulloch和数学家Pitts提出神经元生物数学模型(M-P模型),后来人工神经网络(Artifical Neural Network,ANN)是在生物神经网络(Biological Neural Network,BNN)基础上发展起来的&a…...
java合成多个pdf为一个pdf
pom文件 <dependency><groupId>com.lowagie</groupId><artifactId>itext</artifactId><version>2.1.7</version></dependency>主文件 import com.lowagie.text.Document; import com.lowagie.text.pdf.PdfCopy; import com.lo…...

“高级Vue状态管理 - Vuex的魅力与应用“
目录 引言1. Vuex的简介1.1 什么是Vuex?1.2 Vuex的核心概念 2. Vuex的值获取与改变(综合案例)3. Vuex的异步请求总结 引言 在现代Web开发中,前端应用变得越来越复杂。随着应用规模的扩大和数据流的复杂性增加,有效地管理应用的状态成为了一项…...
Vue整合
基础配置: 1.创建:cmd 中 输入 create vue vue_name 启动命令:npm run serve 2.当node_modules(依赖)丢失时通过 npm install 下载 【根据:package-lock.json下载】 3.下载路由 npm i vue-router3.5.2 -S main.js导入 // np…...

探秘PMP和六西格玛的不同:哪一个能为你的职业生涯加分?
今天,我们将带你深入了解一项相对冷门但价值不菲的证书——六西格玛黑带。 可能你曾听说过PMP,但相比之下,六西格玛黑带的资源分享似乎较少,考试内容却更为广泛深入。这里,让我为你详细解析这一考试,带你进…...
大数据学习(3)-hive分区表与分桶表
&&大数据学习&& 🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一下博>主哦&#x…...
JS 原生实现触底加载
创建一个容器来存储列表项。 监听滚动事件,当滚动接近底部时触发加载更多操作。 加载更多数据后,将新数据附加到容器中。 以下是一个简单的示例: <!DOCTYPE html> <html><head><style>#scroll-container {heigh…...

结构体,位段!
目录 1.什么是位段? 别急!在下面第二点我和大家介绍。 2.位段的内存怎么分配? 还有一种情况就是两种类型夹杂在一起的位段 3.位段的跨平台问题 4.位段能干嘛?(应用) 5.位段的注意事项 1.什么是位段&…...

当10年程序员是什么体验?存款几位数?
最近网上一个话题吸引了许多人的讨论,当10年程序员,是一种什么体验? 都说程序员的高收入和工作年限应该成正比,真的是这样吗?工作10年的程序员,工资应该是什么水平?不少网友纷纷“现身说法”..…...

ExoPlayer架构详解与源码分析(4)——整体架构
系列文章目录 ExoPlayer架构详解与源码分析(1)——前言 ExoPlayer架构详解与源码分析(2)——Player ExoPlayer架构详解与源码分析(3)——Timeline ExoPlayer架构详解与源码分析(4)—…...
rust文件读写
std::fs模块提供了结构体File,它表示一个文件。 一、打开文件 结构体File提供了open()函数 open()以只读模式打开文件,如果文件不存在,则会抛出一个错误。如果文件不可读,那么也会抛出一个错误。 范例 fn main() {let file s…...
腾讯云我的世界mc服务器配置选择和价格表
开Minecraft我的世界服务器配置怎么选择?10人以内玩2核4G就够用了,开我的世界服务器选择轻量应用服务器就够了,腾讯云轻量应用服务器2核2G3M带宽轻量服务器一年95元,活动:txyfwq.com/go/tencent 轻量CPU采用至强白金处…...

基于安卓android微信小程序的旅游系统
项目介绍 随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.自助定制游将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本…...

文本编辑器去除PDF水印
用文本编辑器打开pdf,搜索水印的特殊文字,全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf:...

kubernetes负载感知调度
背景 kubernetes 的原生调度器只能通过资源请求来调度 pod,这很容易造成一系列负载不均的问题, 并且很多情况下业务方都是超额申请资源,因此在原生调度器时代我们针对业务的特性以及评估等级来设置 Requests/Limit 比例来提升资源利用效率。…...

Lock使用及效率分析(C#)
针对无Lock、Lock、ReadWriterLock、ReadWriterLockSlim四种方式,测试在连续写的情况下,读取的效率(原子操作Interlocked由于使用针对int,double等修改的地方特别多,而且使用范围受限,所以本文章没有测试) …...

安卓三防平板在行业应用中有哪些优势
在工业维修和检测中,安卓三防平板的应用也十分广泛。它可以搭载各种专业软件和工具,帮助工人们进行设备故障排查和维护,降低了维修成本和停机时间。 一、产品卖点: 1. 防水性能:该手持平板采用了防水设计,…...

2015架构真题(五十)
供应链中信息流覆盖了供应商、制造商和分销商,信息流分为需求信息流和供应信息流,()属于需求信息流,()属于供应信息流。 库存记录生产计划商品入库单提货发运单 客户订单采购合同完工报告单销售…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

视觉slam十四讲实践部分记录——ch2、ch3
ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...