通过卷积掩模进行梯度计算

no_*_*ame 2 python gradient mask convolution

我需要计算矩阵的梯度(3,3),说a=array([[1,4,2],[6,2,4],[7,5,1]]).

我只是用:

from numpy import *
dx,dy = gradient(a)
>>> dx
   array([[ 5. , -2. ,  2. ],
   [ 3. ,  0.5, -0.5],
   [ 1. ,  3. , -3. ]])
>>> dy
array([[ 3. ,  0.5, -2. ],
   [-4. , -1. ,  2. ],
   [-2. , -3. , -4. ]])
Run Code Online (Sandbox Code Playgroud)

我知道计算矩阵梯度的一种方法是通过卷积与每个方向的掩模,但结果是不同的

from scipy import ndimage
mx=array([[-1,0,1],[-1,0,1],[-1,0,1]])
my=array([[-1,-1,-1],[0,0,0],[1,1,1]])
cx=ndimage.convolve(a,mx)
cy=ndimage.convolve(a,my)
>>> cx
array([[-2,  0,  2],
   [ 3,  7,  4],
   [ 8, 14,  6]])
>>> cy
array([[ -8,  -5,  -2],
   [-13,  -6,   1],
   [ -5,  -1,   3]])
Run Code Online (Sandbox Code Playgroud)

错误在哪里?

Oli*_*rth 5

对于这个小(3x3)的图像,除了中心像素之外的所有像素都将受到边界条件的影响,使得结果毫无意义.

但无论如何,快速查看文档numpy.gradient揭示:

使用内部的中心差异和边界处的第一个差异来计算梯度.

换句话说,它不会在整个图像中使用固定的卷积内核.听起来它只是(array(i+1,j) - array(i-1,j)) / 2内部点和(array(i,j) - array(i-1,j)边界点.