在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中迭代图像的所有像素的最快方法的主要内容,如果未能解决你的问题,请参考以下文章