我正在使用计算机视觉系统,这给我带来了严重的麻烦。我无法更有效地重新实现旧的渐变运算符,我正在使用numpy和openCV2。
这就是我所拥有的:
def gradientX(img):
rows, cols = img.shape
out = np.zeros((rows,cols))
for y in range(rows-1):
Mr = img[y]
Or = out[y]
Or[0] = Mr[1] - Mr[0]
for x in xrange(1, cols - 2):
Or[x] = (Mr[x+1] - Mr[x-1])/2.0
Or[cols-1] = Mr[cols-1] - Mr[cols-2]
return out
def gradient(img):
return [gradientX(img), (gradientX(img.T).T)]
我尝试过使用numpy的渐变运算符但结果并不相同 对于此输入
array([[ 3, 4, 5],
[255, 0, 12],
[ 25, 15, 200]])
使用我的gradient
返回
[array([[ 1., 0., 1.],
[-255., 0., 12.],
[ 0., 0., 0.]]),
array([[ 252., -4., 0.],
[ 0., 0., 0.],
[-230., 15., 0.]])]
使用numpy' np.gradient
返回
[array([[ 252. , -4. , 7. ],
[ 11. , 5.5, 97.5],
[-230. , 15. , 188. ]]),
array([[ 1. , 1. , 1. ],
[-255. , -121.5, 12. ],
[ -10. , 87.5, 185. ]])]
结果之间有一些相似之处,但它们肯定不一样。所以我在这里遗漏了一些东西,或者两个运营商并不意味着产生相同的结果。在那种情况下,我想知道如何重新实现我的gradientX函数,因此它不会使用那个看起来很糟糕的双循环来使用大多数numpy的效力遍历2-d数组。
答案 0 :(得分:2)
为了找到我的错误,我已经在这方面做了一些工作。 我在迭代时跳过最后一行和最后一列。正如@wflynny所指出的那样,除了一行和一列零之外,结果是相同的。
如果这样,结果可能与np.gradient不同,但是通过该更改,结果是相同的,因此不需要为此找到任何其他numpy实现。
回答我自己的问题,我的渐变算法的一个好的numpy实现将是
import numpy as np
def gradientX(img):
return np.gradient(img)[::-1]
我还发布了工作代码,只是因为它显示了numpy的渐变运算符是如何工作的
def computeMatXGradient(img):
rows, cols = img.shape
out = np.zeros((rows,cols))
for y in range(rows):
Mr = img[y]
Or = out[y]
Or[0] = float(Mr[1]) - float(Mr[0])
for x in xrange(1, cols - 1):
Or[x] = (float(Mr[x+1]) - float(Mr[x-1]))/2.0
Or[cols-1] = float(Mr[cols-1]) - float(Mr[cols-2])
return out