卷积图像滤波器实现公式

时间:2018-01-11 03:16:55

标签: matlab image-processing convolution

我需要将均值去除滤镜应用于带卷积的图像。

内核是:

-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. 此外,红利问题:如果像素数相同,过滤后的图片有多大可能不同?

1 个答案:

答案 0 :(得分:2)

convolution定义为

问题1

convolution equation

f 是你的形象,而 g 是你的内核(或者相反,无所谓)。 2D情况类似, t τ是2向量,并使用双积分。请注意 f g 评估中τ的不同符号。这意味着两者中的一个相对于另一个被镜像。

所以你的等式是严格错误的。您正在使用对称内核,因此镜像没有区别,但应该读取等式

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

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

MATLAB's conv2 function采用'full''same''valid'之一的可选参数。默认情况下,'full'执行此操作,它会在图像像素具有某些影响的所有位置计算卷积。输出将为size(f)+size(g)-1'valid'生成较小的图像,不需要在图像域外读取。 'same'生成与输入图像大小相同的图像。