matlab编程实现自适应均值滤波和自适应中值滤波

article/2025/10/9 22:03:54

matlab编程实现自适应滤波器

  • 一、自适应均值滤波器
    • 1. 原理部分:
    • 2. 程序代码
    • 3. 结果对比
  • 二、自适应中值滤波
    • 1. 原理部分
    • 2.程序代码
    • 3. 结果对比

一、自适应均值滤波器

1. 原理部分:

加入噪声:
原理: 将图片灰度化,然后将图片像素归一化到[0,1]之间,然后添加均值为0,方差为0.1的高斯噪声,乘以255映射回图片原来的灰度级,用max(0,min(t1,255))操作将超出[0,255]的纠正。效果如图:
在这里插入图片描述

随机变量最简单的统计量是均值和方差,这些适当的参数是自适应局部滤波器的基础。均值给出了计算均值的区域中灰度平均值的度量,而方差给出了这个区域的平均对比度的度量
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 程序代码

主函数:

clear;clc;
%% 导入原图像,并添加高斯噪声
image=imread("1.jpg");
image=rgb2gray(image);	%灰度化
[m,n,~]=size(image);	
% y=0+0.2*randn(m,n/2);	%只添加一半   
y=0+0.2*randn(m,n);		%全范围加上噪声
%先将其double化,再除以255 便于后面计算
t1=double(image)/255;
%加上噪声
% t1(:,(n/2+1):n)=t1(:,(n/2+1):n)+y;
t1(:,:)=t1(:,:)+y;
t1 = max(0,min(t1,1));  %处理到[0,1]
% t1(:,:)=t1(:,:)+y2;
%将像素范围扩大至0--255
t1=t1*255;
%转换为uint8类型  包含噪声的图片
t2=uint8(t1);
figure("color",[1,1,1])
subplot(1,2,1),imshow(image),title('原图');
subplot(1,2,2),imshow(t2),title('加入均值为0,标准差为0.2的高斯噪声后');%% 计算噪声方差
t2_reshape=reshape(t1,1,1,length(t1(:)));
global_means=mean(t2_reshape);
global_vars=var(t2_reshape,1); %% 自适应均值滤波器
image_with_noise=t1;
image_expand=padarray(image_with_noise, [3 3]); %扩展周围一圈
image1=double(image);
image_init=padarray(image1, [3 3]); 
%扩展周围一圈,因为滤波器为7x7,可以有镜像扩充、对称扩充、常数扩充等等imagemean=image_expand; %存储每个位置的局部均值
imagevar=image_expand;  %存储每个位置的局部方差[width,height,z]=size(image_expand);
s=7;    %滤波器阶数
for i=1:width-s+1for j=1:height-s+1box=image_expand(i:i-1+s,j:j-1+s);boxs=reshape(box,1,1,length(box(:)));means=mean(boxs);   %求均值imagemean(i+(s-1)/2,j+(s-1)/2)=means;vars=var(boxs,1);   %求方差imagevar(i+(s-1)/2,j+(s-1)/2)=vars;end
end
image_expand=image_expand(3+1:width-3,3+1:height-3);
imagemean=imagemean(3+1:width-3,3+1:height-3);	%去掉扩充的边缘
imagevar=imagevar(3+1:width-3,3+1:height-3);	%去掉扩充的边缘
noise = mean2(imagevar);%估计全局噪声方差%% 书上公式计算得到的滤波结果
image_new=image_expand-(noise./imagevar.*(image_expand-imagemean));
image_new = max(0,min(image_new,255));  %处理到[0,255]
image_new=uint8(image_new);%% matlab源码做了改进,效果差距不是很大
image_new_default=imagemean + (max(0, imagevar - noise) ./max(imagevar, noise)) .* (image_expand - imagemean);
image_new_default=uint8(image_new_default);
%% 画图
figure("color",[1,1,1])
subplot(2,2,1);
imshow(image);
imshow(t2);
title('原图像');
output=mean_filter(image_expand,7);
subplot(2,2,2);
imshow(output);
title('均值滤波处理后结果');subplot(2,2,3);
imshow(image_new);
title('自适应均值滤波处理后结果');subplot(2,2,4);
imshow(image_new_default);
title('修改后的自适应均值滤波处理后结果');% figure("color",[1,1,1])
% image_global_var=image_expand-(global_vars./imagevar.*(image_expand-imagemean));
% image_global_var = max(0,min(image_global_var,255));  %处理到[0,255]
% image_global_var=uint8(image_global_var);
% imshow(image_global_var);
% title('global var自适应均值滤波处理后结果');

子函数:

%自编写均值滤波器
function output=mean_filter(image,n)
%输入image为原始图像,n为滤波器规模n*n,输出为滤波后的图像output
[h,w]=size(image);
imaged=double(image); %转换为double类型
imagedd=imaged;  %初始化滤波结果的规模
a=ones(n,n);
for i=1:h-n+1for j=1:w-n+1pattern=imaged(i:i+n-1,j:j+n-1).*a;means=sum(sum(pattern));imagedd(i+(n-1)/2,j+(n-1)/2)=means/(n*n);end
end
output=uint8(imagedd);
end

3. 结果对比

在这里插入图片描述

二、自适应中值滤波

1. 原理部分

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.程序代码

主程序:

gray=imread('5.png');
gray=rgb2gray(gray);	%灰度化
%% 加入噪声
gray_noise=imnoise(gray,'salt & pepper',0.5);
%% 中值滤波
M1 = medfilt2(gray_noise,[3,3]);
%% 自适应中值滤波
f1 = adaptive_median_filter(gray_noise,11);
%%
figure("color",[1,1,1]);
subplot(131)
imshow(gray_noise)
title("gray with noise")
subplot(132)
imshow(M1)
title("中值滤波")
subplot(133)
imshow(f1)
title("自适应中值滤波")

子函数:

function f = adaptive_median_filter (g, Smax) 
%% 判断邻域是否合理
if (Smax <= 1) || (Smax/2 == round(Smax/2)) || (Smax ~= round(Smax)) error ('SMAX must be an odd integer > 1.') 
end
%% 
f = g; 
f(:) = 0;
%% 标记是否已处理过
alreadyProcessed = false (size(g)); 
%% 开始自适应滤波 
for k = 3:2:Smax zmin = ordfilt2(g, 1, ones(k, k),'symmetric');zmax = ordfilt2(g, k * k, ones(k, k), 'symmetric'); zmed = medfilt2(g, [k k], 'symmetric'); 
%% 判断是否进入进程B    processUsingLevelB  = (zmed > zmin) & (zmax > zmed) & ~alreadyProcessed;
%% 若g不是脉冲,保留原值zB = (g > zmin) & (zmax > g); outputZxy = processUsingLevelB & zB; 
%% 若是脉冲,用Zmed替换outputZmed = processUsingLevelB & ~zB; f (outputZxy) = g(outputZxy); f (outputZmed) = zmed(outputZmed);
%% 已处理记录alreadyProcessed = alreadyProcessed | processUsingLevelB; 
%% 是否退出if all (alreadyProcessed (:)) break; end 
end
%% 大于窗口尺寸后,Zxy替换成Zmed输出
f (~alreadyProcessed) = zmed (~alreadyProcessed);
end

3. 结果对比

噪声密度0.2:
噪声密度0.2
噪声密度0.5:
在这里插入图片描述

  1. 由图可知,当脉冲噪声的空间密度过大时,中值滤波的性能就不是很好,自适应中值滤波可以处理具有更大概率的脉冲噪声。
  2. 自适应中值滤波平滑非脉冲噪声时试图保留细节,这是 中值滤波器做不到的。

http://chatgpt.dhexx.cn/article/pwpPqlnR.shtml

相关文章

自适应滤波器之横向滤波器

本文对横向滤波器作以介绍&#xff0c;如有表述不当之处欢迎批评指正。欢迎任何形式的转载&#xff0c;但请务必注明出处。 目录 1. 横向滤波器1.1. 概念1.2. 举例 2. 参考文献 1. 横向滤波器 1.1. 概念 横向滤波器&#xff08;transversal filter&#xff09;&#xff0c;也…

自适应中值滤波及实现

前言 无意中看到了一篇比较老的论文&#xff0c;Adaptive median filters: new algorithms and results。感兴趣的可以下载下来看看。主要就是提出了一种自适应中值滤波算法&#xff0c;这个算法是很经典的中值滤波算法的改进版本&#xff0c;自动选择滤波器的大小&#xff0c…

浅谈自适应滤波器

在通常的滤波场合中&#xff0c;从频域的角度进行滤波&#xff0c;其相关的理论已经相当的成熟&#xff0c;只要给出相应的设计指标就可以很方便的设计出满足要求的滤波器。然而在更一般的情况下&#xff0c;人们所需要的滤波器工作的环境是时变的&#xff0c;这就导致事先已经…

自适应滤波原理

在网上&#xff0c;看到一篇不错的自适应滤波原理讲解的文章&#xff0c;原文网址为&#xff1a;自适应滤波原理简介 全文包括&#xff1a; 1. 自适应滤波器简介 2. 自适应干扰抵消原理 3. 自适应滤波原理 4. 最小均方&#xff08;LMS&#xff09;算法 5. Matlab实现 一、自适…

自适应滤波算法综述

我要讲的几种方法 绪论自适应滤波的基本原理自适应滤波算法自适应滤波算法种类最小均方误差算法&#xff08;LMS&#xff09;递推最小二乘算法&#xff08;RLS&#xff09;变换域自适应滤波算法仿射投影算法其他 自适应滤波算法性能评价 自适应滤波的Matlab仿真正弦信号加噪的L…

Java反射机制你还不会?那你怎么看Spring源码

文章目录 1.Java代码在计算机中经历的阶段&#xff1a;三个阶段2.Java识别类和对象信息的两种方式3.什么是反射4.获取Class对象的方式5.Class对象的功能6.通过反射操作类中的成员变量、构造函数、方法7.案例8.反射的优缺点 1.Java代码在计算机中经历的阶段&#xff1a;三个阶段…

Java 反射 理解

Java 反射 定义 Java的反射&#xff08;reflection&#xff09;机制是指在程序的运行状态中&#xff0c;可以构造任意一个类的对象&#xff0c;可以了解任意一个对象所属的类&#xff0c;可以了解任意一个类的成员变量和方法&#xff0c;可以调用任意一个对象的属性和方法。 简…

Java反射机制的原理和用途

看了好多关于Java反射机制的文章&#xff0c;大多都太过官方&#xff0c;消化起来比较稍显费劲&#xff0c;本篇&#xff0c;我会依据自己的理解去阐述什么是Java的反射机制&#xff0c;反射用在什么地方&#xff0c;以及怎么来使用&#xff1f; 开篇前&#xff0c;我们还是要了…

Java反射详解及作用

参考视频链接: 哔哩哔哩视频. 1. 反射概述 能够分析类能力的程序叫做反射(reflective)&#xff0c;对于任何一个Class类&#xff0c;反射可以在运行时直接得到这个类的全部成分&#xff0c;包括构造器&#xff0c;成员方法&#xff0c;成员变量。获得的构造器对象为Construct…

JAVA反射机制分析-------spring的通过反射创建bean实例对象以及属性注入的原理解析

JAVA反射机制 java反射机制是在运行状态中&#xff0c;对于任意一个类&#xff0c; 能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象,都能够调用他的任意一个方法和属性。这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。 巧妙的利用ja…

【Spring】spring的反射机制详解

一、什么是反射&#xff1a; &#xff08;1&#xff09;Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息&#xff0c;从而操作类或对象的属性和方法。本质是JVM得到class对象之后&#xff0c;再通过class对象进行反编译&#xff0c;从而获取对象的各种信息。 &…

Spring————java的反射机制,Spring的IOC和DI

一、认识Spring 1.1、Spring家族 SpringFramework&#xff1a; Spring框架&#xff1a;是Spring中最早核心的技术&#xff0c;也是所有其他技术及的基础。 SpringBoot:Spring是用来简化开发。而SpringBoot是来帮助Spring在简化的基础上能更快速进行开发。 SpringCloud&#xf…

分布式定时任务调度实战

目录 1、为什么需要定时任务 2、定时任务调度框架 2.1 单机 2.2 分布 3、xxl-job和elastic-job对比 3.1 支持集群部署方式 3.2 多节点部署任务执行方式 3.3 日志可追溯 3.4 监控告警 3.5 弹性扩容缩容 3.6 支持并行调度 3.7 高可用策略 3.8 失败处理策略 3.9 动态…

浅谈传统定时任务和分布式定时任务

为什么用定时任务&#xff1f; 定时任务平台可以在后台自动检测数据并进行操作。主要应用在订单状态改变、后台统计、定时发送邮件或短信等。 定时任务怎么部署实现&#xff1f; 传统的定时任务可以通过可定时线程池、timertask、quartz、spring-schedule方式来进行处理。他…

分布式定时任务技术选型

1、目前的定时任务方案 Java中开发大多数使用Spring-Scheduler&#xff0c;只需要在Spring中的bean的对应方法加上sheduler注解即可完成我们的定时任务&#xff0c;但是光是用这个注解还远远不能保证定时任务执行多次&#xff0c;我们需要一些其他手段的保证&#xff0c;一般来…

java 分布式 定时任务_Java中实现分布式定时任务的方法

定时器Scheduler在平时使用比较频繁&#xff0c;在springboot中&#xff0c;配置好Scheduled和EnableScheduling之后&#xff0c;定时器就能正常执行&#xff0c;实现定时任务的功能。 但是在这样的情况下&#xff1a;如果开发的服务需要水平部署实现负载均衡&#xff0c;那么定…

【手把手】分布式定时任务调度解析之Quartz

1、任务调度背景 在业务系统中有很多这样的场景&#xff1a; 1、账单日或者还款日上午 10 点&#xff0c;给每个信用卡客户发送账单通知&#xff0c;还款通知。如何判断客户的账单日、还款日&#xff0c;完成通知的发送&#xff1f; 2、银行业务系统&#xff0c;夜间要完成跑批…

轻量级分布式定时任务框架XXL-Job

轻量级分布式定时任务框架XXL-Job: XXL-JOB是一款轻量级的分布式定时任务框架&#xff0c;上手简单&#xff0c;操作容易&#xff0c;XXL-Job可以到官网下载也可以去gitee上拉取源码&#xff0c;其中核心模块分页两个&#xff1a;1&#xff1a;是分布式调度服务&#xff0c; 2&…

Springboot结合Redis实现分布式定时任务

一、背景 之前分享过分布式定时任务的技术选型方案&#xff1a;分布式定时任务技术选型方案&#xff0c;个人青睐xxl_job&#xff0c;分享了搭建接入流程&#xff1a;xxl_job搭建方案&#xff0c;本次项目需求较为简单&#xff0c;同时时间紧张。下面介绍利用Redis锁实现分布式…

分布式定时任务框架说明

分布式定时任务框架说明 分布式定时任务框架说明Quartz概念架构组件springboot集成方式使用内存使用数据库 TBSchedule&#xff1a;elastic-job概念架构组件执行流程特性 satumxxl-job概念特性架构组件使用 分布式定时任务框架说明 Quartz 概念 Quartz&#xff1a;Java事实上…