我正在使用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)是该点距图像中心的欧氏距离。
答案 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)