Importing PNG files into Numpy?
Solution 1
Using just scipy, glob and having PIL installed (pip install pillow
) you can use scipy's imread method:
from scipy import misc
import glob
for image_path in glob.glob("/home/adam/*.png"):
image = misc.imread(image_path)
print image.shape
print image.dtype
UPDATE
According to the doc, scipy.misc.imread
is deprecated starting SciPy 1.0.0, and will be removed in 1.2.0. Consider using imageio.imread instead
. See the answer by Charles.
Solution 2
According to the doc, scipy.misc.imread
is deprecated starting SciPy 1.0.0, and will be removed in 1.2.0. Consider using imageio.imread
instead.
Example:
import imageio
im = imageio.imread('my_image.png')
print(im.shape)
You can also use imageio to load from fancy sources:
im = imageio.imread('http://upload.wikimedia.org/wikipedia/commons/d/de/Wikipedia_Logo_1.0.png')
Edit:
To load all of the *.png
files in a specific folder, you could use the glob
package:
import imageio
import glob
for im_path in glob.glob("path/to/folder/*.png"):
im = imageio.imread(im_path)
print(im.shape)
# do whatever with the image here
Solution 3
This can also be done with the Image
class of the PIL library:
from PIL import Image
import numpy as np
im_frame = Image.open(path_to_file + 'file.png')
np_frame = np.array(im_frame.getdata())
Note: The .getdata()
might not be needed - np.array(im_frame)
should also work
Solution 4
Using a (very) commonly used package is prefered:
import matplotlib.pyplot as plt
im = plt.imread('image.png')
Solution 5
If you are loading images, you are likely going to be working with one or both of matplotlib
and opencv
to manipulate and view the images.
For this reason, I tend to use their image readers and append those to lists, from which I make a NumPy array.
import os
import matplotlib.pyplot as plt
import cv2
import numpy as np
# Get the file paths
im_files = os.listdir('path/to/files/')
# imagine we only want to load PNG files (or JPEG or whatever...)
EXTENSION = '.png'
# Load using matplotlib
images_plt = [plt.imread(f) for f in im_files if f.endswith(EXTENSION)]
# convert your lists into a numpy array of size (N, H, W, C)
images = np.array(images_plt)
# Load using opencv
images_cv = [cv2.imread(f) for f in im_files if f.endswith(EXTENSION)]
# convert your lists into a numpy array of size (N, C, H, W)
images = np.array(images_cv)
The only difference to be aware of is the following:
- opencv loads channels first
- matplotlib loads channels last.
So a single image that is 256*256 in size would produce matrices of size (3, 256, 256) with opencv and (256, 256, 3) using matplotlib.
pbu
My interests are machine learning, computer vision, wordpress and linux. Love travel and video games. I live in Budapest, Hungary
Updated on February 07, 2022Comments
-
pbu over 2 years
I have about 200 grayscale PNG images stored within a directory like this.
1.png 2.png 3.png ... ... 200.png
I want to import all the PNG images as NumPy arrays. How can I do this?
-
pbu almost 9 yearsJust change to
glob.glob("./train/*.png")
-
SherylHohman about 7 yearsPerfect. Great All-In-One Solution. I had stored images into an np.array, but then ran into trouble as the array had (shape == (num_images,) with each image (shape == (32,32,3)). Your solution (plus
im = np.reshape(num_images,32,32,3)
works brilliantly! :-) -
SherylHohman about 7 yearstypo: I don't even need the reshape call above. In mine vexed hack, massaging it into that desired shape was getting messy. Thanks for the direct path.
-
Charles almost 6 yearsDownvoter, if you could please help me make this answer better by telling me what to improve, it would be very appreciated!
-
devssh over 5 yearsI'm not downvoter but the question is to load a list of images in a folder. Can you modify your answer to reflect that, not just 1 - 200.png but what if the png have random names, that would help me a lot. I'm sure I can use
os
tols
and get the file names but is there a better way? Perhaps you should edit to addglob
-
devssh over 5 yearsAlso, remember to add a try catch as imread may throw ValueError. I don't have privileges to edit or I would have updated it for you. :)
-
Charles over 5 yearsThe developer should choose if, in this context, the exception should be raised and halt execution or handled in a specific way. Without context, raising is preferred.
-
Charles over 5 yearswell,
glob
only finds files in your directory tree that match a certain "globbing" path (one that can contains wildcards etc.) so I'm not sure what you mean by "invalid png errors are ignored by glob" since glob only looks at filenames and know nothing about your images. -
devssh over 5 yearsYes, it should, but glob saved me the trouble by not reading invalid png for reasons unknown. I used
imageio.imwrite
along withskimage.transform.resize
and it fits into numpy! -
devssh over 5 yearsI found out what was happening, my try except caught the error when the glob on invalid png format blew up.
-
EL_DON over 4 yearsI already have matplotlib imported most of the time, so this has basically no extra cost. Did matplotlib not always have imread or something? What's the advantage of the packages used in other answers?
-
Rob about 4 yearsI don't think the
.getdata()
is even needed.np.array(im_frame)
should also work. -
mrk about 4 yearsThanks for the contribution: I added your remark as a comment to my answer for highlighting.
-
sailfish009 about 4 yearsi had vote up, but .getdata() cause error, so had to use without .getdata() (Rob's method) both code is not same! : raise TypeError('Input type {} is not supported'.format(npimg.dtype)) TypeError: Input type int64 is not supported
-
mrk about 4 yearsseems as if you were having an issue with your input type.
-
liang almost 3 yearsthe doc link is broken
-
Charles almost 3 years@liang updated the link; thanks for pointing it out
-
Brandon about 2 yearsTo get it as RGB use
img = np.asarray(Image.open('file.png').convert('RGB'))
-
milembar about 2 yearsno advantage. Just a convenience wrapper over pillow (PIL) to sparse one extra line of code.
-
Nir about 2 years@milembar as EL_DON mentioned many scripts already have matplotlib imported
-
C-3PO about 2 yearsI ran a few benchmarks, and it seems that
np.asarray(PIL.Image.open(file.png))
is slightly faster thanimageio.imread(...)
.