Faster way to loop through every pixel of an image in Python?

前端 未结 2 2045
没有蜡笔的小新
没有蜡笔的小新 2020-12-14 22:37

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          


        
相关标签:
2条回答
  • 2020-12-14 22:56

    Use a boolean matrix:

    x, y = (image > limit).nonzero()
    vals = image[x, y]
    
    0 讨论(0)
  • 2020-12-14 23:04

    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.

    0 讨论(0)
提交回复
热议问题