Python 加快Numpy阵列/OpenCV cv2图像的迭代速度
我有3个numpy数组的形状>(500500)。我试图同时迭代它们。我试过两种不同的方法,但都很慢 这里的Python 加快Numpy阵列/OpenCV cv2图像的迭代速度,python,performance,opencv,numpy,iteration,Python,Performance,Opencv,Numpy,Iteration,我有3个numpy数组的形状>(500500)。我试图同时迭代它们。我试过两种不同的方法,但都很慢 这里的Ix_Ix_blur,Ix_Iy_blur和Iy_Iy_blur大小相同。我试图找到特征并在OpenCV图像上绘制它 方法1: for i in xrange (Ix_Ix_blur.shape[1]): for j in xrange(Ix_Ix_blur.shape[0]): A = np.array([ [Ix_Ix_blur[j][i], Ix_Iy_blu
Ix_Ix_blur
,Ix_Iy_blur
和Iy_Iy_blur
大小相同。我试图找到特征并在OpenCV图像上绘制它
方法1:
for i in xrange (Ix_Ix_blur.shape[1]):
for j in xrange(Ix_Ix_blur.shape[0]):
A = np.array([ [Ix_Ix_blur[j][i], Ix_Iy_blur[j][i]],
[Ix_Iy_blur[j][i], Iy_Iy_blur[j][i]] ])
detA = (A[0][0]*A[1][1])-(A[0][1]*A[1][0])
traceA = A[0][0]+A[1][1]
harmonic_mean = detA/traceA
if(harmonic_mean > thresh):
cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)
对于大小为512*512的图像,这大约需要7秒
方法2:
Ix_Iy_blur_iter = np.nditer(Ix_Iy_blur)
Iy_Iy_blur_iter = np.nditer(Iy_Iy_blur)
Ix_Ix_blur_iter = np.nditer(Ix_Ix_blur)
while(not Ix_Iy_blur_iter.finished):
try:
A = np.array([[Ix_Ix_blur_iter.next(), Ix_Iy_blur_iter.next()],[Ix_Iy_blur_iter.value, Iy_Iy_blur_iter.next()]])
except StopIteration:
break
detA = (A[0][0]*A[1][1])-(A[0][1]*A[1][0])
traceA = A[0][0]+A[1][1]
harmonic_mean = detA/traceA
if(harmonic_mean > thresh):
i = Ix_Ix_blur_iter.iterindex/Ix.shape[0]
j = Ix_Ix_blur_iter.iterindex - Ix.shape[0]*i
cv2.circle(img, (j,i), 1, (0, 0, 255), -1, 8)
这种方法似乎也需要7秒
来迭代相同大小的图像
有没有其他方法可以减少迭代所需的时间
配置:
- Ubuntu 12.04
- 第三代core i5处理器
- 4 GB内存
- 2 GB ATI RADEON GPU(我已关闭)
Ix_Ix_-blur[j,i]
而不是Ix_-Ix-blur[j][i]
Ix_Ix_blur[j][i]
将创建一个非常慢的临时数组
要使用ndarray加速元素访问,可以使用item()方法,该方法返回python本机数值,并且不需要创建临时数组a。使用本机数值的计算比numpy标量更快
for i in xrange (Ix_Ix_blur.shape[1]):
for j in xrange(Ix_Ix_blur.shape[0]):
a, b, c = Ix_Ix_blur.item(j, i), Ix_Iy_blur.item(j, i), Iy_Iy_blur.item(j, i)
detA = a*c - b*b
traceA = a + c
harmonic_mean = detA/traceA
if harmonic_mean > thresh:
cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)
对于您的特定问题,无需在循环中进行计算,您可以:
detA = Ix_Ix_blur * Iy_Iy_blur - Ix_Iy_blur**2
traceA = Ix_Ix_blur + Iy_Iy_blur
harmonic_mean = detA / traceA
for j, i in np.argwhere(harmonic_mean > thresh):
cv2.circle(img, (i,j), 1, (0, 0, 255), -1, 8)
这太棒了。我没想过这样做。谢谢你的回答。