在python中迭代图像的所有像素的最快方法

Posted

技术标签:

【中文标题】在python中迭代图像的所有像素的最快方法【英文标题】:fastest way to iterate over all pixels of an image in python 【发布时间】:2018-01-03 08:56:33 【问题描述】:

我已经将图像作为数组读取:

import numpy as np
from scipy import misc
face1=misc.imread('face1.jpg')

face1 尺寸为(288, 352, 3)

我需要遍历每个像素并在训练集中填充y 列,我采用了以下方法:

Y_training = np.zeros([1,1],dtype=np.uint8)

for i in range(0, face1.shape[0]): # We go over rows number 
    for j in range(0, face1.shape[1]): # we go over columns number
        if np.array_equiv(face1[i,j],[255,255,255]):
           Y_training=np.vstack(([0], Y_training))#0 if blank
        else:
           Y_training=np.vstack(([1], Y_training))

b = len(Y_training)-1
Y_training = Y_training[:b]
np.shape(Y_training)`

Wall time: 2.57 s

由于我需要对大约 2000 张图像进行上述处理,有没有更快的方法可以将运行时间减少到毫秒或纳秒

【问题讨论】:

对于未来的类似问题,您可能想尝试 numba @njit 装饰器。这样你就可以得到一个运行非常快的 JIT 编译函数 【参考方案1】:

您可以使用broadcasting 对白色像素执行广播比较:[255, 255, 255]ALL 使用.all(axis=-1) 减少每一行,最后转换为int dtype。这将为我们提供退出循环后的输出。

因此,一种实现方式是 -

(~((face1 == [255,255,255]).all(-1).ravel())).astype(int)

或者,更紧凑的版本 -

1-(face1 == [255,255,255]).all(-1).ravel()

【讨论】:

我认为应该是(~((face1 != [255,255,255]).all(-1).ravel())).astype(int),因为我需要用0标记白色像素 @sanaz 不。请再次检查。 (~((face1 == [255,255,255]).all(-1).ravel())).astype(int) 返回 array([1, 1, 1, ..., 1, 1, 1])1 标记白色像素,我自己的 for 循环方法用 0 标记它们 @sanaz 在您的最后尝试一个小样本:face1 = np.random.randint(0,255,(4,5,3))。然后将两个像素设置为白色:face1[2,3] = [255,255,255]; face1[1,2] = [255,255,255]。现在,将第三个像素设置为蓝色:face1[1,3] = [255,0,0]。所以,现在使用你拥有的所有方法,看看哪些方法给你的数组正好有两个 0。这些是正确的。 将结果作为列向量而不是行向量的最有效方法是什么?有(101376,1) 而不是(101376,)

以上是关于在python中迭代图像的所有像素的最快方法的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 获取二进制图像中白色像素数量的最快方法

opencv学习笔记访问图像中像素的三种方式ROI区域图像叠加和图像混合

opencv之访问图像像素

以最快的速度获取字符串中图像的所有像素数据

在 Python 或 C++ 中获取像素颜色的最快方法?

Java - 从图像中获取像素数组