2012-10-03 4 views
1
나는 2 가지 방법으로 파이썬 이미징 라이브러리 이미지의 평균 RGB 값의 계산을 구현

:벤치마킹 기능

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를 사용합니까? 평균 계산을 구현하는 더 좋은 방법이 있습니까?

답변

2

놀랍습니다.

tuple(im.mean(axis=0)) 

이 평균 (r,g,b) 계산하기 위해,하지만 난 거 것들을 많이 향상있어 의심 :

당신은 사용할 수 있습니다. getAverageRGBN을 프로파일 링하여 병목 현상을 찾으려고 했습니까?

+0

이는 것 (np.uint8가) image.getdata() 메모리가 어쩌면 np.asarray (이미지), 재 할당 또는 np.array에 대해 아마 더 잘해라. – lolopop

+0

나는'평균'으로 명확한 개선을 본다. 나는 파이썬에서 많은 프로파일 링을하지 못했다. –

+0

@MV Python과 함께 제공되는 일부 [프로파일 러] (http://docs.python.org/library/profile.html)가 있고 ['line_profiler']와 같은 제삼자 패키지를 설치할 수도 있습니다 (http : // packages.python.org/line_profiler/) :이 후자는 꽤 좋습니다. –

0

getAverageRGBN을 차원을 변경하거나 작성 O/w 한 라이너 :

np.array(image).mean(axis=(0,1)) 

다시, 어떤 성능을 개선하지 않을 수 있습니다.

PIL 또는 베개에서
0

, 3.4 이상 파이썬 :

from statistics import mean 
average_color = [mean(image.getdata(band)) for band in range(3)]