[英]Speed up iteration over Numpy arrays / OpenCV cv2 image
我有3個numpy形狀的陣列>(500,500)。 我試圖同時迭代它們。 我嘗試過兩種不同的方法,但兩種方法都很慢。
這里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 seconds
方法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 seconds
來迭代相同大小的圖像。
有沒有其他方法可以減少迭代所需的時間?
組態:
首先,您可以使用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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.