使用渐变计算拉普拉斯

时间:2015-07-09 10:14:15

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

我正在尝试使用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 个答案:

答案 0 :(得分:2)

首先,有一些标志问题。与[-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'干净地选择完整卷积的中间部分,这正是你想要的部分。

但对于一阶导数,只有一个要素可以下降。必须做出选择,并且丢弃第一个(导致前向差异)。计算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)