matlab 自写 自适应中值滤波 matlab自适应中值滤波算法

2023-05-16

一、自适应中值滤波(代码)

function aOut = stPlus(aIn,f1,f2,st,stMax)
%这仅仅是 AdaMedFilter (自适应中值滤波函数) 的子函数
%这仅仅是一个附属函数/功能片段(有特定的功能,输入若干边界条件,输出一个具体的数值)
%输入aIn,需要滤波的图像,循环到的行数f1和列数f2,掩模版大小st,和掩模版最大值stMax

[ra,ca] = size(aIn);
%制作出掩模版
sxy = aIn(f1-round(st/2)+1:f1+round(st/2)-1,f2-round(st/2)+1:f2+round(st/2)-1);
%将掩模版从小到大排序并输出为一列
zSort = sort(sxy(:));
%基于排序后的zSort找到最大值,最小值,中值,以及循环位置的值
med = floor(st*st/2)+1;
zMax = zSort(st*st);
zMin = zSort(1);
zMed = zSort(med);
zxy = sxy(floor(st/2)+1,floor(st/2)+1);
%判断中值是否在最大值和最小值之间
delta1 = zMed-zMin;
delta2 = zMax-zMed;
if (delta1 * delta2) > 0
    %判断循环位置的值是否在最大值和最小值之间
    delta3 = zxy - zMin;
    delta4 = zMax - zxy;
    if (delta3 * delta4) > 0
        %中值 在 最大最小值之间,且循环位置的值 在 最大最小值之间
        aOut = zxy;
    else
         %中值 在 最大最小值之间,但循环位置的值 不在 最大最小值之间
        aOut = zMed;
    end
end
if (delta1 * delta2) <= 0 
    %中值 不在 最大最小值之间
    if st < stMax
        %掩模版尺寸 不是 最大
        if f1 >= floor((st+2)/2)+1 && f2 >= floor((st+2)/2)+1 && f1 <= ra-floor((st+2)/2) && f2 <= ca-floor((st+2)/2)
        %该循环位置是否还可以进行st+2的循环
            aOut = Inf;%可以
        else
            aOut = zMed;%不可以,直接输出
        end
    else
        %掩模版尺寸 是 最大,直接输出
        aOut = zMed;
    end
end
end
function aOut = AdaMedFilter(aIn,static,stMax)
%这仅仅是一个 自适应 中值滤波函数
%输入aIn图像,输出aOut结果
%static是人为定制的静态变量,意义是sxy掩模版的大小,默认为3*3,stMax就是掩模版最大的大小,默认为7*7

%输入参数的默认及处理
if nargin == 1
    static = 3;
    stMax = 7;
elseif nargin == 2
    stMax = 7;
end

%定义输入及输出图像
%aIn是最先输入图像
%atemp是对输入图像的初步处理(比如归一化,双精度化,归255化等),可以在后面调用时灵活更改
%aOut是最终输出图像
atemp = aIn;
[ra,ca] = size(aIn);
aOut = zeros(ra,ca);

%定义st = 3,其中static为人为定义的静态变量,所以
st = static;

%循环,每次循环把循环位置的值给进去,输出一个唯一的有效值赋值给aOut在当前位置的值
for f1 = round(st/2):ra-round(st/2)+1
    for f2 = round(st/2):ca-round(st/2)+1
        %st = static在每一个循环的循环开始和循环结束都有,是为了绝对保证st在每次循环开始和末尾都是绝对为3
        st = static;
        %输入循环位置的值,输出处理后的值,当然,有可能st = 3的中值滤波不够,那么就会输出temp = Inf
       temp = stPlus(atemp,f1,f2,st,stMax);
       %我已经在函数stPlus中确定当temp = Inf时,一定能够被st+2的中值滤波处理,所以我就循环让st增大取得有效的temp
        while(temp == Inf)
           st = st+2;
           temp = stPlus(atemp,f1,f2,st,stMax);
        end
        %每一个循环最重要给我一个唯一的正确值temp,我把它赋值给循环所在位置的aOut!
        aOut(f1,f2) = temp;
        %st = static在每一个循环的循环开始和循环结束都有,是为了绝对保证st在每次循环开始和末尾都是绝对为3
        st = static;
    end
end
end
clear
close all
aIn = imread("GaosiFilter.jpg");
static = [3,7,11];
stMax = 11;

%取不同的st值(掩模版大小)进行滤波
a1 = AdaMedFilter(aIn,static(1),stMax);
a2 = AdaMedFilter(aIn,static(2),stMax);
a3 = AdaMedFilter(aIn,static(3),stMax);

%对滤波后图片a1进行均值滤波以消除图片轮廓的“毛刺”
a1Ave = AverageFilter(a1,5);
figure,imshow(a1Ave,[])

%反复进行滤波3次
a12 = AdaMedFilter(a1,static(1),stMax);
a13 = AdaMedFilter(a12,static(1),stMax);
a14 = AdaMedFilter(a13,static(1),stMax);
a15 = AdaMedFilter(a14,static(1),stMax);

figure,imshow(aIn,[])
figure,imshow(a1,[])
figure,imshow(a2,[])
figure,imshow(a3,[])

figure,imshow(a1,[])
figure,imshow(a12,[])
figure,imshow(a13,[])
figure,imshow(a14,[])
figure,imshow(a15,[])

%对比1次滤波和5次滤波的剖线差别
figure,hold on;
plot(a1(220,:),'r')
plot(a15(220,:),'b')

二、自适应中值滤波(图片)

1、输入的噪声图像

在这里插入图片描述

2、当st = 3,stmax = 11时输出的滤波后图像

在这里插入图片描述

3、分析

中值滤波对胡椒噪声和盐噪声滤波效果特别好,但是自适应保边中值滤波会让滤波后图片的边缘出现“毛刺”,这个时候我们可以采用均值滤波,以图片稍微变模糊一些的代价将边缘的毛刺消除,如下图:

在这里插入图片描述

三、st的不同对滤波效果的影响

1、st = 3

在这里插入图片描述

2、st = 7

在这里插入图片描述

3、st = 11

在这里插入图片描述

4、结论

​ 随着st(掩模版大小)的增大,滤波效果并没有变得更好,甚至会让原本清晰的图片边缘变得更模糊。

四、探究对图像重复进行滤波多次对滤波效果的影响

1、滤波一次图片

在这里插入图片描述

2、滤波五次图片

在这里插入图片描述

3、对比一次滤波的剖线和五次滤波的剖线

在这里插入图片描述

说明:

蓝色线条是“5次滤波”图片的剖线;红色线条是“1次滤波”图片的剖线

4、结论

​ 从图片上看,一次滤波和五次滤波效果差别不大,但是从剖线上看,很明显的感知到,对于图片平滑部位,一次滤波和五次滤波效果相差无几,但是对于图像急剧变化的部分,很明显的是五次滤波后的图像线条更加的平滑,变化更加均匀!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

matlab 自写 自适应中值滤波 matlab自适应中值滤波算法 的相关文章

  • 帮助我理解FFT函数(Matlab)

    1 除了负频率之外 FFT 函数提供的最小频率是多少 是零吗 2 如果它为零 我们如何在对数刻度上绘制零 3 结果总是对称的 或者只是看起来是对称的 4 如果我使用abs fft y 来比较2个信号 我是否会失去一些准确性 1 除了负频率之
  • 轴标注问题

    通过运行我编写的以下 matlab 函数 可以互换图中的 x 轴和 y 轴 谁能告诉我问题出在哪里或者帮我解决它吗 预先感谢您的任何帮助 function axislabeling n x 1 1 n y 1 1 n z zeros n n
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • MATLAB parfor 和 C++ 类 mex 包装器(需要复制构造函数?)

    我正在尝试使用概述的方法将 C 类包装在 matlab mex 包装器中here http www mathworks com matlabcentral newsreader view thread 278243 基本上 我有一个初始化
  • 考虑预分配速度[重复]

    这个问题在这里已经有答案了 我正在做以下事情 for i 1 m index 0 for j 1 n index index values i j 2 j 1 if j 1 symbol chip chip values index 1 e
  • 在 Pari-GP 中嵌套特定递归

    每个人 我最初在 Stackexchange 上发布了类似的问题 它已移至此处 可以在链接中找到 在 Matlab 中声明函数递归序列 https stackoverflow com questions 67146061 declaring
  • MATLAB问题:在图块中引用变量的值[重复]

    这个问题在这里已经有答案了 可能的重复 matlab 绘图标题中的变量 https stackoverflow com questions 5629458 matlab variable in plot title 我想在图中引用 m 文件
  • 用于读取csv写入数组的c++程序;然后操作并打印到文本文件中(已经用 matlab 编写)

    我想知道是否有人可以帮助我 我正在尝试构建一个程序 从 csv 文件中读取大小未知的浮点数大数据块 我已经在 MATLAB 中编写了此代码 但想要编译和分发此代码 因此转向 C 我只是在学习并尝试阅读本文以开始 7 5 19892 4 23
  • matlab中简单正弦波的傅里叶变换

    我尝试显示简单正弦波的频谱 因为我们知道具有固定频率的单个正弦波必须在其频谱中出现峰值我编写了这段代码 但我无法得到这个峰值我的代码中有什么问题 clc nsteps 200 number of signal elements in tim
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • Matlab 错误:()-索引必须出现在索引表达式的最后

    我有这段代码 想要在制表符分隔的 txt 文件中写入一个数组 fid fopen oo txt wt for x 1 length s fprintf fid s t n s x 1 end fclose fid 但我收到此错误 Error
  • MATLAB 图形渲染:OpenGL 与 Painters?

    当谈到使用哪个渲染器来处理 MATLAB 图形或何时它很重要时 我一无所知 但我遇到过某些示例 其中does matter plot 0 0 ko markersize 50 linewidth 8 set gcf renderer ope
  • matlab 中的 for 或 while 循环

    我刚刚开始在编程课的 matlab 中使用 for 循环 基本的东西对我来说很好 但是我被要求 使用循环创建一个 3 x 5 矩阵 其中每个元素的值是其行号其列号除以行号和列号之和的幂 例如元素 2 3 的值为 2 3 2 3 1 6 那么
  • 在 Matlab 中将绘图从高斯混合变换为均匀分布

    考虑以下抽签2x1Matlab 中的向量 其概率分布是两个高斯分量的混合 P 10 3 number draws v 1 First component mu a 0 0 5 sigma a v 0 0 v Second component
  • 通过 h5py 将 matlab v7.3 文件读入 python numpy 数组列表

    我知道以前已经有人问过这个问题 但在我看来 仍然没有答案可以解释正在发生的事情 并且不适用于我的情况 我有一个 matlab v7 3 文件 其结构如下 gt rank lt 1x454 cell gt gt each element is
  • 有没有办法在 MATLAB 中查看 pcode 文件 (.p) 的源代码?

    有没有办法在 MATLAB 中打开 pcode 文件 p 如果 开放 是指edit 那么当然不是 pcode 中的 p 代表 受保护 其主要设计目标是在保护其源代码的同时部署功能组件 如果 开放 是指run 那么当然是的 引用手册 http
  • 如何将条形图的 XtickLabels 向左移动?

    我目前正在尝试创建频率直方图 为此 我必须创建一个条形图 条形图之间没有空格 然而 这集中于XTickLabels在酒吧的中间 由于它是一个直方图 我希望数值位于每个条形之间的线上 以便它可以直观地指示间隔 本质上 我需要将所有刻度标签移至
  • 在 3d 空间中的两个平面之间进行插值

    我正在开发一种工具 可以让您在 3D 体积 上圈出 包围事物 我想通过标记 切片 1 和 3 并从该信息 填充 切片 2 来节省时间 两个简单的解决方案是 1 slice2 slice1 AND slice3 gets the overla
  • Matlab:掩码/创建一个知道其原点且具有一定半径的圆形 roi

    只是一个简单的问题 我有一张图像 并且提取了某个点 特征 我知道每个帧中该点的坐标 说 x1 和 y1 我需要一个圆形 ROI 形式 该点在图像上具有我选择的半径 我尝试了 impoly 和 roipoly 当我知道图像中的要点时 不知道如

随机推荐

  • Ubuntu软件安装Ubuntu Software突然无法启动以及安装残留存在Install Release图标

    文章目录 背景Ubuntu默认的Linux内核无法启动Pycharm加载缓慢问题Ubuntu Software安装的软件无法打开 xff0c 即便是Ubuntu Software也无法打开 结果安装Ubuntu系统之后的残留 背景 之前在U
  • vue使用lottie web插件渲染动画

    1 先安装相应的插件 npm install lottie web save 2 引入插件 我这里是局部引入的 import lottieWeb from 39 lottie web 39 3 使用 xff0c 整体代码如下 xff0c 我
  • Apache 配置禁止IP地址访问,只允许使用域名的方式访问

    配置过程 提前安装好httpd服务器 正常IP地址访问效果 编辑主配置文件 在最后面添加如下信息即可 lt VirtualHost 80 gt DocumentRoot var www html error ServerName 192 1
  • 删掉启动分区进不了系统,复活办法(win10)

    删掉EFI启动分区进不了系统可以这样复活 xff08 win10 xff09 一 复活流程1 u盘制作启动盘2 创建efi分区 二 可能遇到的其他问题 一 复活流程 1 u盘制作启动盘 gt 链接直达 gt gt xff1a win10官方
  • 谈谈你对 多线程 的理解........

    目录 一 认识线程 xff1a xff08 1 xff09 线程和进程的区别 xff1a xff08 面试 xff09 xff08 2 xff09 线程创建 xff1a 二 Thread类及常见方法 xff1a xff08 1 xff09
  • GreenDao和Room

    GreenDao和Room比较 一个小测试insert 增select 查询所有update 修改同位置一条数据delete 删除同位置一条数据写了个kotlin的Room测了下 看如下结果总结 一个小测试 GreenDao版本 imple
  • Datawhale数据分析第一章第一节:数据载入及初步观察

    复习 这门课程得主要目的是通过真实的数据 xff0c 以实战的方式了解数据分析的流程和熟悉数据分析python的基本操作 知道了课程的目的之后 xff0c 我们接下来我们要正式的开始数据分析的实战教学 xff0c 完成kaggle上泰坦尼克
  • VsCode使用相关

    1 解决VsCode控制条使用powershell问题 xff1a set ExecutionPolicy RemoteSigned 2 解决使用yarn安装报版本依赖问题 可升级依赖或忽略 yarn install ignore engi
  • python之Tkinter使用详解

    一 前言 1 1 Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块 Tkinter模块 Tk 接口 是Python的标准Tk GUI工具包的接口 作为 python 特定的GUI界面 xff0c 是一个图像
  • 实现使用libevent库创建服务器连接多个客户端并实现数据互发

    需要的头文件包含c库 Unix系统库和envent事件库 include lt sys types h gt include lt sys socket h gt include lt netinet in h gt include lt
  • 基于libevent库实现http-sever-restful-API

    文章目录 一 环境搭建 xff1a 1 编译libevent 2 1 11 stable2 cJSON库 二 makefile三 code四 测试测试结果如下 xff1a 一 环境搭建 xff1a 参考 xff1a https blog c
  • vscode通过跳板机连接远程服务器(亲测可用)

    一 windows用户需要先配置好本地的Remote SSH相关服务并开启服务 二 打开VS Code xff0c 在扩展中搜索 34 Remote SSH 34 并安装 三 ctrl 43 shift 43 p呼出控制面板搜索remote
  • 如何抓取log

    一 Catcher log Catcher是 MTK 提供的功能机上一个功能比较强大的一个 log 工具 Catcher log 一般情况下使我们使用起来最多也最方便的一种 xff0c 不用跳线 xff0c 连接上 USB 就行 Catch
  • android studio (record audio)一些问题记录

    2022 03 29 19 23 16 253 1659 1706 E Request requires android permission RECORD AUDIO 2022 03 29 19 23 16 253 1659 1706 E
  • 向量的点乘和叉乘

    向量是由n个实数组成的一个n行1列 xff08 n1 xff09 或一个1行n列 xff08 1n xff09 的有序数组 一 向量的点乘 也叫向量的内积 数量积 xff0c 对两个向量执行点乘运算 xff0c 就是对这两个向量对应位一一相
  • C语言 生产者消费者问题

    目录 生产者消费者问题算法设计实现源程序测试日志总结 生产者消费者问题 算法设计 实现 1 编写所需头文件 span class token macro property span class token directive keyword
  • 操作系统-进程同步:生产者-消费者问题

    文章目录 进程同步 xff1a 生产者 消费者问题问题描述实验环境输入输出测试数据实验设计数据结构系统框架图流程图 实验结果与分析结果展示与描述结果分析总结 源代码 进程同步 xff1a 生产者 消费者问题 问题描述 以生产者 消费者模型为
  • 《动手学习深度学习》预备知识——自动求导

    自动微分 正如我们在 numref sec calculus中所说的那样 xff0c 求导是几乎所有深度学习优化算法的关键步骤 虽然求导的计算很简单 xff0c 只需要一些基本的微积分 但对于复杂的模型 xff0c 手工进行更新是一件很痛苦
  • Ubuntu—root用户权限设置

    Ubuntu root用户权限设置 本人ubuntu版本 xff1a 18 04 xff08 其他版本设置步骤相同 xff09 Step1 获得临时root权限 xff08 1 xff09 terminal中输入命令 xff1a sudo
  • matlab 自写 自适应中值滤波 matlab自适应中值滤波算法

    一 自适应中值滤波 xff08 代码 xff09 function aOut 61 stPlus aIn f1 f2 st stMax 这仅仅是 AdaMedFilter 自适应中值滤波函数 的子函数 这仅仅是一个附属函数 功能片段 xff