在Python中更快地遍历图像的每个像素?

2024-05-16 06:35:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要遍历2560x2160二维numpy数组(图像)的每个像素。我的问题的简化版本如下:

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

在我的电脑上,这要花上令人讨厌的~30秒才能完成。(核心i7,8GB内存) 有没有一种更快的方法用内部“if”语句执行这个循环?我只对超过某个限制的像素感兴趣,但我需要它们的(x,y)索引和值。


Tags: 图像import版本numpyforiftimeas
2条回答

使用布尔矩阵:

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

首先,尝试使用矢量化计算:

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

如果无法通过矢量化计算解决问题,可以将for循环加速为:

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

或:

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

numpy.ndenumerate速度很慢,通过使用normal for循环并通过item方法从数组中获取值,可以将循环加速4倍

如果你需要更高的速度,尝试使用Cython,它会使你的代码和C代码一样快。

相关问题 更多 >