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

时间:2015-06-06 20:57:21

标签: python opencv numpy pixel euclidean-distance

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

Pseudoexample:

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)是该点距图像中心的欧氏距离。

2 个答案:

答案 0 :(得分:1)

你可以使用以下几行从中心获得一个距离数组(这是一个例子,有很多方法可以做到这一点):

    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的陈述:

  

提供矢量化功能主要是为了方便,而不是为了提高性能。实现基本上是for循环。

通常更好的方法是以矢量化形式编写代码(就像上面的f行,无论L是数组还是缩放器都可以使用),而不是使用{ {1}},这些是不同的事情。

答案 1 :(得分:1)

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)