1 - 사용 목록
def getAverageRGB(image):
"""
Given PIL Image, return average value of color as (r, g, b)
"""
# no. of pixels in image
npixels = image.size[0]*image.size[1]
# get colors as [(cnt1, (r1, g1, b1)), ...]
cols = image.getcolors(npixels)
# get [(c1*r1, c1*g1, c1*g2),...]
sumRGB = [(x[0]*x[1][0], x[0]*x[1][1], x[0]*x[1][2]) for x in cols]
# calculate (sum(ci*ri)/np, sum(ci*gi)/np, sum(ci*bi)/np)
# the zip gives us [(c1*r1, c2*r2, ..), (c1*g1, c1*g2,...)...]
avg = tuple([sum(x)/npixels for x in zip(*sumRGB)])
return avg
2-
을 NumPy와 사용def getAverageRGBN(image):
"""
Given PIL Image, return average value of color as (r, g, b)
"""
# get image as numpy array
im = np.array(image)
# get shape
w,h,d = im.shape
# change shape
im.shape = (w*h, d)
# get average
return tuple(np.average(im, axis=0))
놀랍게도 # 1이 # 2보다 약 20 % 빠릅니다.
정확하게 numpy를 사용합니까? 평균 계산을 구현하는 더 좋은 방법이 있습니까?
이는 것 (np.uint8가) image.getdata() 메모리가 어쩌면 np.asarray (이미지), 재 할당 또는 np.array에 대해 아마 더 잘해라. – lolopop
나는'평균'으로 명확한 개선을 본다. 나는 파이썬에서 많은 프로파일 링을하지 못했다. –
@MV Python과 함께 제공되는 일부 [프로파일 러] (http://docs.python.org/library/profile.html)가 있고 ['line_profiler']와 같은 제삼자 패키지를 설치할 수도 있습니다 (http : // packages.python.org/line_profiler/) :이 후자는 꽤 좋습니다. –