卷积图像滤波器实现公式

Convolution image filter implementation formula

我需要对带卷积的图像应用均值去除滤波器。

内核是:

-1 -1 -1           k11 k12 k13 
-1  9 -1   (coord) k21 k22 k23
-1 -1 -1           k31 k32 k33

Factor = 1, Offset = 0

如果我的矩阵坐标是

m11 m12 m13
m21 m22 m23
m31 m32 m33

1.为了计算结果像素(从矩阵的中心开始),公式不应该是这样的吗?

pixel = m11 * k11 + m12 * k12 + m13 * k13
      + m21 * k21 + m22 * k22 + m23 * k23
      + m31 * k31 + n32 * k32 + m33 * k33

pixel /= factor
pixel += offset

图像看起来不错,但如果我使用 diff.

将我过滤后的图像与其他程序过滤后的图像进行比较,会有细微的变化

2.新的像素值应该放回输入矩阵,以便用于下一个像素的计算?

3.另外,加分问题:如果像素数相同,怎么可能过滤后的图片大小不一样?

convolution定义为

问题 1

f 是你的图像,g 是你的内核(或者反过来,真的没关系)。二维情况类似,tτ 是 2 向量,并使用二重积分。请注意 τfg 的计算中的不同符号。这意味着两者之一正在相对于另一个进行镜像。

所以你的等式是完全错误的。您使用的是对称内核,因此镜像没有区别,但等式应显示为

pixel = m11 * k33 + m12 * k32 + m13 * k31
      + m21 * k23 + m22 * k22 + m23 * k21
      + m31 * k13 + n32 * k12 + m33 * k11

offset值在卷积中没有作用,factor可以和核值混入kxx:

pixel = ( m11*k33 + m12*k32 + m13*k31 ) * factor

相同
pixel = m11*k33*factor + m12*k32*factor + m13*k31*factor

因此您可以在计算卷积之前将所有 kxx 与因子预乘。

问题 2

不,应该将新像素值写入新图像。如果将其写回输入图像,计算下一个像素的结果时将使用该值,因此您会得到错误的结果。

问题 3

图像边缘一个像素的卷积运算结果为"out of bounds"。它需要读取图像外部像素的值。您可以选择在那里读取 0,或以其他方式填充值。相反,一些软件选择不计算这些像素,从而产生较小的输出图像。有些软件实际上会计算更多的像素,如果你用零扩展图像,图像外一个像素的卷积结果会读取图像边缘的一些像素。

MATLAB's conv2 function 接受一个可选参数,它是 'full''same''valid' 之一。 'full',这是默认值,做最后一件事,计算图像像素有一定影响的所有位置的卷积。输出将是 size(f)+size(g)-1'valid' 生成较小的图像,不需要在图像域之外读取。 'same' 生成与输入图像大小相同的图像。