- 外文名
- Wave filtering
- 用 于
- 抑制和防止干扰
- 分 类
- 经典滤波和现代滤波
- 中文名
- 滤波
- 实 质
- 将信号中特定波段频率滤除的操作
-
滤波
2019-12-04 18:35:31滤波主要分为两种,时域和频域滤波。时域滤波又可分为平均值、中值滤波、卡尔曼滤波。频域滤波又可分为低通、高通、带通、带阻滤波。本文介绍使用python实现一维数据低通滤波: import numpy as np import ...滤波主要分为两种,时域和频域滤波。时域滤波又可分为平均值、中值滤波、卡尔曼滤波。频域滤波又可分为低通、高通、带通、带阻滤波。本文介绍使用python实现一维数据低通滤波:
import numpy as np
import matplotlib.pyplot as pltx = np.arange(0,10*np.pi,0.01)
y = np.sin(x)plt.plot(x,y)
plt.show()原始数据如上。
加入噪声。
s = np.random.random(3142)*0.2
yy = s+y
plt.plot(x[0:628],yy[0:628])
plt.show()加入噪声的数据如上。
使用scipy库中的signal函数进行滤波。
from scipy import signal
b,a = signal.butter(8,0.01,'lowpass') 8为滤波器阶数,0.01为滤波器截止频率,lowpass为低通
filldata = signal.filtfilt(b,a,yy)plt.plot(x[0:628],filldata[0:628])
plt.show() -
opencv 滤波 方框滤波 均值滤波 高斯滤波 中值滤波 双边滤波
2020-05-29 18:08:59线性滤波1.1. 方框滤波demo1.2. 均值滤波demo1.3. 高斯滤波demo二. 非线性滤波2.1. 中值滤波demo2.2. 双边滤波demo结构体参考 一. 线性滤波 1.1. 方框滤波 方框滤波是所有滤波器中最简单的一种滤波方式。每一个...一. 线性滤波
1.1. 方框滤波
方框滤波是所有滤波器中最简单的一种滤波方式。每一个输出像素的是内核邻域像素值的平均值得到。
通用的滤波kernel如下:
这里是一个长宽分别为Kwidth和Kheight的窗口函数,在此区域内邻域中像素值叠加求平均即可求出位于kernel中心点像素的像素值。
/ ** @brief使用框过滤器模糊图像。 该函数使用内核对图像进行平滑处理: 未归一化的框式滤波器可用于计算每个像素邻域的各种积分特征, 例如图像导数的协方差矩阵(用于密集光流算法等)。 如果需要在可变大小的窗口上计算像素总和,请使用#integral。 @param src输入图像。 @param dst输出图像的大小和类型与src相同。 @param ddepth输出图像深度(使用src.depth()时为-1)。 @param ksize模糊内核的大小。一般Size(w,h)来表示内核的大小。 @param 锚点(即被平滑的那个点);默认值Point(-1,-1)表示锚点位于内核中心。 @param normalize标志,指定是否通过内核区域对其进行规范化。 @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes * / CV_EXPORTS_W void boxFilter( InputArray src, OutputArray dst, int ddepth, Size ksize, Point anchor = Point(-1,-1), bool normalize = true, int borderType = BORDER_DEFAULT );
boxFilter()函数方框滤波所用的核为:
其中:
当normalize=true的时候,方框滤波就变成了下面要说的的均值滤波。
demo
int MPT_test_boxFilter() { cv::Mat dst1, dst2, dst3, dst4; cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR); cv::boxFilter(src, dst1, -1, cv::Size(5, 5), cv::Point(-1, -1), true); cv::namedWindow("src", 0); cv::imshow("src", src); cv::namedWindow("方框滤波", 0); cv::imshow("方框滤波", dst1); cv::waitKey(0); return 0; }
1.2. 均值滤波
均值滤波的原理非常简单,就是输出图像的每一个像素是核窗口内输入图像对应像素的像素的平均值( 所有像素加权系数相等),其实说白了它就是归一化后的方框滤波。
但是均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
/ ** @brief使用标准化框过滤器模糊图像。 该函数使用内核对图像进行平滑处理: @param src输入图像; 它可以具有任意数量的通道,这些通道是独立处理的,但是深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。 @param dst输出图像的大小和类型与src相同。 @param ksize模糊内核大小。 @param锚点; 默认值Point(-1,-1)表示锚点位于内核中央。 @param borderType用于推断图像外部像素的边框模式,请参阅#BorderTypes */ CV_EXPORTS_W void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderType = BORDER_DEFAULT );
demo
//均值滤波 int MPT_test_blur() { cv::Mat dst; cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR); cv::blur(src, dst, cv::Size(5, 5)); cv::namedWindow("src", 0); cv::imshow("src", src); cv::namedWindow("均值滤波", 0); cv::imshow("均值滤波", dst); cv::waitKey(0); return 0; }
1.3. 高斯滤波
图像的高斯模糊过程就是图像与服从二维正态分布的卷积核做卷积。由于正态分布又叫作高斯分布,所以这项技术就叫作高斯模糊。
图像与圆形卷积核做卷积将会生成更加精确的焦外成像效果。由于高斯函数的傅立叶变换是另外一个高斯函数,所以高斯模糊对于图像来说就是一个低通滤波操作。
高斯滤波器是一类根据高斯函数的形状来选择权值的线性平滑滤波器。高斯平滑滤波器对于抑制服从正态分布的噪声非常有效。一维零均值高斯函数为:
其中,高斯分布参数σ决定了高斯函数的宽度。对于二维图像来说,常用二维零均值离散高斯函数作平滑滤波器。
二维高斯函数为:/ ** @brief使用高斯滤镜模糊图像。 该函数将源图像与指定的高斯内核进行卷积。就地过滤是 支持的。 @param src输入图像;图像可以具有任意数量的经过处理的通道 但深度应为CV_8U,CV_16U,CV_16S,CV_32F或CV_64F。 @param dst输出图像的大小和类型与src相同。 @param ksize高斯内核大小。 ksize.width和ksize.height可以不同,但它们都必须为正数和奇数。或者,它们可以为零,然后根据sigma计算得出。 @param sigmaX X方向上的高斯核标准偏差。 @param sigmaY Y方向上的高斯核标准差;如果sigmaY为零,则将其设置为等于sigmaX;如果两个sigmas为零,则分别从ksize.width和ksize.height计算得出(有关详细信息,请参见#getGaussianKernel);为了完全控制结果,而不考虑将来可能对所有这些语义的修改,建议指定所有ksize,sigmaX和sigmaY。 @param borderType像素外推方法,请参见#BorderTypes */
CV_EXPORTS_W void GaussianBlur( InputArray src, OutputArray dst, Size ksize, double sigmaX, double sigmaY = 0, int borderType = BORDER_DEFAULT );
demo
//高斯滤波 int MPT_test_GaussianBlur() { cv::Mat dst; cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR); cv::GaussianBlur(src, dst, cv::Size(5, 5), 0, 0); cv::namedWindow("src", 0); cv::imshow("src", src); cv::namedWindow("高斯滤波", 0); cv::imshow("高斯滤波", dst); cv::waitKey(0); return 0; }
二. 非线性滤波
非线性滤波器的原始数据与滤波结果是一种逻辑关系,即通过比较一定邻域内的灰度值大小来实现的。
2.1. 中值滤波
中值滤波原理:
简言之中值滤波就是把函数框(如图中的3 X 3)内的灰度值按顺序排列,然后中值取代函数框中心的灰度值。所以一般采用奇数点的邻域来计算中值,但如果像素点数为偶数,中值就取排序像素中间两点的平均值。
中值滤波在一定的条件下可以克服常见线性滤波器如方框滤波器、均值滤波等带来的图像细节模糊,而且对滤除脉冲干扰及图像扫描噪声非常有效,也常用于保护边缘信息, 保存边缘的特性使它在不希望出现边缘模糊的场合也很有用,是非常经典的平滑噪声处理方法。
但是中值滤波的缺点也很明显,因为要进行排序操作,所以处理的时间长,是均值滤波的5倍以上。
/ ** @brief使用中值滤镜模糊图像。 @note中值过滤器内部使用#BORDER_REPLICATE来处理边框像素,请参阅#BorderTypes @param src输入1、3或4通道图像;当ksize为3或5时, 图像深度应为CV_8U,CV_16U或CV_32F,对于较大的光圈,只能为CV_8U。 @param dst目标数组,其大小和类型与src相同。 @param ksize孔径线性大小; 它必须是奇数且大于1,例如:3、5、7 ... */ CV_EXPORTS_W void medianBlur( InputArray src, OutputArray dst, int ksize );
demo
//中值滤波 int MPT_test_medianBlur() { cv::Mat dst; cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR); cv::medianBlur(src, dst, 9); cv::namedWindow("src", 0); cv::imshow("src", src); cv::namedWindow("中值滤波", 0); cv::imshow("中值滤波", dst); cv::waitKey(0); return 0; }
2.2. 双边滤波
双边滤波(Bilateral filter)是一种非线性的滤波方法,是结合图像的空间邻近度和像素值相似度的一种折衷处理,同时考虑空域信息和灰度相似性,达到保边去噪的目的。具有简单、非迭代、局部的特点。
双边滤波器的好处是可以做边缘保存(edge preserving),一般用高斯滤波去降噪,会较明显地模糊边缘,对于高频细节的保护效果并不明显。双边滤波器顾名思义比高斯滤波多了一个高斯方差sigma-d,它是基于空间分布的高斯滤波函数,所以在边缘附近,离的较远的像素不会太多影响到边缘上的像素值,这样就保证了边缘附近像素值的保存。但是由于保存了过多的高频信息,对于彩色图像里的高频噪声,双边滤波器不能够干净的滤掉,只能够对于低频信息进行较好的滤波。
下图是双边滤波的原理示意图:
在双边滤波器中,输出像素的值依赖于邻域像素值的加权值组合:
而加权系数w(i,j,k,l)取决于空域核和值域核的乘积。
(i,j),(k,l)分别指两个像素点的坐标。
其中空域核表示如下(如图):值域核表示为:
两者相乘后,就会产生依赖于数据的双边滤波权重函数:
d函数是根据像素距离选择权重,距离越近权重越大,这一点和方框滤波,高斯滤波方式相同。而r函数则是根据像素的差异来分配权值。如果两个像素值越接近,即使相距较远,也比差异大而距离近的像素点权重大。正是r函数的作用,使得边缘,即相距近但差异大的像素点的特性得以保留。
/ ** @brief将双边过滤器应用于图像。 可以在保持边缘相当清晰的同时很好地减少不必要的噪音。但是,与大多数过滤器相比,它非常慢。 _Sigma values_:为简单起见,您可以将2个sigma值设置为相同。如果它们很小(<10),则滤镜效果不大; 而如果它们很大(> 150),它们将具有非常大的效果。效果强,使图像看起来“卡通化”。 _Filter size_:大型滤镜(d > 5)非常慢,因此建议实时使用d = 5 应用程序,对于需要重噪声过滤的脱机应用程序,d = 9。 @param src 源8位或浮点,1通道或3通道图像。 @param dst 与src大小和类型相同的目标映像。 @param d 滤波期间使用的每个像素邻域的直径。如果它不是正值, 则从sigmaSpace计算得出。 @param sigmaColor 在色彩空间中过滤sigma。 这个参数的值越大,就表明该像素邻域内有更宽广的颜色会被混合到一起,产生较大的半相等颜色区域 @param sigmaSpace 在坐标空间中过滤sigma。 该参数的值越大,表示越远的像素就会相互影响, 只要它们的颜色足够接近即可(请参见sigmaColor)。 当d > 0时,它指定邻域大小,而不考虑sigmaSpace。 否则,d为与sigmaSpace成比例。 @param borderType 用于推断图像外部像素的边框模式,请参阅#BorderTypes */ CV_EXPORTS_W void bilateralFilter( InputArray src, OutputArray dst, int d, double sigmaColor, double sigmaSpace, int borderType = BORDER_DEFAULT );
demo
//双边滤波 int MPT_test_bilateralFilter() { cv::Mat dst; cv::Mat src = cv::imread("../image/beauty.jpg", cv::IMREAD_COLOR); cv::bilateralFilter(src, dst, 25, 10.0, 25); cv::namedWindow("src", 0); cv::imshow("src", src); cv::namedWindow("双边滤波", 0); cv::imshow("双边滤波", dst); cv::waitKey(0); return 0; }
结构体参考
enum BorderTypes { BORDER_CONSTANT = 0, //!< `iiiiii|abcdefgh|iiiiiii` with some specified `i` BORDER_REPLICATE = 1, //!< `aaaaaa|abcdefgh|hhhhhhh` BORDER_REFLECT = 2, //!< `fedcba|abcdefgh|hgfedcb` BORDER_WRAP = 3, //!< `cdefgh|abcdefgh|abcdefg` BORDER_REFLECT_101 = 4, //!< `gfedcb|abcdefgh|gfedcba` BORDER_TRANSPARENT = 5, //!< `uvwxyz|abcdefgh|ijklmno` BORDER_REFLECT101 = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 BORDER_DEFAULT = BORDER_REFLECT_101, //!< same as BORDER_REFLECT_101 BORDER_ISOLATED = 16 //!< do not look outside of ROI };
-
基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比
2018-01-04 14:08:25基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比 1.背景知识 中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值. 中值滤波是基于排序...基于MATLAB图像处理的中值滤波、均值滤波以及高斯滤波的实现与对比
1. 背景知识
中值滤波法是一种非线性平滑技术,它将每一像素点的灰度值设置为该点某邻域窗口内的所有像素点灰度值的中值.
中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。
方法是用某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为3*3,5*5区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。
2
4
8
1
3
9
5
7
6
g(x,y)=med{f(x-k,y-l),(k,l∈W)}
g =med[2,4,8;1,3,9;5,7,6] = 5
中值滤波后的结果:
5
均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素(以目标像素为中心的周围8个像素,构成一个滤波模板,即去掉目标像素本身),再用模板中的全体像素的平均值来代替原来像素值。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=1/m ∑f(x,y) m为该模板中包含当前像素在内的像素总个数。
均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊,不能很好地去除噪声点。
2
4
8
1
3
9
5
7
6
g(x,y)=1/m ∑f(x,y)
g = (1/8)*(2+4+8+1+9+5+7+6)= 5
均值滤波后的结果:
5
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
2. MATLAB实现
源码:
%%-------------------------------------------------------------------------------------------
%% 2018/01/03
%% lee
%% 137194782@qq.com
%% 微信公众号:FPGA开源工作室
%%--------------------------------------------------------------------------------------------
clear all;
clc;
M = imread('timg.jpg'); %读取MATLAB中的名为timg的图像
figure,imshow(M); %显示原始图像
title('original');
gray = rgb2gray(M);
figure,imshow(gray); %显示灰度图像
title('gray');
P1 = imnoise(gray,'gaussian',0.02); %加入高斯躁声
figure,imshow(P1); %加入高斯躁声后显示图像
title('gaussiannoise');
P2 = imnoise(gray,'salt& pepper',0.02); %加入椒盐躁声
figure,imshow(P2); %加入椒盐躁声后显示图像
title('salt& pepper noise');
g = medfilt2(P1); %对高斯躁声中值滤波
figure,imshow(g);
title('medfiltergaussian');
h = medfilt2(P2); %对椒盐躁声中值滤波
figure,imshow(h);
title('medfiltersalt & pepper noise');
a=[1 1 1 %对高斯躁声算术均值滤波
1 11
1 11];
l=1/9*a;
k = conv2(double(P1),double(l));
figure,imshow(k,[]);
title('arithmeticfiltergaussian');
d = conv2(double(P2),double(l)); %对椒盐躁声算术均值滤波
figure,imshow(d,[]);
title('arithmeticfiltersalt & pepper noise');
sigma=8;%标准差大小
window=double(uint8(3*sigma)*2+1);%窗口大小一半为3*sigma
H=fspecial('gaussian',window, sigma);%fspecial('gaussian',hsize, sigma)产生滤波模板
img_gauss=imfilter(P1,H,'replicate'); %为了不出现黑边,使用参数'replicate'(输入图像的外部边界通过复制内部边界的值来扩展)
figure, imshow(img_gauss);
title('gaussianfilting gauss noise');
img_salt=imfilter(P2,H,'replicate');
figure, imshow(img_salt);
title('gaussianfilting salt pepper noise');
结果展示:
原始图像
灰度图像
加入高斯噪声的灰度图像
加入椒盐噪声的灰度图像
经过中值滤波后的高斯噪声灰度图像
经过中值滤波后的椒盐噪声灰度图像
经过均值滤波的高斯噪声灰度图像
经过均值滤波的椒盐噪声灰度图像
经过高斯滤波的高斯噪声灰度图像
经过高斯滤波的椒盐噪声的灰度图像
结果分析:图像经过中值滤波后,高斯噪声没有被完全去除,椒盐噪声几乎被完全去除效果较好。经过均值滤波后不管是高斯噪声还是椒盐噪声大部分都没有被去除,只是稍微模糊化。经过高斯滤波后,高斯噪声和椒盐噪声几乎被很大程度的模糊化,原图好像被加上了一层蒙版。
欢迎大家关注我的微信公众号FPGA开源工作室
FPGA自习学院将不断更新和总结FPGA相关学习资料,书籍,实例工程和视频。
欢迎大家加入FPGA自习学院,一起学习一起成长。
-
详解卡尔曼滤波原理
2017-03-18 13:54:15详解卡尔曼滤波原理 在网上看了不少与卡尔曼滤波相关的博客、论文,要么是只谈理论、缺乏感性,或者有感性认识,缺乏理论推导。能兼顾二者的少之又少,直到我看到了国外的一篇博文,真的惊艳到我了,不得不佩服作者...详解卡尔曼滤波原理 在网上看了不少与卡尔曼滤波相关的博客、论文,要么是只谈理论、缺乏感性,或者有感性认识,缺乏理论推导。能兼顾二者的少之又少,直到我看到了国外的一篇博文,真的惊艳到我了,不得不佩服作者这种细致入微的精神,翻译过来跟大家分享一下,原文链接:http://www.bzarg.com/p/how-a-kalman-filter-works-in-pictures/
我不得不说说卡尔曼滤波,因为它能做到的事情简直让人惊叹!意外的是很少有软件工程师和科学家对对它有所了解,这让我感到沮丧,因为卡尔曼滤波是一个如此强大的工具,能够在不确定性中融合信息,与此同时,它提取精确信息的能力看起来不可思议。什么是卡尔曼滤波?
你可以在任何含有不确定信息的动态系统中使用卡尔曼滤波,对系统下一步的走向做出有根据的预测,即使伴随着各种干扰,卡尔曼滤波总是能指出真实发生的情况。
在连续变化的系统中使用卡尔曼滤波是非常理想的,它具有占用内存小的优点(除了前一个状态量外,不需要保留其它历史数据),并且速度很快,很适合应用于实时问题和嵌入式系统。
在Google上找到的大多数关于实现卡尔曼滤波的数学公式看起来有点晦涩难懂,这个状况有点糟糕。实际上,如果以正确的方式看待它,卡尔曼滤波是非常简单和容易理解的,下面我将用漂亮的图片和色彩清晰的阐述它,你只需要懂一些基本的概率和矩阵的知识就可以了。我们能用卡尔曼滤波做什么?
用玩具举例:你开发了一个可以在树林里到处跑的小机器人,这个机器人需要知道它所在的确切位置才能导航。
我们可以说机器人有一个状态
,表示位置和速度:
注意这个状态只是关于这个系统基本属性的一堆数字,它可以是任何其它的东西。在这个例子中是位置和速度,它也可以是一个容器中液体的总量,汽车发动机的温度,用户手指在触摸板上的位置坐标,或者任何你需要跟踪的信号。
这个机器人带有GPS,精度大约为10米,还算不错,但是,它需要将自己的位置精确到10米以内。树林里有很多沟壑和悬崖,如果机器人走错了一步,就有可能掉下悬崖,所以只有GPS是不够的。
或许我们知道一些机器人如何运动的信息:例如,机器人知道发送给电机的指令,知道自己是否在朝一个方向移动并且没有人干预,在下一个状态,机器人很可能朝着相同的方向移动。当然,机器人对自己的运动是一无所知的:它可能受到风吹的影响,轮子方向偏了一点,或者遇到不平的地面而翻倒。所以,轮子转过的长度并不能精确表示机器人实际行走的距离,预测也不是很完美。
GPS 传感器告诉了我们一些状态信息,我们的预测告诉了我们机器人会怎样运动,但都只是间接的,并且伴随着一些不确定和不准确性。但是,如果使用所有对我们可用的信息,我们能得到一个比任何依据自身估计更好的结果吗?回答当然是YES,这就是卡尔曼滤波的用处。卡尔曼滤波是如何看到你的问题的
下面我们继续以只有位置和速度这两个状态的简单例子做解释。
我们并不知道实际的位置和速度,它们之间有很多种可能正确的组合,但其中一些的可能性要大于其它部分:
卡尔曼滤波假设两个变量(位置和速度,在这个例子中)都是随机的,并且服从高斯分布。每个变量都有一个均值 μ,表示随机分布的中心(最可能的状态),以及方差
,表示不确定性。
在上图中,位置和速度是不相关的,这意味着由其中一个变量的状态无法推测出另一个变量可能的值。下面的例子更有趣:位置和速度是相关的,观测特定位置的可能性取决于当前的速度:
这种情况是有可能发生的,例如,我们基于旧的位置来估计新位置。如果速度过高,我们可能已经移动很远了。如果缓慢移动,则距离不会很远。跟踪这种关系是非常重要的,因为它带给我们更多的信息:其中一个测量值告诉了我们其它变量可能的值,这就是卡尔曼滤波的目的,尽可能地在包含不确定性的测量数据中提取更多信息!
这种相关性用协方差矩阵来表示,简而言之,矩阵中的每个元素表示第 i 个和第 j 个状态变量之间的相关度。(你可能已经猜到协方差矩阵是一个对称矩阵,这意味着可以任意交换 i 和 j)。协方差矩阵通常用“
”来表示,其中的元素则表示为“
”。
使用矩阵来描述问题
我们基于高斯分布来建立状态变量,所以在时刻 k 需要两个信息:最佳估计
(即均值,其它地方常用 μ 表示),以及协方差矩阵
。
(1)
(当然,在这里我们只用到了位置和速度,实际上这个状态可以包含多个变量,代表任何你想表示的信息)。接下来,我们需要根据当前状态(k-1 时刻)来预测下一状态(k 时刻)。记住,我们并不知道对下一状态的所有预测中哪个是“真实”的,但我们的预测函数并不在乎。它对所有的可能性进行预测,并给出新的高斯分布。
我们可以用矩阵
来表示这个预测过程:
它将我们原始估计中的每个点都移动到了一个新的预测位置,如果原始估计是正确的话,这个新的预测位置就是系统下一步会移动到的位置。那我们又如何用矩阵来预测下一个时刻的位置和速度呢?下面用一个基本的运动学公式来表示:
现在,我们有了一个预测矩阵来表示下一时刻的状态,但是,我们仍然不知道怎么更新协方差矩阵。此时,我们需要引入另一个公式,如果我们将分布中的每个点都乘以矩阵 A,那么它的协方差矩阵
会怎样变化呢?很简单,下面给出公式:
结合方程(4)和(3)得到:
外部控制量
我们并没有捕捉到一切信息,可能存在外部因素会对系统进行控制,带来一些与系统自身状态没有相关性的改变。
以火车的运动状态模型为例,火车司机可能会操纵油门,让火车加速。相同地,在我们机器人这个例子中,导航软件可能会发出一个指令让轮子转向或者停止。如果知道这些额外的信息,我们可以用一个向量来表示,将它加到我们的预测方程中做修正。
假设由于油门的设置或控制命令,我们知道了期望的加速度,根据基本的运动学方程可以得到:
以矩阵的形式表示就是:
称为控制矩阵,
称为控制向量(对于没有外部控制的简单系统来说,这部分可以忽略)。让我们再思考一下,如果我们的预测并不是100%准确的,该怎么办呢?
外部干扰
如果这些状态量是基于系统自身的属性或者已知的外部控制作用来变化的,则不会出现什么问题。
但是,如果存在未知的干扰呢?例如,假设我们跟踪一个四旋翼飞行器,它可能会受到风的干扰,如果我们跟踪一个轮式机器人,轮子可能会打滑,或者路面上的小坡会让它减速。这样的话我们就不能继续对这些状态进行跟踪,如果没有把这些外部干扰考虑在内,我们的预测就会出现偏差。
在每次预测之后,我们可以添加一些新的不确定性来建立这种与“外界”(即我们没有跟踪的干扰)之间的不确定性模型:
原始估计中的每个状态变量更新到新的状态后,仍然服从高斯分布。我们可以说
的每个状态变量移动到了一个新的服从高斯分布的区域,协方差为
。换句话说就是,我们将这些没有被跟踪的干扰当作协方差为
的噪声来处理。
这产生了具有不同协方差(但是具有相同的均值)的新的高斯分布。
我们通过简单地添加
得到扩展的协方差,下面给出预测步骤的完整表达式:
由上式可知,新的最优估计是根据上一最优估计预测得到的,并加上已知外部控制量的修正。
而新的不确定性由上一不确定性预测得到,并加上外部环境的干扰。
好了,我们对系统可能的动向有了一个模糊的估计,用和
来表示。如果再结合传感器的数据会怎样呢?
用测量值来修正估计值
我们可能会有多个传感器来测量系统当前的状态,哪个传感器具体测量的是哪个状态变量并不重要,也许一个是测量位置,一个是测量速度,每个传感器间接地告诉了我们一些状态信息。
注意,传感器读取的数据的单位和尺度有可能与我们要跟踪的状态的单位和尺度不一样,我们用矩阵
来表示传感器的数据。
我们可以计算出传感器读数的分布,用之前的表示方法如下式所示:
卡尔曼滤波的一大优点就是能处理传感器噪声,换句话说,我们的传感器或多或少都有点不可靠,并且原始估计中的每个状态可以和一定范围内的传感器读数对应起来。
从测量到的传感器数据中,我们大致能猜到系统当前处于什么状态。但是由于存在不确定性,某些状态可能比我们得到的读数更接近真实状态。
我们将这种不确定性(例如:传感器噪声)用协方差
表示,该分布的均值就是我们读取到的传感器数据,称之为
。
现在我们有了两个高斯分布,一个是在预测值附近,一个是在传感器读数附近。
我们必须在预测值(粉红色)和传感器测量值(绿色)之间找到最优解。
那么,我们最有可能的状态是什么呢?对于任何可能的读数,有两种情况:(1)传感器的测量值;(2)由前一状态得到的预测值。如果我们想知道这两种情况都可能发生的概率,将这两个高斯分布相乘就可以了。
剩下的就是重叠部分了,这个重叠部分的均值就是两个估计最可能的值,也就是给定的所有信息中的最优估计。
瞧!这个重叠的区域看起来像另一个高斯分布。
如你所见,把两个具有不同均值和方差的高斯分布相乘,你会得到一个新的具有独立均值和方差的高斯分布!下面用公式讲解。
融合高斯分布
先以一维高斯分布来分析比较简单点,具有方差
和 μ 的高斯曲线可以用下式表示:
如果把两个服从高斯分布的函数相乘会得到什么呢?
将式(9)代入到式(10)中(注意重新归一化,使总概率为1)可以得到:
将式(11)中的两个式子相同的部分用 k 表示:
下面进一步将式(12)和(13)写成矩阵的形式,如果 Σ 表示高斯分布的协方差,
表示每个维度的均值,则:
矩阵
称为卡尔曼增益,下面将会用到。放松!我们快要完成了!
将所有公式整合起来
我们有两个高斯分布,预测部分
,和测量部分
,将它们放到式(15)中算出它们之间的重叠部分:
由式(14)可得卡尔曼增益为:
将式(16)和式(17)的两边同时左乘矩阵的逆(注意
里面包含了
)将其约掉,再将式(16)的第二个等式两边同时右乘矩阵
的逆得到以下等式:
上式给出了完整的更新步骤方程。
就是新的最优估计,我们可以将它和
放到下一个预测和更新方程中不断迭代。
总结
以上所有公式中,你只需要用到式(7)、(18)、(19)。(如果忘了的话,你可以根据式(4)和(15)重新推导一下)
我们可以用这些公式对任何线性系统建立精确的模型,对于非线性系统来说,我们使用扩展卡尔曼滤波,区别在于EKF多了一个把预测和测量部分进行线性化的过程。(ps: 第一次用Markdown,添加图片和公式心累啊,什么时候能直接拖拽就好了~~)
附Markdown使用技巧:
1. 改变文本字体、字号与颜色。参考链接:(http://blog.csdn.net/testcs_dn/article/details/45719357/)
2. 在线公式编辑器,编辑好了右键“复制图片地址”,当作图片来添加。
链接:(http://private.codecogs.com/latex/eqneditor.php)
3. 段落首行缩进,按Shift+Space将输入法切换到全角状态,然后敲空格即可,一个空格代表一个汉字的间隔。
4. 设置图片大小及居中显示。参考链接:(http://blog.csdn.net/soindy/article/details/50427079)
5. 不懂百度。 -
[Python图像处理] 四.图像平滑之均值滤波、方框滤波、高斯滤波及中值滤波
2018-09-02 23:27:36本篇文章主要讲解Python调用OpenCV实现图像平滑,包括四个算法:均值滤波、方框滤波、高斯滤波和中值滤波。全文均是基础知识,希望对您有所帮助。知识点如下: 1.图像平滑 2.均值滤波 3.方框滤波 4.高斯滤波 5.中值... -
Matlab 均值滤波与中值滤波
2018-08-25 23:38:30所谓的滤波就是一个系数矩阵(也称为模板,滤波器,滤波模板,核,掩模或者窗口),然后用这个模板对应图像矩阵(填充0后的图像矩阵)进行乘积和运算。 均值滤波就是这个滤波器每个值都是一样大小,每个值是1/k(k... -
图像处理:中值滤波&均值滤波
2018-08-16 10:57:19转自:openCV之中值滤波&均值滤波(及代码实现):https://blog.csdn.net/weixin_37720172/article/details/72627543 在开始我们今天的博客之前,我们需要先了解一下什么是滤波: openCV之中值滤波&... -
滤波-卡尔曼滤波-互补滤波
2015-08-11 23:33:35滤波方法及其原理, 卡尔曼滤波,互补滤波 -
中值滤波 均值滤波 高斯滤波用于图像去噪
2019-02-23 12:40:53中值滤波 均值滤波 高斯滤波用于图像去噪 效果良好 对于噪声的去除有很大的帮助 -
同态滤波、高斯高通滤波、高斯低通滤波、高频滤波matlab代码
2019-04-18 22:46:58同态滤波、高斯高通滤波、高斯低通滤波、高频滤波matlab代码 不要积分了 同态滤波、高斯高通滤波、高斯低通滤波、高频滤波matlab代码 不要积分了 同态滤波、高斯高通滤波、高斯低通滤波、高频滤波matlab代码 不要... -
卡尔曼滤波系列——(二)扩展卡尔曼滤波
2019-04-06 16:33:48更新日志: 2020.02.13:修改了第三节推导中的公式错误 ...EKF的基本思想是利用泰勒级数展开将非线性系统线性化,然后采用卡尔曼滤波框架对信号进行滤波,因此它是一种次优滤波。 2 算法介绍 2.1 泰勒级数... -
扩展卡尔曼滤波_无迹卡尔曼滤波_扩展信息滤波_l粒子滤波算法.rar
2020-11-03 15:36:30扩展卡尔曼滤波_无迹卡尔曼滤波_扩展信息滤波_l粒子滤波算法.rar -
OpenCV–图像平滑(均值滤波、方框滤波、高斯滤波、中值滤波)
2021-01-20 02:08:00OpenCV–图像平滑(均值滤波、方框滤波、高斯滤波、中值滤波) 首先看以下图,图像平滑(模糊)只是滤波中的一种操作,并不是整个滤波部分。 一、均值滤波 函数: dst = cv.blur( src, ksize[, dst[, anchor[, ... -
python+opencv均值滤波,高斯滤波,中值滤波,双边滤波
2018-06-26 23:05:30滤波算法主要包括均值滤波,高斯滤波,中值滤波和双边滤波。 每种算法都有自己的特点,建议从原理上了解每种算法的优缺点。上图给出简洁版的总结。 以下是代码: import numpy as np import cv2 import ... -
【OpenCV入门教程之八】线性邻域滤波专场:方框滤波、均值滤波与高斯滤波
2014-04-01 21:18:54本系列文章由@浅墨_毛星云 出品,转载...毛星云(浅墨) 邮箱: happylifemxy@163.com 写作当前博文时配套使用的OpenCV版本: 2.4.8本篇文章中,我们一起仔细探讨了OpenCV图像处理技术中比较热门的图像滤波操作。图 -
均值滤波和中值滤波
2018-02-05 16:48:24均值滤波及中值滤波的区别 均值滤波和和中值滤波都可以起到平滑图像,虑去噪声的功能。均值滤波采用线性的方法,平均整个窗口范围内的像素值,均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在... -
逆滤波 半径受限逆滤波 维纳滤波 matlab代码
2019-04-02 18:08:39从构造大气湍流模型,运动模糊模型,gauss噪声模型开始,利用逆滤波和半径受限逆滤波还有维纳滤波处理,分成多个脚本函数文件易于调试,对比效果明显 -
添加椒盐噪声,并用高斯滤波、均值滤波、中值滤波、双边滤波四种滤波去噪方式源码.zip
2020-07-01 22:40:12添加高斯噪声,并用高斯滤波、均值滤波、中值滤波、双边滤波四种滤波去噪方式,并且分别得到这四种滤波后的信噪比值,通过比较信噪比值,得到最佳的滤波去噪处理方式。添加噪声的浓度可以改变,并且也可以改变卷积核... -
添加高斯噪声,并用高斯滤波、均值滤波、中值滤波、双边滤波四种滤波去噪方式源码.zip
2020-07-01 22:33:32用高斯滤波、均值滤波、中值滤波,双边滤波滤波进行去噪处理,这四种滤波是在添加高斯噪声的基础上,分别得到信噪比,通过对比信噪比值,最终得到那种方式处理效果最好。并且源码可以在不同的卷积核滤波器大小、添加... -
方框滤波/均值滤波/高斯滤波/中值滤波/双边滤波
2018-11-17 15:53:52相关图像处理概念介绍 “平滑处理“(smoothing)也称“模糊处理”(bluring),是一项简单且使用频率很高的图像处理方法。平滑处理的用途有很多,最...滤波可分低通滤波和高通滤波两种。而高斯滤波是指用高斯函数作... -
均值滤波&高斯滤波&中值滤波
2018-11-01 20:07:39均值滤波 均值滤波是一种线性滤波器,处理思路也很简单,就是将一个窗口区域中的像素计算平均值,然后将窗口中计算得到的均值设置为锚点上的像素值。 该算法有优点在于效率高,思路简单。同样,缺点也很明显,计算... -
中值滤波、均值滤波和高斯滤波代码 C语言
2017-05-27 14:13:02借鉴他人的资源进行集合和整理了一下,高斯滤波分为一维高斯滤波和二维高斯滤波,并且和OPENCV的高斯滤波的时间进行对比了一下,比OPENCV的要慢很多 -
关于高斯滤波的一些理解
2017-01-04 07:44:34滤波算法简介 图像处理中,常用的滤波算法有均值滤波、中值滤波以及高斯滤波等。均值滤波使用模板内所有像素的平均值代替模板中心像素灰度值,这种方法易收到噪声的干扰,不能完全消除噪声,只能相对减弱噪声;... -
卡尔曼滤波系列——(一)标准卡尔曼滤波
2019-03-03 16:03:58卡尔曼滤波(Kalman Filter)是一种利用线性系统状态方程,利用对系统的观测数据,对系统状态进行最优估计的算法。由于观测数据受到系统中的噪声和干扰的影响,所以系统状态的估计过程也可看作是滤波过程。应用场景... -
贝叶斯滤波:卡尔曼滤波、直方图滤波、粒子滤波
2020-05-20 08:46:41卡尔曼滤波、粒子滤波、直方图滤波是贝叶斯滤波的三种实现形式,在《概率机器人》这本书中,按照“线性→非线性”的顺序讲解,先介绍卡尔曼滤波,再介绍直方图滤波和粒子滤波。但我发现先介绍直方图滤波效果可能会... -
卡尔曼滤波,互补滤波,“Tsinghua”滤波
2020-06-05 16:20:34卓大大,请问您可以针对卡尔曼滤波、互补滤波、清华滤波的原理与异同做一个推送吗?最近在查阅相关的资料学习滤波算法,感觉好难理解呀/::< ▲ 平衡双轮自行车 正好昨天结束了本学期的“信号与系统”课程的最后... -
matlab实现图像滤波——高斯滤波
2016-10-07 14:49:44生成一个(2N+1)×(2N+1)大小的高斯模板H(标准为sigma),然后用此模板对图像进行滤波。不允许使用 fspecial 来产生高斯模板,不允许使用 imfilter、conv2 等函数。 原理及算法 理解:高斯滤波就是对整幅... -
卡尔曼滤波、扩展卡尔曼滤波、无迹卡尔曼滤波以及粒子滤波原理
2018-05-30 10:22:29所有滤波问题其实都是求感兴趣的状态的后验概率分布,只是由于针对特定条件的不同,可通过求解析解获得后验概率(KF、EKF、UKF),也可通过大数统计平均求期望的方法来获得后验概率(粒子滤波)。 KF、EKF、UKF ... -
数字图像处理(11): 图像平滑 (均值滤波、中值滤波和高斯滤波)
2019-05-03 17:28:202 均值滤波 3 中值滤波 4 高斯滤波 参考资料 1 图像增强——图像平滑 1.1 图像增强简介 图像增强是对图像进行处理,使其比原始图像更适合于特定的应用,它需要与实际应用相结合。对于图像的某些特征如边缘、...