图像卷积、相关以及在MATLAB中的操作

图像卷积、相关以及在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句话:

  1. 很多中文书里(数字图象处理一类)讲的卷积过滤其实应当叫做相关过滤
  2. 平时滤波最常用的是相关滤波,也就是“覆盖位相乘,然后累加”
  3. MATLAB中的写法为imfilter(f, w, \'replicate\')

ref

https://www.zhihu.com/question/29121110