在純python中無法做到這一點(即不刪除for循環)。 Python的for循環結構有太多事情要做得很快。如果你真的想保留for循環,唯一的解決方案是numba或者cython,但是它們有自己的問題。通常,這樣的循環是用c/C++編寫的(在我看來最直接),然後從python調用,它的主要作用是腳本語言。
話雖如此,opencv + numpy提供了足夠的有用的例程,以便在90%的情況下,可以簡單地使用內置函數,而不必訴諸編寫自己的像素級代碼。
下面是在不改變循環代碼的情況下在numba中的解決方案。在我的電腦上,它比純Python快150倍。
import numpy as np, cv2 as cv
from time import time
from numba import jit,int_,uint8
@jit(argtypes=(uint8[:,:,:],int_[:]),
locals=dict(intensity=int_),
nopython=True
)
def numba(img,bins):
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
intensity = 0
for k in range(0, len(img[i][j])):
intensity += img[i][j][k]
bins[intensity/3] += 1
def python(img,bins):
for i in range(0, img.shape[0]):
for j in range(0, img.shape[1]):
intensity = 0
for k in range(0, len(img[i][j])):
intensity += img[i][j][k]
bins[intensity/3] += 1
img = cv.imread("image.jpg")
bins = np.zeros(256, np.int32)
t0 = time()
numba(img,bins)
t1 = time()
#print bins
print t1 - t0
bins[...]=0
t0 = time()
python(img,bins)
t1 = time()
#print bins
print t1 - t0
http://stackoverflow.com/a/14728935/995394也許這是有幫助的。 – iMom0
使用3個嵌套'for'循環,您的算法在O(n^3)時間執行,這非常緩慢。 – geoff
這與您的原始問題並不完全相關,但考慮使用更好的算法來生成直方圖。由於您可能對顏色有所感興趣,因此您可以嘗試使用亮度計算:http://geekoverflow.com/questions/596216/formula-to-determine-brightness-of-rgb-color – akirilov