在处理数据的时候,一般会进行数据拟合,这时候免不了会有噪点,从而造成图像上的“飞点”。幸好Matlab自带一个平滑函数smooth,笔者也是最近才晓得,做点笔记。


在Matlab Command Windows 中输入:

doc smooth

弹出来帮助文档,下面跟着帮助文档,记点有用的。

一、预备知识

有关平滑的算法又叫滤波算法,滤波是什么意思?百度百科中写道:滤波(Wave filtering)是将信号中特定波段频率滤除的操作,是抑制和防止干扰的一项重要措施,滤波分为经典滤波和现代滤波。“滤”这个字让我想起了老妈在家里用的面粉筛

(图片来源于网络)就是过滤杂质的。把噪点想象成“杂质”,那么滤波的意思就显而易见了。

1、滑动平均滤波


上图简单示意了滑动平均的思想,需要注意以下几点:

  • 待处理的数据是一个一行或一列的向量,若不是,则将其看作是(顺序按存储顺序,matlab中)
  • 窗口大小需是奇数,待处理的是中间那个数据
  • 边缘数据,凑不够窗口大小个数的数据,能凑几个凑几个。

若窗口大小为5,则公式如下:

yy(1) = y(1)
yy(2) = (y(1) + y(2) + y(3))/3
yy(3) = (y(1) + y(2) + y(3) + y(4) + y(5))/5
yy(4) = (y(2) + y(3) + y(4) + y(5) + y(6))/5
...

2、其他平滑算法

如果理解滑动平均算法的话,其他算法也就好理解了。滑动平均算法可以看作和[1/n 1/n .. 1/n]做卷积(相乘相加),其他算法:

  • 一次:一个一次的卷积函数,自变量为参与数与代求数的距离
  • 二次及多次:卷积函数次数不同而已;值得注意的一点是窗口大小要大于卷积函数次数。
  • 滑动平均算法可以看作是卷积函数是零次(常数)函数,因为里面不涉及自变量(参与数于代求数的距离)或者说自变量次数为0

3、gpuArray

就是将数据存储在GPU上面,可以加快计算效率,笔者曾经看到过一些GPU、CUP方面的知识并做了点总结,读者感兴趣可以看看:

https://blog.csdn.net/Gou_Hailong/article/details/113308630

如果想使用gpuArray的话,需安装支持它的相应matlab版本。
有关GPU的知识,笔者了解还尚浅,暂不能做详细的笔记

二、代码

1、语法

yy = smooth(y)
yy = smooth(y,span)
yy = smooth(y,method)
yy = smooth(y,span,method)
yy = smooth(y,'sgolay',degree)
yy = smooth(y,span,'sgolay',degree)
yy = smooth(x,y,___)
gpuarrayYY = smooth(gpuarrayY,___)
gpuarrayYY = smooth(gpuarrayX,gpuarrayY,___)
  • yy = smooth(y) 滑动平均,窗口为5,得到的结果是一个列向量。
  • yy = smooth(y,span) span 控制窗口大小
  • yy = smooth(y,method) 指定平滑算法,平滑算法有好多种,下面有简介。
  • yy = smooth(y,span,method) 指定窗口大小+平滑算法
  • yy = smooth(y,‘sgolay’,degree) 指定多项式平滑算法+多项式次数,次数要小于窗口大小,因为确定一个n次多项式,需要n+1个值,至少需要n+1组数据。
  • yy = smooth(y,span,‘sgolay’,degree) 指定窗口大小+多项式平滑算法+多项式次数
  • yy = smooth(x,y,___) 多一个自变量x,x的含义见于下面,横线表示选项可取上面任意一种。
  • gpuarrayYY = smooth(gpuarrayX,gpuarrayY,___) 于上边的类似,只是使用的数据为gpuArray类型的数据而已,其他于上面相同。
  • span的取值可以是整数或是(0,1)范围内的小数,代表所有数据的百分比,0.1代表10%
  • x为响应数据y的自变量,指定为列向量。 如果不提供x,则要求x的方法假定x = 1:length(y)。 当y未排序或均匀分布时,请指定x数据。 如果x不均匀且未指定方法,则使用lowess。如果指定要求对x进行排序的平滑方法,则该函数会自动对x数据进行排序。
  • 仅当使用默认方法“滑动平均”时,才建议将gpuArray x和y输入与平滑函数一起使用。 将GPU数据与其他方法一起使用不会提供任何性能优势。

2、Method

Method 描述
moving(默认) 滑动平均平滑,滤波系数等于窗口大小的倒数
lowess 局部加权线性回归平滑,使用加权线性最小二乘法和一级多项式模型进行局部回归
loess 局部加权二次回归平滑,使用加权线性最小二乘法和二次多项式模型进行局部回归
sgolay 多项式平滑,Savitzky-Golay滤波器。 广义移动平均,其滤波器系数由未加权的线性最小二乘回归和指定度数的多项式模型确定(默认值为2)。 该方法可以接受不一致的预测变量数据。
rlowess 鲁棒局部加权线性回归平滑,“ lowess”的加强版,可为回归中的异常值分配较低的权重。 该方法将零权重分配给六个均值绝对偏差之外的数据。
rloess 鲁棒局部加权二次回归平滑,“loess”的加强版,在回归中将较低的权重分配给离群值。 该方法将零权重分配给六个均值绝对偏差之外的数据。

3、例子

x = (0:0.1:15)';
y = sin(x) + 0.5*(rand(size(x))-0.5);
y([90,110]) = 3;yy1 = smooth(x,y,0.1,'loess');
yy2 = smooth(x,y,0.1,'rloess');subplot(2,1,1)
plot(x,y,'b.',x,yy1,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''loess''',...'Location','NW')subplot(2,1,2)
plot(x,y,'b.',x,yy2,'r-')
set(gca,'YLim',[-1.5 3.5])
legend('Original data','Smoothed data using ''rloess''',...'Location','NW')


可以看出rloess效果要好一些,一般情况下,可以无脑使用:

b=smooth(a,'rloess');
b=smooth(a,'rlowess');

三、自编函数

matlab自带的平滑算法会改变原始数据,但是有时候笔者只想将一组数据中的离群数给剔除,不改变其他原始数据,所以笔者编写了个函数,如下所示:

1、V1.0

不考虑前后向量长度的话,一句话就搞定:

c=b(abs(b-mean(b))<= 3*std(b));

2、V2.0

要保持前后向量长度不变的话:

% rm data which > 3*std once
function data=rmNo(mat)
m=nanmean(mat);
s=std(mat);
dat=smooth(mat,'rlowess');
ind=find(abs(mat-m)>3*s);
data=mat;
for i=inddata(i)=dat(i);
end
end

3、V3.0

比如现在我有一组数据,经历过一次消噪,噪声水平设置标准为大于3倍标准差。消噪之后的数据标准差发生了变化,所以之前有可能不是噪点的数据也会变成噪点。我想把这些噪点给消了,那么就需要一个迭代过程:

% rm data which > 3*std iterate
function data=rmNo1(mat)
count=0;
mat0=mat;
mat1=mat0;
while truem=nanmean(mat0);s=std(mat0);dat=smooth(mat0,'rlowess');ind=find(abs(mat0-m)>3*s);for i=indmat1(i)=dat(i);endcount=count+1;mat0=mat1;if count>5 || length(ind)==0break;end
end
data=mat1;
end

迭代终止条件为:迭代超过5次或前后两次迭代结果相同。

Matlab Smooth函数/丝滑数据相关推荐

  1. matlab smooth原理,Matlab smooth函数原理

    由于项目上要用到平滑一维数组数据,参考Matlab  smooth函数转成c++代码 //x,g均为数组,具体内容略 plot(x,g);hold on,plot(x,smooth(g,50),'r' ...

  2. matlab smooth 函数,matlab中smooth函数平滑处理数据实例

    >>t=linspace(0,2*pi,500)'; %产生一个从0到2*pi的向量,长度500 >> y=100*sin(t); %产生正弦波信号 %产生500行1列的服从N ...

  3. matlab mat2gray函数 对图像数据归一化的理解以及互转

    刚好今天也有需要用三维重建中的深度数据,数据值大于255,自己用matlab可以显示出来,如果直接保存成图片数据都是1,什么都看不到,拿给别人也没有用,于是就想到用mat2gray先将数据进行归一化到 ...

  4. MATLAB smooth函数平滑处理

    smooth(y)可得到平滑处理后的曲线序列y,并且可以迭代使用,多次使用平滑效果更加明显. x = 0:.1:2*pi; y = sin(x) + rand(1,length(x)); figure ...

  5. python如何调用自己写的matlab函数和mat数据

    1. 确保matlab版本和python版本配套 如何不配套,下载一个anaconda,打开anaconda propmt 假如你本来是python3.9 要降级到3.8,打开之后输入: conda ...

  6. 小程序云函数加载数据20条限制 分页更加丝滑

    小程序云函数加载数据20条限制 处理分页加载 云函数无需突破20条.100条的局限,让分页更加丝滑: 首先认识一下,云函数中的 api 方法 代码实现 云函数无需突破20条.100条的局限,让分页更加 ...

  7. matlab数据平滑 smooth函数的python实现

    数据平滑是数据处理中的一种简单且常用的操作,matlab中比较好用的一个函数是smooth函数, 其调用方式为 smoothed_y = smooth(y, window_length, method ...

  8. MATLAB中移动平均滤波器smooth函数的用法

    文章目录 1 smooth的函数原型 2 yy = smooth(y)解析 3 yy = smooth(y,span)解析 4 yy = smooth(y,span,method)解析 5 smoot ...

  9. matlab figure函数_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (六)控件间的数据传递...

    我纠结了两个星期是否要写这一章-最后决定还是要写一章收尾,来解释其中的控件间的数据传递问题. 在前五篇中,如果有童鞋跟上了我的思路或者做完了这样一个gui,会发现还有一个一直避开的遗留问题,就是将歌曲 ...

最新文章

  1. ffpemg扩展 安装php_ThinkSwoole 教程(二)安装
  2. mysql约束建表规范_MySQL 建库建表规范
  3. 【核心API开发】Spark入门教程[3]
  4. 沙雕同事一来公司就把高并发的程序搞崩了,我心态也蹦了!
  5. Android传感器开发详解
  6. Spring框架的设计理念与设计模式分析
  7. pcb结构链表_简单说说链表和一个应用实例
  8. 随想录(从开源or1k看gcc后端移植)
  9. 电脑联网了但不能上网_电脑联网不能用,求助
  10. redis如何实现分布式重入锁
  11. wex5 导入mysql_wex5 sqllite本地数据库的运用
  12. 记Python的一些用法
  13. 今日干货:PDF转Word工具有哪些?
  14. Adobe Photoshop CC 2018之ps色彩范围抠图(☆)
  15. 实现软件GPS的软硬件设计讨论
  16. 使用google map v3 api 开发地图服务
  17. Google网站提交指南
  18. gitchat训练营深度学习入门读书笔记
  19. 2021.11.3SpaceWar
  20. 软工1816 · 团队现场编程实战(抽奖系统)

热门文章

  1. 用Python破解WiFi密码,亲测有效,简直不能太爽了
  2. [WEB_ezeval]
  3. php开发框架symfony,symfony
  4. Symfony CSRF 教程
  5. 保健中的深度学习nlp技术用于决策
  6. pool win10提示bad_Win10出现bad pool header蓝屏怎么修复?
  7. oracle dbms advisor,通过shell定制dbms_advisor.quick_tune
  8. 以太网,令牌网,FDDI,ATM,WLAN的区别
  9. python scrapy爬取豆瓣即将上映电影用邮件定时推送给自己
  10. 2019腾讯产品策划/运营暑期实习生提前批凉凉面经