我需要将均值去除滤镜应用于带卷积的图像。
内核是:
-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. 此外,红利问题:如果像素数相同,过滤后的图片有多大可能不同?
答案 0 :(得分:2)
convolution定义为
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
预先乘以因子。
不,应将新像素值写入新图像。如果将其写回输入图像,则在计算下一个像素的结果时将使用该值,因此您将得到错误的结果。
图像边缘处像素的卷积运算结果为“越界”。它需要读取图像外部像素的值。您可以选择在那里读取0,或以其他方式填充值。相反,某些软件会选择不计算这些像素,从而产生较小的输出图像。有些软件实际上会计算更多的像素,如果用零扩展图像,在图像外部的像素处的卷积结果将读取边缘处的一些图像像素。
MATLAB's conv2
function采用'full'
,'same'
或'valid'
之一的可选参数。默认情况下,'full'
执行此操作,它会在图像像素具有某些影响的所有位置计算卷积。输出将为size(f)+size(g)-1
。 'valid'
生成较小的图像,不需要在图像域外读取。 'same'
生成与输入图像大小相同的图像。