将 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)
我正在使用 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)