¿Una forma más rápida de recorrer cada píxel de una imagen en Python?

Necesito recorrer cada píxel de una matriz numpy 2D (imagen) de 2560×2160. Una versión simplificada de mi problema es la siguiente:

import time import numpy as np t = time.clock() limit = 9000 for (x,y), pixel in np.ndenumerate(image): if( pixel > limit ) pass tt = time.clock() print tt-t 

Esto está tomando un repugnante ~ 30 segundos para completar en mi computadora. (Core i7, 8GB ram) ¿Hay una forma más rápida de realizar este bucle con una statement ‘if’ interior? Solo me interesan los píxeles por encima de un cierto límite, pero necesito sus índices y valores (x, y).

Utilice una matriz booleana:

 x, y = (image > limit).nonzero() vals = image[x, y] 

Primero, trate de usar el cálculo de vectorización:

 i, j = np.where(image > limit) 

Si su problema no puede resolverse mediante el cálculo de vectorización, puede acelerar el ciclo for como:

 for i in xrange(image.shape[0]): for j in xrange(image.shape[1]): pixel = image.item(i, j) if pixel > limit: pass 

o:

 from itertools import product h, w = image.shape for pos in product(range(h), range(w)): pixel = image.item(pos) if pixel > limit: pass 

El numpy.ndenumerate es lento, al usar normal para bucle y obtener el valor del método de matriz por item , puede acelerar el bucle 4 veces.

Si necesita más velocidad, intente usar Cython, hará que su código sea tan rápido como el código C.