我读了一篇关于定义的相关内核的文章: W(X-Y)=(α/ 1 + d(| X-Y |)) 其中α=(∫(1 + d(y-x)dy)-1,(d(| y-x |))是距中心像素的空间欧几里德距离。 给出一个图像I.你能帮我用matlab代码实现内核与图像的卷积。非常感谢你
答案 0 :(得分:1)
OK!抱歉耽搁了。参考论文,卷积内核可以写成:
d(|y-x|)
是中心像素y
与内核x
中的位置之间的欧几里德距离。 \alpha
用于确保内核下的整个区域为1.但是,您没有指定此内核 big 的方式。因此,我们将分别将此内核的行和列指定为M
和N
。我们还假设每个维度的内核大小为奇数。原因是因为内核的形状将是一个均匀的方形并使实现更容易。因此,以下是我要执行此操作的步骤:
X
和Y
坐标的网格,并确保中心像素为0。\alpha
术语。让我们一步一步地做到这一点:
我们可以使用meshgrid
来完成此操作。 meshgrid
(在本例中)创建(X,Y)
坐标的2D网格。 X
为X
中的每个位置定义了水平坐标,而Y
则垂直定义了此位置。通过调用meshgrid(1:m, 1:n)
,我为n x m
和X
创建了Y
网格,其中X
的每一行从1进展到m
,Y
的每一列从1进展到n
。因此,这些都是n x m
矩阵。通过m = 4
和n = 4
来计算上述内容:
m = 4;
n = 4;
[X,Y] = meshgrid(1:m, 1:n)
X =
1 2 3 4
1 2 3 4
1 2 3 4
1 2 3 4
Y =
1 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
因此,我们只需修改此内容,但我们确保中心位于(0,0)
,并确保X
和Y
的大小为奇数。我们说M = 5
和N = 5
。然后,我们可以定义X
和Y
坐标,如下所示:
M = 5;
N = 5;
[X,Y] = meshgrid(-floor(N/2):floor(N/2), -floor(M/2):floor(M/2))
X =
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
-2 -1 0 1 2
Y =
-2 -2 -2 -2 -2
-1 -1 -1 -1 -1
0 0 0 0 0
1 1 1 1 1
2 2 2 2 2
如您所见,X
和Y
的中心像素定义为(0,0)
。其他任何地方都有(X,Y)
个坐标,相对于中心定义 。
我们只需要计算中心像素与内核中每个点之间的欧几里德距离。这可以通过以下方式完成:
dis = sqrt(X.^2 + Y.^2)
dis =
2.8284 2.2361 2.0000 2.2361 2.8284
2.2361 1.4142 1.0000 1.4142 2.2361
2.0000 1.0000 0 1.0000 2.0000
2.2361 1.4142 1.0000 1.4142 2.2361
2.8284 2.2361 2.0000 2.2361 2.8284
进行一些快速计算检查,您可以看到这与我们对欧几里德距离的理解一致。从中心向左移动1是距离1.向左移动1然后向上移动1给我们欧几里德距离\sqrt(1^2 + 1^2) = \sqrt(2) = 1.4142
。对每个元素进行类似的检查将证明这确实是距离中心像素的欧几里德距离场。在我们这样做之后,让我们计算内核术语,不用 \alpha
术语。
kern = 1 ./ (1 + dis)
kern =
0.2612 0.3090 0.3333 0.3090 0.2612
0.3090 0.4142 0.5000 0.4142 0.3090
0.3333 0.5000 1.0000 0.5000 0.3333
0.3090 0.4142 0.5000 0.4142 0.3090
0.2612 0.3090 0.3333 0.3090 0.2612
我们需要的最后一步是规范化掩码,使内核的总和为1.这可以简单地通过以下方式完成:
kernFinal = kern / sum(kern(:))
kernFinal =
0.0275 0.0325 0.0351 0.0325 0.0275
0.0325 0.0436 0.0526 0.0436 0.0325
0.0351 0.0526 0.1052 0.0526 0.0351
0.0325 0.0436 0.0526 0.0436 0.0325
0.0275 0.0325 0.0351 0.0325 0.0275
这应该最终为您提供您正在寻找的相关内核。您现在可以在卷积中使用它(即使用imfilter
或conv2
)。
希望我已经充分回答了你的问题。祝你好运!