使用梯度计算拉普拉斯算子
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)
我正在尝试使用 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)