簡體   English   中英

在Python中循環遍歷圖像的每個像素的更快方法?

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

我需要遍歷2560x2160 2D 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)索引和值。

使用布爾矩陣:

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代碼一樣快。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM