如何实现图像的相关内核

时间:2014-07-10 18:40:10

标签: matlab image-processing signal-processing

我读了一篇关于定义的相关内核的文章: W(X-Y)=(α/ 1 + d(| X-Y |)) 其中α=(∫(1 + d(y-x)dy)-1,(d(| y-x |))是距中心像素的空间欧几里德距离。 给出一个图像I.你能帮我用matlab代码实现内核与图像的卷积。非常感谢你

1 个答案:

答案 0 :(得分:1)

OK!抱歉耽搁了。参考论文,卷积内核可以写成:

eqn1

d(|y-x|)是中心像素y与内核x中的位置之间的欧几里德距离。 \alpha用于确保内核下的整个区域为1.但是,您没有指定此内核 big 的方式。因此,我们将分别将此内核的行和列指定为MN。我们还假设每个维度的内核大小为奇数。原因是因为内核的形状将是一个均匀的方形并使实现更容易。因此,以下是我要执行此操作的步骤:

  1. 定义XY坐标的网格,并确保中心像素为0。
  2. 计算卷积内核中的每个术语,不用 \alpha术语。
  3. 总结内核中的所有术语,然后按此术语划分此内核中的每个值,以便内核的整个区域为1.
  4. 让我们一步一步地做到这一点:

    第1步

    我们可以使用meshgrid来完成此操作。 meshgrid(在本例中)创建(X,Y)坐标的2D网格。 XX中的每个位置定义了水平坐标,而Y则垂直定义了此位置。通过调用meshgrid(1:m, 1:n),我为n x mX创建了Y网格,其中X的每一行从1进展到mY的每一列从1进展到n。因此,这些都是n x m矩阵。通过m = 4n = 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),并确保XY的大小为奇数。我们说M = 5N = 5。然后,我们可以定义XY坐标,如下所示:

    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
    

    如您所见,XY的中心像素定义为(0,0)。其他任何地方都有(X,Y)个坐标,相对于中心定义

    步骤#2

    我们只需要计算中心像素与内核中每个点之间的欧几里德距离。这可以通过以下方式完成:

    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
    

    步骤#3

    我们需要的最后一步是规范化掩码,使内核的总和为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
    

    这应该最终为您提供您正在寻找的相关内核。您现在可以在卷积中使用它(即使用imfilterconv2)。


    希望我已经充分回答了你的问题。祝你好运!