我一直在研究一種演算法來檢測影像中的文本區域,并實作了兩個函式來查看它們之間的性能差異。
對于第一個,它迭代所有像素并檢查其值在另一個二進制影像中是否為“1”:
for j in range(edgeImage.shape[0]):
for i in range(edgeImage.shape[1]):
if edgeImage[j,i] == 0:
continue
對于第二個,我使用 np.nonzeros 來獲取所有非零像素,因為我不處理零:
edgePointRows, edgePointCols = np.nonzero(edgeImage)
for index in range(len(edgePointRows)):
i = edgePointCols[index]
j = edgePointRows[index]
但是當我將它們與 timeit 進行比較時,第二個需要更長的時間才能完成:
all pixels 3.2452468999999997
relevant pixels 3.463474800000001
我嘗試了更大的影像,如 4056x3040 并看到了差異,但我想知道為什么當影像尺寸減小時它會變慢?
我在回圈或計時上做錯了嗎?
uj5u.com熱心網友回復:
如果nonzero
您正在做更多的作業:您正在回圈影像,查找非零元素,并使用它們的索引創建一個陣列。然后你遍歷這些索引。在另一種情況下,您永遠不會創建該陣列,您只需遍歷影像一次。
但是里面的回圈nonzero
是編譯的,因此速度很快,而普通for
回圈是解釋的 Python 代碼,運行速度要慢得多。該nonzero
案例具有較小的 Python 回圈,因此速度更快。
所以這是一個問題,即案例中完成的額外作業何時與nonzero
較小的 Python 回圈節省的時間相匹配。
uj5u.com熱心網友回復:
numpy
方法在呼叫時有一些開銷(例如陣列的記憶體分配),無論輸入如何,它都需要一個固定的時間'x'。
因此,如果輸入足夠小,純 python 呼叫可以花費不到 'x' 的時間,使其更快。
此外,第二個代碼仍然使用一個for
分配值的回圈,但第一個代碼只有比較。
不建議使用 python 回圈來分配 numpyndarray
的,嘗試使用numpy
方法。
您可以為影像創建蒙版
# mask will be an array of bool, True for every nonzero values, False othervise
mask = imgArray != 0
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/504481.html
上一篇:朱莉婭似乎很慢