Faster way to loop through every pixel of an image

2019-02-06 21:50发布

I need to loop through each pixel of a 2560x2160 2D numpy array (image). A simplified version of my problem is as follows:

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

This is taking an obnoxious ~30 seconds to complete on my computer. ( Core i7, 8GB ram ) Is there a faster way to perform this loop with an interior 'if' statement? I am only interested in pixels above a certain limit, but I do need their (x,y) indices and value.

2条回答
男人必须洒脱
2楼-- · 2019-02-06 22:19

Use a boolean matrix:

x, y = (image > limit).nonzero()
vals = image[x, y]
查看更多
\"骚年 ilove
3楼-- · 2019-02-06 22:38

First, try to use vectorize calculation:

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

If your problem can't be solve by vectorize calculation, you can speedup the for loop as:

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

or:

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

The numpy.ndenumerate is slow, by using normal for loop and get the value from array by item method you can speedup the loop by 4x.

If you need more speed, try to use Cython, it will make your code as fast as C code.

查看更多
登录 后发表回答