上次我们总结了图像的卷积操作和一般的拼接,融合,处理了小美女的图片等。本次我们介绍下图像卷积的简单应用--平滑和形态学。
我们可能经常会遇到像去噪点,水印,去模糊,增强图片边缘等需求。无一例外,这些都可以通过用卷积操作来实现。只要我们选取了合适的卷积核,就可以得到我们想要的图片处理结果。
1.图像滤波的应用
我们还是以上次双马尾小姑娘图片为例:
中值滤波:
最常见的,我们可能会处理噪声图片。一个图片可能会有很多的细小斑点,中值滤波就能很好的去掉这些独立噪声。中值滤波器如下:
我们用这样的卷积核做卷积,只不过最后的加权平均并非像卷积一样求和。而是用卷积每一步结果的中间值代替。这就是中值滤波。比如:
左边的妹子图是有椒盐噪声的图,右边是用中值滤波处理过的图。明显中值滤波对椒盐噪声的处理非常好。(椒盐噪声的由来,非常形象。我们把妹子图想象成豪大大鸡排,而椒盐噪声就好像撒在上面的椒盐佐料)
高斯滤波:
高斯滤波也是非常有用的滤波器,在图像平滑上效果很好。本质上也是一个卷积操作。当然,难度在于卷积核的确定。高斯卷积核,我们通过高斯公式来确定。
当然常用的图像处理库都自带了高斯函数。我们只需要设置,卷积核大小和标准差即可。
如图:这是一个高斯平滑的例子。把图像变得更自然,图片边缘会更宽,更模糊。
当然,这里还有均值滤波,就是每个卷积核计算后,并不是求和,而是采用平均值。还有双边滤波,这里都不在一一的介绍。说明几个给大家讲解下原理。
2.图像的形态学操作
接下来我们介绍下,图片最基本的形态学操作,腐蚀和膨胀。
腐蚀本质也是卷积操作,只是并非用卷积核的加权平均和,而是用卷积核覆盖区域内的最小值。
同样的,膨胀与腐蚀操作类似。只是用卷积核覆盖区域内的最大值。
卷积对应的计算结果,并不是卷积核和图像对应位置的和,而是卷积核在各个位置计算过后的,最大值(膨胀)或最小值(腐蚀)。
我们通过滑动卷积核,在每个位置取卷积的最小值,得到腐蚀图。左边的课程表为原图,右边的为腐蚀图。
同样的膨胀图也很容易得出:
可以看出,腐蚀就像图片生锈,会把主体数据变小。而膨胀就像图片充气,会把图片数据主体部分放大。
有了图片的腐蚀和膨胀。就可以衍生出很多图片操作。比如:我们可以先对图像腐蚀一次,再膨胀两次。这样即可以去除图片的噪点和粘连,又可以放大图片的主体(开运算)。同样的也可以先膨胀图片,再腐蚀图片,这样即可以把图片原本需要缝合的粘连再一起,也可以腐蚀掉不需要的噪点(闭运算)。
同样的,有了开运算和闭运算。我们还可以做开运算和闭运算的差(形态梯度),也可以做原图与形态图的差等等。当然这些都是腐蚀和膨胀的一些扩展应用。我们只需要理解腐蚀和膨胀的原理,能灵活运用即可。
在实际的图片处理中,图像的大小和噪声,粘连,缝隙等往往各不相同。我们很难找到一个统一的尺度,统一的卷积核大小来处理所有的图片。所以,形态学的操作更多的是做一些简单的辅助处理。对于过于复杂的图片进行形态学操作,往往在应用的通用性和鲁棒性上,会大打折扣。形态学操作往往很重要,但更多的只是辅助。
3.傅立叶变换的应用
在开始推导之前,首先我们需要认识一位男爵:让·巴普蒂斯·约瑟夫·傅里叶男爵。
傅立叶男爵
没错,就是这个男人。他就是传说中的傅立叶。傅立叶首先猜想了,任意函数都可以分解成三角函数之和。
写成公式如下:
所有的函数都可以分解成上面的这个形式。
我们把cos(2PInx/T)和sin(2PINx/T)以及前面的常数1,当作一组新的基底。而前面的,C,An和Bn当作对应新基底坐标系的坐标。这样我们就得到了傅立叶变换的结果。其核心思想,就是把时间域内的函数,表示成以sin(x)和cos(x)系列的三角函数为基底的组合而已。
最终我们可以推出:
带入公式得到:
当然我们还可以表示成更简洁的复数形式。
3.1 首先我们根据泰勒公式:
可以把自然常数e表示为:
同样的如果我们把自然常数e的幂x换成ix(虚数i),则
百度百科
很容易证明出来欧拉公式。
有了欧拉公式,我们就可以简化傅立叶变换到另外一种形式。
这里用了三角函数的合并。把后面的三角函数合并成了以自然常数e来表述的函数。
上面是周期函数的傅立叶级数形式。对于非周期函数,我们只需要把它当作周期无限大的周期函数处理即可:
这里的w = 2PI/T。同样的我们把公式的未知量当作傅立叶变换,即可得到:
这就是完整的傅立叶变换的推导思路。那么傅立叶变换在图像上的物理意义是什么样的呢?
我们可以看到一个时域信号,从垂直方向的频域看过去,就是傅立叶变换的结果。
3.2 傅立叶变换在图像处理中的应用
傅立叶变换反应在图像上,就是图像的频率高低分布。图像中像素值变化比较大的地方,比如噪声和边缘,代表高频部分。背景和物体代表变化不大的低频部分。我们以妹子图为例:
对应的傅立叶变换图:
可以看到图像的中心区域为低频区域。(这里我用uint8来显示结果,所以中间有黑点)
频谱图有非常好的,平移不变性。我们可以基于频谱图做一些图像的高通/低通滤波,边缘锐化,模糊,图像主体的方向识别等操作。
比如,官网的文本检测的例子:
我们可以根据傅立叶变换后的频谱图来判断当前图像的旋转角度,修正偏差。
本次的介绍就到这里。下次我们介绍图像的经典算法边缘算子,边缘检测,以及直方投影,霍夫变换和Freeman链码等。