3月13日 传统数字滤波器与卷积,卷积在图片的应用

资料存放处:待定

卡尔曼滤波器与我以前讲过的FIR, IIR 滤波器完全不一样,与其说属于滤波器,不如说是属于最优控制的范畴。

传统数字滤波器

对于一个线性时不变系统,施加一个输入 u(t) ,我们可以得到一个输出 y(t) . 如果输入是一个冲击,则输出y(t) 被称作冲击响应,用 h(t) 来表示,是系统的内核。对于任意 u(t), 输出 y(t) 可以通过 u(t) 与冲击响应 h(t) 的卷积得到,这是 FIR 滤波器的基本原理。我们还可以通过系统微分方程转换为差分方程,或是通过 laplace 传递函数转换到差分方程,最后得到一个递推公式,这种形式的滤波器就是IIR 滤波器。

时域处理的两种情形

一个系统可以用时域的微分方程来建立,然后可以用 laplace 的传递函数来处理,把解微分方程变为多项式乘法,可以简单的求解。

还有另外一种处理形式就是状态空间,以矩阵形式来处理微分方程或微分方程组,利用矩阵变换求解,类同齐次方程组的矩阵形式。

例子

例如微分方程:

y + 3 y + 2 y = u y’’ +3y’ + 2y = u

X 1 = y , X 2 = y = X 1 X_1 = y, X_2 = y’ = X_1’
则上式变为:
X 2 = 3 X 2 2 X 1 u X_2’ = -3 X_2 – 2 X_1 - u
X 1 = X 2 X_1’ = X_2
在这里插入图片描述


通用形式为:
X = A X + B u X’ = A*X + B*u
Y = C X Y = C*X

微分方程或微分方程组转换到状态空间形式,而状态空间与laplace 传递函数之间可以相互转换

事实上,矩阵A 的特征值就是s传递函数的极点。系统的传递函数(阵)可以通过矩阵变换得到:

Y ( s ) = C ( s I A ) 1 B Y(s) = C * (s * I - A)^{ -1} * B

同理,连续域的微分方程对应了离散域的差分方程, 离散域状态空间相应的变为:
X ( k ) = A X ( k 1 ) + B ( u 1 ) X(k) = A*X(k-1) + B(u-1)
Y ( k ) = C X ( k ) Y(k) = C*X(k)


什么是卷积?

https://zhuanlan.zhihu.com/p/30994790

卷积公式:
在这里插入图片描述
它的物理意义大概可以理解为:系统某一时刻的输出是由多个输入共同作用(叠加)的结果

放在图像分析里,f(x) 可以理解为原始像素点(source pixel),所有的原始像素点叠加起来,就是原始图了。

g(x)可以称为作用点,所有作用点合起来我们称为卷积核(Convolution kernel)

卷积核上所有作用点依次作用于原始像素点后(即乘起来),线性叠加的输出结果,即是最终卷积的输出,也是我们想要的结果,我们称为destination pixel.

卷积演示

  • https://blog.csdn.net/zouxy09/article/details/49080029

首先,我们有一个二维的滤波器矩阵(有个高大上的名字叫卷积核)和一个要处理的二维图像。然后,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。这样就完成了滤波过程

最左边就是我们原始输入图像了,中间是卷积层,-8就是卷积的结果。
在这里插入图片描述

对图像和滤波矩阵进行逐个元素相乘再求和的操作就相当于将一个二维的函数移动到另一个二维函数的所有位置,这个操作就叫卷积或者协相关。

卷积协相关的差别是,卷积需要先对滤波矩阵进行180的翻转,但如果矩阵是对称的,那么两者就没有什么差别了。

Correlation 和 Convolution可以说是图像处理最基本的操作,但却非常有用。这两个操作有两个非常关键的特点:它们是线性的,而且具有平移不变性shift-invariant。平移不变性指我们在图像的每个位置都执行相同的操作。线性指这个操作是线性的,也就是我们用每个像素的邻域的线性组合来代替这个像素。这两个属性使得这个操作非常简单,因为线性操作是最简单的,然后在所有地方都做同样的操作就更简单了。

卷积的规则

实际上,在信号处理领域,卷积有广泛的意义,而且有其严格的数学定义,但在这里不关注这个。

2D卷积需要4个嵌套循环4-double loop,所以它并不快,除非我们使用很小的卷积核。这里一般使用3x3或者5x5。而且,对于滤波器,也有一定的规则要求:

1)滤波器的大小应该是奇数,这样它才有一个中心,例如3x3,5x5或者7x7。有中心了,也有了半径的称呼,例如5x5大小的核的半径就是2。

2)滤波器矩阵所有的元素之和应该要等于1,这是为了保证滤波前后图像的亮度保持不变。当然了,这不是硬性要求了。

3)如果滤波器矩阵所有元素之和大于1,那么滤波后的图像就会比原图像更亮,反之,如果小于1,那么得到的图像就会变暗。如果和为0,图像不会变黑,但也会非常暗。

4)对于滤波后的结构,可能会出现负数或者大于255的数值。对这种情况,我们将他们直接截断到0和255之间即可。对于负数,也可以取绝对值。

卷积核的演示

1、啥也不做
这个滤波器啥也没有做,得到的图像和原图是一样的。因为只有中心点的值是1。邻域点的权值都是0,对滤波后的取值没有任何影响。(不同的padding,图片的尺寸会有调整)
在这里插入图片描述

2、图像锐化滤波器Sharpness Filter

最简单的3x3的锐化滤波器如下:
在这里插入图片描述

图像的锐化和边缘检测很像,首先找到边缘,然后把边缘加到原来的图像上面,这样就强化了图像的边缘,使图像看起来更加锐利了。这两者操作统一起来就是锐化滤波器了,也就是在边缘检测滤波器的基础上,再在中心的位置加1,这样滤波后的图像就会和原始的图像具有同样的亮度了,但是会更加锐利。

在这里插入图片描述

实际上是计算当前点和周围点的差别,然后将这个差别加到原来的位置上。另外,中间点的权值要比所有的权值和大于1,意味着这个像素要保持原来的值。

3、边缘检测Edge Detection

我们要找水平的边缘:需要注意的是,这里矩阵的元素和是0,所以滤波后的图像会很暗,只有边缘的地方是有亮度的。

为什么这个滤波器可以寻找到水平边缘呢?因为用这个滤波器卷积相当于求导的离散版本:你将当前的像素值减去前一个像素值,这样你就可以得到这个函数在这两个位置的差别或者斜率。

在这里插入图片描述

下面的滤波器可以找到垂直方向的边缘,这里像素上和下的像素值都使用:
在这里插入图片描述

再下面这个滤波器可以找到45度的边缘:取-2不为了什么,只是为了让矩阵的元素和为0而已。

在这里插入图片描述

那下面这个滤波器就可以检测所有方向的边缘:
在这里插入图片描述

为了检测边缘,我们需要在图像对应的方向计算梯度。用下面的卷积核来卷积图像,就可以了。但在实际中,这种简单的方法会把噪声也放大了。另外,需要注意的是,矩阵所有的值加起来要是0.
在这里插入图片描述

4、浮雕Embossing Filter

浮雕滤波器可以给图像一种3D阴影的效果。只要将中心一边的像素减去另一边的像素就可以了。这时候,像素值有可能是负数,我们将负数当成阴影,将正数当成光,然后我们对结果图像加上128的偏移。这时候,图像大部分就变成灰色了。
在这里插入图片描述

这种效果非常的漂亮,就像是将一副图像雕刻在一块石头上面一样,然后从一个方向照亮它。它和前面的滤波器不同,它是非对称的。另外,它会产生负数值,所以我们需要将结果偏移,以得到图像灰度的范围。
在这里插入图片描述

5、均值模糊Box Filter (Averaging)
我们可以将当前像素和它的四邻域的像素一起取平均,然后再除以5,或者直接在滤波器的5个地方取0.2的值即可,如下图:
在这里插入图片描述
所以,如果你想要更模糊的效果,加大滤波器的大小即可。或者对图像应用多次模糊也可以。
在这里插入图片描述
在这里插入图片描述

6、高斯模糊
均值模糊很简单,但不是很平滑。高斯模糊就有这个优点,所以被广泛用在图像降噪上。特别是在边缘检测之前,都会用来移除细节。高斯滤波器是一个低通滤波器。
在这里插入图片描述

在这里插入图片描述

7、运动模糊Motion Blur

运动模糊可以通过只在一个方向模糊达到,例如下面9x9的运动模糊滤波器。注意,求和结果要除以9。

在这里插入图片描述
这个效果就好像,摄像机是从左上角移动的右下角。

三、卷积的计算

对图像处理而言,存在两大类的方法:空域处理和频域处理!空域处理是指直接对原始的像素空间进行计算,频率处理是指先对图像变换到频域,再做滤波等处理。

1、空域计算-直接2D卷积

直接2D卷积就是一开始说的那样,对于图像的每一个像素点,计算它的邻域像素和滤波器矩阵的对应元素的乘积,然后加起来,作为该像素位置的值。
在这里插入图片描述
直接的实现也称为暴力实现brute force,因为它严格按照定义来实现,没有任何优化。当然了,在并行实现里面,它也是比较灵活的。另外,也存在一个优化版本,如果我们的kernel是separable可分的,那么就可以得到一个快5倍左右的卷积方法。

2、频域计算-快速傅里叶变换FFT卷积

这个快速实现得益于卷积定理:时域上的卷积等于频域上的乘积。所以将我们的图像和滤波器通过算法变换到频域后,直接将他们相乘,然后再变换回时域(也就是图像的空域)就可以了。

在这里插入图片描述

o表示矩阵逐元素相乘。那用什么方法将空域的图像和滤波器变换到频域了。那就是鼎鼎大名的Fast Fourier Transformation 快速傅里叶变换FFT(其实,在CUDA里面,已经实现了FFT了)。

要在频域中对一副图像进行滤波,滤波器的大小和图像的大小必须要匹配,这样两者的相乘才容易。因为一般滤波器的大小比图像要小,所以我们需要拓展我们的kernel,让它和图像的大小一致。

在这里插入图片描述
为了保证图像边界的像素也可以得到响应输出,我们也需要拓展我们的输入图像。同时,拓展的方式也要支持周期表达。

如果只是使用卷积定理,没有对输入进行任何修改的话,那么我们得到的是周期卷积的结果。但这可能不是我们要的,因为周期卷积会对输入数据进行周期填补,引入一些artifacts

怎么处理artifacts?
在这里插入图片描述
给定N长度的I和K,为了得到线性卷积,我们需要对I和K进行zero padding。为什么要补0,因为DFT假定了输入是无限和周期的,周期是N。

在这里插入图片描述

如上图,对于I和K,如果没有padding的话,隐含着会假定I和K是周期的,以他们的长度N为周期。图中本来N长度的I和K都是黑色虚线的部分,然后如果没有padding,隐含着就会在N之外,加上同样的无数个I,如红色虚线部分,加上了一个周期。对K也是这样。

如果是zero padding的话,在黑色虚线的其他地方都全是0了,如图中蓝色部分。将I和K卷积,如果没有padding,如黑色虚线,会有红色那部分的artifact。如果有padding,就是蓝色实线。

FIR

  • https://www.zhihu.com/question/29945169

发现FIR其实就是下面这个公式,其中数组x[ ]为输入,数组h[ ]为滤波参数(已知),数组y[ ]为滤波输出:
在这里插入图片描述
1、实现FIR滤波过程就是上面这个过程?这么简单?还是自己理解错了根本不是这么回事?(想确认:对于实现这块,上面的理解对不对)
从理论上来说,实现FIR就是上面这个过程。但是这个过程可以在课后习题上使用,如果要做成可以使用的系统,你将会遇到各种各样的问题,阻止你使用这个公式。

Case 1. 你知道自己的FIR滤波器在时域的序列

这可能是最容易使用这个公式的情况了。但是可以看到,这个公式的复杂度是O(n^2)的,如果你的FIR序列过长,将会导致严重的效率问题。一般我们会学习FFT来提高效率。学习FFT就需要学习频域。

同时,一般情况下,你的x会非常非常长。比如一首60s的歌曲,采样率在44.1kHz,你将有一个长达44100*60 = 2646000的序列。你真的打算把这么长的序列存到内存里,然后直接用上面的公式吗?我们会学习overlap add和overlap save来解决这个问题。

更多时候,我们关心的是平稳信号的属性(见stationarity),这是我们要用到短时傅立叶变换(STFT)。这里涉及到了很多的窗函数的知识。

Case 2. 你知道自己要设计一个什么样频率响应的滤波器(比如低通滤波器)

知道低通滤波器的频域响应,要转化为时域响应,只能得到IIR,此时的响应是无限长的。有限长信号通过IIR滤波,会得到无限长信号,很不实用。这时我们要用有限长响应去逼近无限长响应,会用到零极点图,窗函数法,多采样率滤波器等方法去实现。

2、不同的滤波类型(高通、低通、带通、带阻滤波)主要表现滤波参数h[]的不同?
高通/低通的不同,更多表现在频域上的不同。在时域上不易看出什么不同。

3、如果真这么简单为什么教材不写简单一点,非得要扯那些复数域、z变换?这是什么心态?纯粹让外行看不懂吗?
数字信号处理涉及到的问题多种多样,要解决的工程问题也很繁杂。所以教材里包罗万象也就不奇怪了。FIR滤波器只是数字信号处理的一部分,要学好FIR滤波器,需要比较完备的知识储备。如果真正想要解决实际问题的话,建议还是一步一步从经典教材的第一章看起。如果只是想用FIR做一些简单的算法验证,在知道FIR滤波器时域响应的情况下,用这个公式也是可以实现的。

4、难道是说设计一个滤波器很难(需要用到那么多概念),实现滤波器就是我上面理解的那个公式?
设计一个滤波器,要考虑到对这个滤波器的实际要求。设计的时候,一般会对FIR长度,频响有要求。如果是一个过渡带很宽的低通滤波器,用比较低的阶数就能设计出来;如果过渡带很窄,则需要更高级的设计方法。

总之,实现FIR滤波器,在应用场景极其简单的情况,可以用上面的公式。

推荐一个滤波器设计工具,Matlab里的fdatool。

发布了92 篇原创文章 · 获赞 4 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/djfjkj52/article/details/104837248