sanaz sanaz - 2 years ago 80
Python Question

fastest way to iterate over all pixels of an image in python

i have already read an image as an array :

import numpy as np
from scipy import misc

face1 dimensions are
(288, 352, 3)

i need to iterate over every single pixel and populate a
column in a training set i took the following approach :

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
Y_training=np.vstack(([1], Y_training))

b = len(Y_training)-1
Y_training = Y_training[:b]

Wall time: 2.57 s

As i need to do above process for about 2000 images is there any faster approach where we could decrease running time to milliseconds or naonseconds

Answer Source

You can use broadcasting to perform broadcasted comparison against the white pixel : [255, 255, 255] and ALL reduce each row with .all(axis=-1) and finally convert to int dtype. This would give us the output you would have right after exiting the loop.

Thus, one implementation would be -

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

Alternatively, a bit more compact version -

1-(face1 == [255,255,255]).all(-1).ravel()
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download