将 2D Numpy 像素数组的坐标传递给距离函数

Pass coordinates of 2D Numpy pixel array to distance function

我正在使用 OpenCV 和 numpy 开发一个图像处理程序。对于大多数像素操作,我可以通过使用 np.vectorize() 来避免嵌套 for 循环,但是我需要实现的函数之一需要作为参数 'distance from center',或者基本上是正在处理的点。

伪示例:

myArr = [[0,1,2]
         [3,4,5]]

def myFunc(val,row,col):
    return [row,col]

f = np.vectorize(myFunc)
myResult = f(myArr,row,col)

我显然无法从向量化数组中获取 elemX 和 elemY,但是在这种情况下我可以使用另一个 numpy 函数还是必须使用 for 循环?有没有办法使用 openCV 来实现?

我需要让每个像素都通过的函数是: f(i, j) = 1/(1 + d(i, j)/L) , d(i,j) 是点到图像中心的欧氏距离。

您可以使用以下几行获取距中心距离的数组(这是一个示例,有很多方法可以做到这一点):

    import numpy as np

myArr = np.array([[0,1,2], [3,4,5]])

nx, ny = myArr.shape
x = np.arange(nx) - (nx-1)/2.  # x an y so they are distance from center, assuming array is "nx" long (as opposed to 1. which is the other common choice)
y = np.arange(ny) - (ny-1)/2.
X, Y = np.meshgrid(x, y)
d = np.sqrt(X**2 + Y**2)

#  d = 
#  [[ 1.11803399  1.11803399]
#   [ 0.5         0.5       ]
#   [ 1.11803399  1.11803399]]

然后你可以通过以下方式计算f(i, j)

f = 1/(1 + d/L)


顺便说一句,您对 np.vectorize() 的大量使用有点可疑。你确定它在做你想做的事吗,你有没有注意到来自 the documentation:

的声明

The vectorize function is provided primarily for convenience, not for performance. The implementation is essentially a for loop.

通常最好只以矢量化形式编写代码(就像我上面的 f 行一样,无论 L 是数组还是缩放器,它都可以工作),而不是使用 numpy.vectorize(),这些是不同的东西。

np.vectorize代码不要加速,可以这样向量化,`

# This compute distance between all points of MyArray and the center

dist_vector= np.sqrt(np.sum(np.power(center-MyArray,2),axis=1))


# F will contain the target value for each point

F = 1./(1 + 1. * dist_vector/L)