最近有一个程序需要做一些数据分析,遇见一个求平均值的需求。数据序列由传感器输出类似如下:[10,12,11,25,9,10,9,45,13,12,10,11,78,12,12,13,10,9]。在这个序列中很明显的25,45,78都是要远远大于其他一些数据的,而我们认为3个数据应该是异常数据。如果是求平均值,这三个大数会拉高平均值,会让我们的结果有一定的偏差。如果数据序列很大,个别异常数据不太会影响平均值,但是为了使结果更加准确,我们就需要对这些异常数据进行过滤。

通常我们会使用程序判断滤波的方式来过滤异常数据,比如说先对一个序列求平均值,方差等等,然后对每个数据和平均值或方差的偏差,设置一个阈值,差超过这个阈值就认为是异常数据,然后过滤。当然这个阈值只能是经验值,有时候不一定准确,或当异常数据变成常态的时候,异常数据就不再是异常数据,这时候如果还是使用阈值过滤就会有一些问题。当然程序判断滤波的方式还是适用于一些场景,并且实现比较方便。

在做数据统计,分析以及图像处理中,为了防止噪声对数据结果的影响,除了采用更加科学的采样技术外,我们还要采用一些必要的技术手段对原始数据进行整理、统计。数字滤波技术是最基本的处理方法,它可以剔除数据中的噪声,提高数据的代表性。常用的滤波技术有:程序判断滤波,均值滤波,中值滤波,加权平均,滤波,众数滤波,一阶滞后滤波,移动滤波,复合滤波等。

由于上面例子的需求对平均值这个具体的数字不是要求特别准,只是一个大概的数字,所以我们使用中值滤波的原理来处理。均值滤波或其他方式也可以使用,但就这个例子来说,中值滤波原理的效果会比较好一些。

中值滤波的原理,来自百度,比较容易理解:中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。

对于上面的数字序列,我们使用的方法是,对于每个数据,用它周围邻域一定数量的数据的中值替代。如果我们设置邻域的数量为7。那么对于第一个数据10来说,这个邻域数列就是10左边的3个数字和10后边的3个数字,再加上本身,就是7个数字:[13,10,9,10,12,11,25]。因为10是第1个数字,左边3个就要从数组的最后3个去获取。就像下图标识的次序获取。

那对于第一个数字10来说,邻域就是13,10,9,10,12,11,25。对这个新序列进行排序,取中值。排序后的结果是9,10,10,11,12,13,25。中值就是11。那在原始的数列中第一个数字10,就用11来代替。

再一个例子,对于45来说,邻域就是9,10,9,45,13,12,10。如下图:

同样排序后取中值,那么原始队列中的45,就用10代替。这样就过滤了45。

下面直接上java代码:

public static List getSampleByMedianFilter(List samples)

{

//小于三个就不做了

if(samples == null || samples.size() < 3)

{

return samples;

}

else

{

try

{

//邻域的个数

int medianSampleCount = samples.size() / 2 + 1;

List newSamples = new ArrayList();

for(int i=0;i

{

//定义邻域

List medianSample = new ArrayList();

int count = medianSampleCount;

int step = 1;

//先取左边的,再取右边的

boolean left = true;

medianSample.add(samples.get(i));

while(count-- > 1)

{

int index = 0;

if(left)

{

index = i - step;

if(index < 0)

{

index = samples.size() - Math.abs(index);

}

}

else

{

index = i + step;

if (index >= samples.size())

{

index = index - samples.size();

}

step++;

}

left = !left;

medianSample.add(samples.get(index));

}

//排序

Collections.sort(medianSample);

//取中值

if(medianSampleCount % 2 == 0) //偶数

{

long avg = (medianSample.get(medianSampleCount / 2 - 1) + medianSample.get(medianSampleCount / 2)) / 2;

newSamples.add(avg);

}

else //基数

{

newSamples.add(medianSample.get(medianSampleCount / 2));

}

}

return newSamples;

}

catch(Exception e)

{

e.printStackTrace();

return samples;

}

}

}

测试上面的例子:

List samples = new ArrayList();

samples.add(Long.valueOf(10));

samples.add(Long.valueOf(12));

samples.add(Long.valueOf(11));

samples.add(Long.valueOf(25));

samples.add(Long.valueOf(9));

samples.add(Long.valueOf(10));

samples.add(Long.valueOf(9));

samples.add(Long.valueOf(45));

samples.add(Long.valueOf(13));

samples.add(Long.valueOf(12));

samples.add(Long.valueOf(10));

samples.add(Long.valueOf(11));

samples.add(Long.valueOf(78));

samples.add(Long.valueOf(12));

samples.add(Long.valueOf(12));

samples.add(Long.valueOf(13));

samples.add(Long.valueOf(10));

samples.add(Long.valueOf(9));

List newSamples = algorithmManager.getSampleByMedianFilter(samples);

for(Long l : newSamples)

{

System.out.print(l.longValue() + ",");

}

结果:

从结果可以看出,异常数据25,45和78都已经被过滤掉了。这样再求平均值就会准确一些。

在上面的这个算法中,邻域的个数,和获取的方式都可以变的,并不是固定的方式,大家可以选择不同的阈值或者邻域获取方式,邻域的个数也不是越多也好,看测试结果而定。

算法比较简单,给大家提供了一个过滤异常数据的思路,大家可以尝试其他一些算法,了解各种算法的优劣和适用场景,在实际项目中使用。

动态二维码中值滤波处理_使用中值滤波原理过滤异常数据相关推荐

  1. uniapp中qrcode生成二维码后传的参数不见了_阿虚教你制作动态二维码,超详细教程!

    这篇教程很早之前就答应几个粉丝要写,拖的有点久了. 内容比较多,先上个目录 阿虚的教程会迟到,但永远不会缺席.hahahahhaha... 一. 先说一下今天要教的内容 ʕ•̫͡•ོʔ•̫͡•ཻʕ•̫ ...

  2. 如何用python制作动态二维码,提升表白成功率?

    来源:凹凸数据 本文约1000字,建议阅读5分钟. 本文教你用python制作动态二维码,助你表白成功! 关注数据派THU(DatapiTHU)后台回复"20200520"获取完整 ...

  3. python小工具myqr生成动态二维码

    python小工具myqr生成动态二维码 (一)安装 (二)使用 (一)安装 命令: pip install myqr 安装完成后,就可以在命令行中输入 myqr 查看下使用帮助: myqr --he ...

  4. 使用Spyder生成动态二维码遇到的问题 ImportError 、ValueError 、OSError

    看到各种各样的动态二维码真的是超级心动,于是打算自己用python(我使用的是Spyder)做一个属于自己的动态二维码,结果,踩了如下这些坑. 代码写完以后发现没有 MyQR 模块 原因及解决方法: ...

  5. Python生成动态二维码,运用神库:qrcode

    一.介绍 1.1 二维码 二维码又称二维条码,常见的二维码为 QR Code,QR 全称 Quick Response.是一个近几年来移动设备上超流行的一种编码方式,在现在的生活中二维码随处可见.我们 ...

  6. python myqr制作二维码生成器_用Python生成动态二维码,只要5行代码,拥有你的个性二维码!...

    原标题:用Python生成动态二维码,只要5行代码,拥有你的个性二维码! 前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. P ...

  7. 用Python制作动态二维码,一行代码就做到了

    如何做到用一行代码实现动态二维码的制作? 用法比较简单,直接通过pip安装即可 pip3 install myqr 安装完成之后,就可以生成你想要的二维码了.对!就是这么简单- 普通的二维码 直接执行 ...

  8. 用Python制作动态二维码,真的只需要一行代码!

    来源 | Python3X(ID:python3xxx) 在最大的同性交友社区GitHub上发现了一个比较有意思的项目,无论你是什么操作系统,只需要一行代码就可以很方便的生成二维码.包括普通二维码.艺 ...

  9. STM32开发板动态二维码显示

    业务场景需要扫码互动,咨询了小熊派官方,并没有提供案例,之前出厂时屏幕可以显示的二维码只是一个固定图片,显然不适合.到网上找了一些资料,解说的不算完整,不能直接应用.根据这些前人的提醒,自己迁移一份. ...

最新文章

  1. Android SurfaceView 黑背景的处理方法
  2. 比特币耶稣Roger Ver:比特币现金是比特币扩容问题的答案
  3. 腾讯的电商,在东南亚击败了阿里巴巴
  4. char类型的实参与const char类型的形参不兼容_C++干货系列——顶层const和底层const...
  5. 提高篇 第一部分 基础算法 第4章 广搜的优化技巧
  6. 计算机二级python什么水平_计算机二级python好过吗 通过率是多少
  7. Windows上配置iPhone开发环境
  8. J2EE基础篇——十三个规范
  9. 上海计算机一级选择题库,上海计算机一级选择题
  10. 阿里云首席安全研究员吴翰清:我人生的两次选择
  11. 网站性能优化三大策略
  12. win7磁盘管理分区,改变页面文件卷,删除卷就由灰变黑了!
  13. royal tsx连接闪退_Mac上使用Royal TSX链接服务器
  14. 在iOS应用中跳转到淘宝或天猫客户端商品详情页
  15. 世界上最大的计算机硬盘,全球我最大 忆捷A600 2TB移动硬盘评测
  16. mysql中varchar与oracle中varchar2区别
  17. J2EE框架设计技术分析
  18. 用python-OpenCV做一个魔方墙找茬程序(3D视眼训练) 版本2.0:加入倒计时功能
  19. BCGControlBar Pro for MFC v13.3现已发布:着重改进图表、属性/编辑控件等,打造全面、易上手的MFC库
  20. Linux密码生成工具crunch使用攻略

热门文章

  1. 无线网服务器mac是什么原因,为何mac连上wifi却上不了网
  2. 2005考研阅读Text4翻译
  3. VMware虚拟网卡消失!!!!
  4. dropzone java实例_Java实现拖拽文件上传dropzone.js的简单使用示例代码
  5. 我们如何把pdf转cad简单操作呢?
  6. 低配Mc c++ exe下载
  7. 陶瓷天线是什么,它的工作原理是怎样的?
  8. 一年半前端工作经验试水杭州:我是如何拿下网易、阿里和滴滴 offer 的
  9. 又一款社交软件黑马,微信缺的它都有!
  10. 《计算机科学导论》一导读