卷积图像滤波器实现公式
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 向量,并使用二重积分。请注意 τ 在 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
图像边缘一个像素的卷积运算结果为"out of bounds"。它需要读取图像外部像素的值。您可以选择在那里读取 0,或以其他方式填充值。相反,一些软件选择不计算这些像素,从而产生较小的输出图像。有些软件实际上会计算更多的像素,如果你用零扩展图像,图像外一个像素的卷积结果会读取图像边缘的一些像素。
MATLAB's conv2
function 接受一个可选参数,它是 'full'
、'same'
或 'valid'
之一。 'full'
,这是默认值,做最后一件事,计算图像像素有一定影响的所有位置的卷积。输出将是 size(f)+size(g)-1
。 'valid'
生成较小的图像,不需要在图像域之外读取。 'same'
生成与输入图像大小相同的图像。
我需要对带卷积的图像应用均值去除滤波器。
内核是:
-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 向量,并使用二重积分。请注意 τ 在 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
图像边缘一个像素的卷积运算结果为"out of bounds"。它需要读取图像外部像素的值。您可以选择在那里读取 0,或以其他方式填充值。相反,一些软件选择不计算这些像素,从而产生较小的输出图像。有些软件实际上会计算更多的像素,如果你用零扩展图像,图像外一个像素的卷积结果会读取图像边缘的一些像素。
MATLAB's conv2
function 接受一个可选参数,它是 'full'
、'same'
或 'valid'
之一。 'full'
,这是默认值,做最后一件事,计算图像像素有一定影响的所有位置的卷积。输出将是 size(f)+size(g)-1
。 'valid'
生成较小的图像,不需要在图像域之外读取。 'same'
生成与输入图像大小相同的图像。