• [^] # Re: Amélioration du script

    Posté par . En réponse au journal ISS : le flim. Évalué à 4. Dernière modification le 12 août 2012 à 22:29.

    Il faudrait convertir les données en tableau numpy et faire le traitement sans boucle, en utilisant les facilités de numpy.

    Pour convertir je suis tombé sur ça :
    http://code.activestate.com/recipes/577591-conversion-of-pil-image-and-numpy-array/

    Par exemple, une fois que data est converti en un tableau numpy img :

    for x in xrange(W):
     for y in xrange(H):
     acc = sum(data[x+(y*W)])
     if acc > limit: # filter values according to brightness limit
     X[x] += acc
     Y[y] += acc
    # find the brightest column
    for x,v in enumerate(X):
     if v > maxX[0]:
     maxX = (v, x)
    # find the brightest row
    for y,v in enumerate(Y):
     if v > maxY[0]:
     maxY = (v, y)
    
    

    peut être habilement remplacé par :

    img_lim = sum(img, axis=2)
    img_lim[img_lim <= limit] = 0
    X = sum(img_lim, axis=0)
    Y = sum(img_lim, axis=1)
    maxX = (amax(X), argmax(X))
    maxY = (amax(Y), argmax(Y))
    
    

    (sauf erreur de ma part)

    Et ça :

    # if no spot brighter than limit, lower limit, recurse
    if maxX[0] == 0 or maxY[0] == 0:
     print "[ center not found, lower limit to", limit/2, ']',
     return getCenter(im, limit/2)
    
    

    pourrait être testé avant de faire toutes les sommes qui précèdent : il suffit de tester que le pixel maximum soit au-dessus de la limite.