使用梯度计算拉普拉斯算子

Compute laplacian using gradient

我正在尝试使用 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

首先,有一些标志问题。与 [-1 1] 卷积得到带负号的一阶导数:卷积翻转两个数组中的一个,这样你就可以从下一个数组中减去每个元素。与 [1 -1] 卷积得到一阶导数。对于二阶导数,使用 [1 -2 1]。

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

由于在一维数组上已经可以看到问题,因此我将重点关注您的第一行。让我们暂时删除参数 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]  

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

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 具有大部分相同的数字,除了未对齐。


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

 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)