在纯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