我需要计算矩阵(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. ]])
我知道计算矩阵梯度的一种方法是使用每个方向的掩码卷积,但结果不同
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]])
错误在哪里?
答案 0 :(得分:5)
对于这个小(3x3)的图像,除了中心像素之外的所有图像都将受到边界条件的影响,使得结果毫无意义。
但无论如何,快速查看the documentation for numpy.gradient
会发现:
使用内部的中心差异和边界处的第一个差异计算梯度。
换句话说,它不会在整个图像中使用固定的卷积内核。听起来它对于内部点只有(array(i+1,j) - array(i-1,j)) / 2
,对于边界点只有(array(i,j) - array(i-1,j)
。