2

行列の勾配を計算する必要があり(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]])

エラーはどこにありますか?

4

1 に答える 1

5

この小さな画像 (3x3) では、中央のピクセル以外のすべてが境界条件の対象となり、結果はほとんど無意味になります。

とにかく、明らかにするためのドキュメントをざっと見てください:numpy.gradient

勾配は、内部の中央差分と境界での最初の差分を使用して計算されます。

つまり、画像全体で固定された畳み込みカーネルを使用しません。(array(i+1,j) - array(i-1,j)) / 2内部ポイントと(array(i,j) - array(i-1,j)境界ポイントの場合は、単純にそうするように聞こえます。

于 2012-06-05T13:33:09.267 に答える