图像卷积、相关以及在MATLAB中的操作
2016年7月11日 20:34:35, By ChrisZZ
区分卷积和相关
图像处理中常常需要用一个滤波器做空间滤波操作。空间滤波操作有时候也被叫做卷积滤波,或者干脆叫卷积(离散的卷积,不是微积分里连续的卷积);滤波器也有很多名字:卷积模版、卷积核、掩模、窗口等。
空间滤波可以分为线性滤波和非线性滤波。非线性滤波常见的有中值滤波、最大值滤波等,相当于自定义一个函数,在数学上由于不满足线性变换因此叫做非线性滤波。这里不细研究它。
线性滤波则通常是:将模版覆盖区域内的元素,以模版中对应位置元素为权值,进行累加。看起来挺简单的,但是要区分相关(cross-correlation)和卷积(convolution)两种模式。为什么呢?因为在MATLAB里是有所区分的,而且不少中文书里面把它们混淆了。
我们最容易的理解是:将模版中元素从左到右、从上到下,作为使用顺序,那么卷积操作的结果,就是模版第一个元素乘以它覆盖的元素,加上模版第二个元素乘以它覆盖的元素,再加上模版第三个元素乘以它覆盖的元素,...,一直加到模版最后一个元素乘以它覆盖的元素。好吧,其实就是:模版覆盖区域内,元素逐一相乘然后累加,此时的对应位置就是上下投影后被覆盖的位置。
上面这个理解确实是看起来最容易理解的,因而很多中文书把它叫做"卷积"。然而这个概念其实叫做相关,而卷积则相当于:将同样的模版旋转180°后,再做"相关"操作。当然,如果模版是180°对称的那么卷积和相关是相同的。但是并不是所有的模版都对称。因此,我建议,在滑窗操作、计算图像梯度等场合,不要使用“卷积”,而要使用“滤波”或者“相关”。因为,我们通常讲的卷积,其实是相关,那就不要用卷积这个词以免引起混淆。
MATLAB下的操作
在MATLAB中用imfilter
来实现线性空间滤波:
imfilter(f, w, filtering_mode, boundary_options, size_options)
f:图像
w:滤波模版
filtering_mode:滤波模式
'corr':相关滤波。[默认值]
'conv':卷积滤波。
boundary_options:边界选项
P:(没有引号)边界外围补充0。[默认值]
'replicate':边界外围复制边界值
'symmetric':边界外围使用边界镜像
'circular':图像的大小通过讲图像处理为二维周期函数的一个周期来扩展(这是什么?)
size_options:大小选项
'same':输出大小与输入图像f大小相同。[默认值]
'full':输出与扩展(填充)后的图像大小相同。
最常用的是这句:
imfilter(f, w, 'replicate') %相关滤波,边界外围填充0,输出大小与输入图像f相同
当然,如果硬要做真正的卷积滤波,除了指定imfilter
中的的conv
参数,也可以先将模版旋转180°:
rotated_filter=flipud(fliplr(filter))
总结
说了这么多废话,总结起来就是3句话:
- 很多中文书里(数字图象处理一类)讲的卷积过滤其实应当叫做相关过滤
- 平时滤波最常用的是相关滤波,也就是“覆盖位相乘,然后累加”
- MATLAB中的写法为
imfilter(f, w, 'replicate')