我们在图像处理中遇到的数字图像通常分为两种:
单色(灰度)图像:每个像素的亮度用一个数值来表示,取值范围0-255,0表示黑、255表示白,其他值表示处于黑白之间的灰度
彩色图像:用红、绿、蓝三组数据来表示。每一组的每个数值也是在0-255之间,0表示相应的基色在该像素中没有,而255表示相应的基色在该像素中取得最大值。
以简单的灰度图像为例,每一张图像都可以看作是由像素值构成的二维矩阵。我们平时熟悉的平移、虚化、锐化等操作在这一层面上是如何实现的,其实,都离不开一个操作:卷积。
我们首先通过卷积来理解一些对图像的简单操作:
对图像的平移,在微观层面就是,把每一个像素都往同一个方向移动同样的距离。卷积是如何实现这一操作的呢?如图所示:
原来的图像与中间的卷积核进行卷积操作之后便得到了向左平移一个像素之后的照片。卷积操作使得某一位置的像素值等于原来在它右边位置的像素值,如此便完成了向左的平移。
某一位置的像素值,在经过卷积操作之后,变成原本周围9个像素值的平均值,如此便达到了平滑的效果。
锐化的操作比较复杂,我们慢慢来看。锐化操作可以分为两步,首先,将原本的图像“减去”平滑后的图像,得到的就是一些边缘的信息,把这些边缘的信息叠加到原本的图像当中,就使得边缘更加明显,从而达到了锐化的效果,如图所示:
以上,我们可以看出,通过设计不同的卷积核(包括卷积核的大小还有各个元素的值),与图像进行卷积之后,可以得到多样的效果。
其实上文提到的平滑操作就是一个简单的去噪,卷积之后“平滑”掉了一些过大、过小的值,这一去噪方式(对卷积核覆盖区域取均值)会产生一种名叫“振铃”的效应,使得去噪结果不是很好。在实际当中,我们使用更多的是“高斯去噪”——即卷积核的元素值符合高斯分布。
提到高斯分布,我们首先想到的是这两个参数——均值和方差。对于均值的设定,我们需要从另一个角度进行考虑:卷积核内所有权值之和应该保证为1,因为如果大于1或小于1,在进行卷积操作之后(本质上是加权求和的计算),就会改变图像整体的亮度,也就是像素值会进行了整体的偏移,所以卷积核的权值之和应该保证为1,从而均值也就跟着确定了。
在图像卷积中更重要的是另一个参数——方差,对于方差,我们知道,方差越小,数据越稳定,也就是数据分布更集中一些,方差越大,数据分布也就越分散,如图所示:
从中我们可以看到,在卷积核大小一样时,方差越大,卷积核给边缘值的权重也会越大,因此,从卷积效果上来说,对图像平滑的也就更厉害。因此,需要根据现实中对平滑效果的需求来选择卷积核方差的大小。
除了卷积核权值分布符合高斯分布之外,卷积核的大小也是一个重要的参数,在实际中,通常依据 3 − σ 3-\sigma 3−σ准则将卷积核大小设置为 ( 2 × 3 σ + 1 ) × ( 2 × 3 σ + 1 ) (2\times3\sigma+1)\times(2\times3\sigma+1) (2×3σ+1)×(2×3σ+1)。
对于生活中大部分的噪声,我们都可以看作是高斯噪声,因此使用高斯滤波器能够产生很好地去噪效果。但是也有其他类型的噪声,在高斯滤波之后仍然不能达到理想的效果,这时就需要构造别的卷积核。
有另外一种常见的噪声类型——椒盐噪声,其在某些点会有异常大或异常小的值,如图所示:
使用中值滤波器,卷积后的像素值为卷积核对应区域内所有值的中间值,这一滤波器对椒盐噪声的去噪效果尤其的好,如图:
其原理我们可以通过下图来理解:
从上图可以看出,当输入值中有异常的极值时,中值滤波器会很好的处理掉,并且不会影响到正常的突变值(如果取均值就会因为异常值影响到周围的值)。
卷积操作与图像的边缘检测也有着紧密的联系。图像的边缘可以看作就是像素值突变的地方,而对于数值的突变,我们很容易就能想到的是——梯度。
梯度是一个矢量,其方向就是方向导数变化最快的方向,沿某一方向的偏导数定义如下: ∂ f ( x , y ) ∂ x = l i m ε → 0 f ( x + ε , y ) − f ( x , y ) ε {\partial f(x,y)\over {\partial x}}=lim_{\varepsilon \to 0}{{f(x+ \varepsilon ,y)-f(x,y)}\over \varepsilon} ∂x∂f(x,y)=limε→0εf(x+ε,y)−f(x,y)其中, ε \varepsilon ε表示 x x x方向的变化值,在计算机中,我们可以直接令变化值为1,即: ∂ f ( x , y ) ∂ x ≈ f ( x + 1 , y ) − f ( x , y ) 1 {\partial f(x,y)\over {\partial x}}\approx {{f(x+ 1 ,y)-f(x,y)}\over 1} ∂x∂f(x,y)≈1f(x+1,y)−f(x,y)观察上式,求导就被简化为了 x x x方向上后面的值减去前一个值。这用卷积其实很容易表示,就是通过这样的卷积核:
左图使用右边的值减去左边的值,能检测出纵向的边缘;右图是用上面的值减去下面的值,能够检测横向的边缘。另外也可以设置卷积核检测45度或125度方向的边缘:
通常只需要综合 x 和 y x和y x和y方向求出梯度值,便可以表示出某一点的边缘“强度”。
以上就简单的介绍了卷积在边缘检测中的应用,除此之外,在检测过程中还有去噪、检测阈值设置等很多方面需要考虑,我们以后可以在继续讨论。
文中使用的图片大部分来自S. Lazebnik