【问题标题】:Compute laplacian using gradient使用梯度计算拉普拉斯算子
【发布时间】:2015-09-27 15:39:23
【问题描述】:

我正在尝试使用 3 种不同的方法获得拉普拉斯算子,以防 1 和 2 结果相同,但 3 有什么问题?

这是 Matlab 中的代码:

m= magic(6)

Lap1Dx= convn(m,[-1 2 -1],'same')
Lap1Dy= convn(m,[-1;2;-1],'same')

%ver1
Lap2Dxy= convn(m,[0 -1 0;-1 4 -1;0 -1 0],'same')

%ver2
Lap2Dxy= Lap1Dx+Lap1Dy %same as ver 1

%ver 3
%get laplacian using gradients
gradx= convn(m,[-1 1],'same')
grady= convn(m,[-1;1],'same')

gradxx= convn(gradx,[-1 1],'same')
gradyy= convn(grady,[-1;1],'same')

Lap2Dxy= gradxx+gradyy

输出:

m =

   35    1    6   26   19   24
    3   32    7   21   23   25
   31    9    2   22   27   20
    8   28   33   17   10   15
   30    5   34   12   14   16
    4   36   29   13   18   11

Lap1Dx =

   69  -39  -15   27  -12   29
  -26   54  -39   12    0   27
   53  -15  -27   15   12   13
  -12   15   21   -9  -12   20
   55  -54   51  -24    0   18
  -28   39    9  -21   12    4

Lap1Dy =

   67  -30    5   31   15   23
  -60   54    6   -6    0    6
   51  -42  -36    6   21    0
  -45   42   30    0  -21   -6
   48  -54    6   -6    0    6
  -22   67   24   14   22    6

Lap2Dxy =

   136   -69   -10    58     3    52
   -86   108   -33     6     0    33
   104   -57   -63    21    33    13
   -57    57    51    -9   -33    14
   103  -108    57   -30     0    24
   -50   106    33    -7    34    10

Lap2Dxy =

   136   -69   -10    58     3    52
   -86   108   -33     6     0    33
   104   -57   -63    21    33    13
   -57    57    51    -9   -33    14
   103  -108    57   -30     0    24
   -50   106    33    -7    34    10

gradx =

   34   -5  -20    7   -5   24
  -29   25  -14   -2   -2   25
   22    7  -20   -5    7   20
  -20   -5   16    7   -5   15
   25  -29   22   -2   -2   16
  -32    7   16   -5    7   11

grady =

   32  -31   -1    5   -4   -1
  -28   23    5   -1   -4    5
   23  -19  -31    5   17    5
  -22   23   -1    5   -4   -1
   26  -31    5   -1   -4    5
    4   36   29   13   18   11

gradxx =

   39   15  -27   12  -29   24
  -54   39  -12    0  -27   25
   15   27  -15  -12  -13   20
  -15  -21    9   12  -20   15
   54  -51   24    0  -18   16
  -39   -9   21  -12   -4   11

gradyy =

   60  -54   -6    6    0   -6
  -51   42   36   -6  -21    0
   45  -42  -30    0   21    6
  -48   54   -6    6    0   -6
   22  -67  -24  -14  -22   -6
    4   36   29   13   18   11

Lap2Dxy =

    99   -39   -33    18   -29    18
  -105    81    24    -6   -48    25
    60   -15   -45   -12     8    26
   -63    33     3    18   -20     9
    76  -118     0   -14   -40    10
   -35    27    50     1    14    22

【问题讨论】:

  • 这与您如何计算导数有关。您正在使用向后有限差分,尝试与其他人(我现在无法运行 Matlab)。
  • @AnderBiguri 你的意思是 [1 -1] 而不是 [-1 1]?
  • [-1 0 1],或您可以找到的任何可能的导数离散逼近版本。

标签: matlab math image-processing computer-vision convolution


【解决方案1】:

首先,有一些标志问题。与 [-1 1] 卷积为您提供带有减号的一阶导数:卷积翻转两个数组中的一个,因此您最终从下一个数组中减去每个元素。与 [1 -1] 卷积得到一阶导数。对于二阶导数,使用 [1 -2 1]。

但这里的主要问题与截断(“相同”参数)有关。使用前两种方法,您先进行卷积然后截断。对于第三个,您进行卷积,然后截断,然后再次卷积并再次截断。

由于问题已经在一维数组上可见,因此我将重点关注您的第一行。现在让我们删除参数same

m = [35    1    6   26   19   24]
mx = convn(m,[1 -1])        //  [35 -34   5  20  -7   5  -24]
mxx = convn(mx,[1 -1])      //  [35 -69  39  15 -27  12  -29  24]
m2x = convn(m,[1 -2 1])     //  [35 -69  39  15 -27  12  -29  24]  

如您所见,结果是相同的。接下来,使用“相同”参数:

mx = convn(m,[1 -1],'same')        //  [-34   5  20  -7   5  -24]
mxx = convn(mx,[1 -1],'same')      //  [39  15  -27  12 -29  24]
m2x = convn(m,[1 -2 1],'same')     //  [-69  39  15 -27  12  -29]  

对于 m2x,'same' 干净利落地选取全卷积的中间部分,这正是您想要的部分。

但是对于一阶导数,只有一个元素要删除。必须做出选择,并且 convn 丢弃第一个(导致前向差异)。在计算 mxx 时,它必须再次。因此,由于两次删除全卷积的第一个元素,您最终得到了一个移位数组。这就是为什么 mxx 与 m2x 具有大部分相同的数字,除了未对齐。


如果您坚持使用两步卷积(一阶导数,然后是二阶),则第一个卷积必须没有任何截断。否则,截断会影响第二次卷积的结果。对于第二个,您可以使用“相同”,但此外,需要删除最后一个元素。像这样。

 mx = convn(m, [1 -1])
 mxx = convn(mx,[1 -1],'same')
 mxx = mxx(1:end-1)

或者,等价的,

 mx = convn(m, [1 -1])
 mxx = convn(mx,[1 -1])
 mxx = mxx(2:end-1)

【讨论】:

  • 二维表壳呢?如果我删除“相同”,则 Lap1Dx 和 Lap1Dy 的大小不同,我无法添加它们。
  • 我不是说你应该放弃'same'。我试图解释为什么前两种方法给出了正确的结果,而第三种方法却没有:因为不对称截断。
  • 我明白你的意思,但我不明白如何解决它,我应该采取结果的哪一部分而不是像“相同”那样的中心部分?
  • 查看分隔符后添加的部分。 (也就是说,我不知道您为什么要这样做:通常二阶导数在离散设置中比一阶导数工作更好。直接求二阶导数非常有意义。)
  • 因为需要改变梯度场,所以需要这个计算梯度的中间步骤。
猜你喜欢
  • 2020-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多