在Python中实现渐变运算符

时间:2015-07-09 15:58:01

标签: python numpy

我正在使用计算机视觉系统,这给我带来了严重的麻烦。我无法更有效地重新实现旧的渐变运算符,我正在使用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数组。

1 个答案:

答案 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