229

This is my code

from PIL import Image
pil_im = Image.open('data/empire.jpg')

I would like to do some image manipulation on it, and then show it on screen.
I am having problem with showing PIL Image in python notebook.

I have tried:

print pil_im

And just

pil_im

But both just give me:

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=569x800 at 0x10ECA0710>
3

12 Answers 12

381

Updated 2021/11/17

When using PIL/Pillow, Jupyter Notebooks now have a display built-in that will show the image directly, with no extra fuss.

display(pil_im)

Jupyter will also show the image if it is simply the last line in a cell (this has changed since the original post). Thanks to answers from @Dean and @Prabhat for pointing this out.

Other Methods

From File

You can also use IPython's display module to load the image. You can read more from the doc.

from IPython.display import Image 
pil_img = Image(filename='data/empire.jpg')
display(pil_img)

From PIL.Image Object

As OP's requirement is to use PIL, if you want to show inline image, you can use matplotlib.pyplot.imshow with numpy.asarray like this too:

from matplotlib.pyplot import imshow
import numpy as np
from PIL import Image

%matplotlib inline
pil_im = Image.open('data/empire.jpg', 'r')
imshow(np.asarray(pil_im))

If you only require a preview rather than an inline, you may just use show like this:

pil_im = Image.open('data/empire.jpg', 'r')
pil_im.show()
Sign up to request clarification or add additional context in comments.

17 Comments

Do not import anything from IPython.core it is not stable api, we expose the stable api directly in IPython.display. I edited the post myself.
you are displaying image from file. I asked from PIL like in my example pil_im
@Matt, thanks for clarifying this. Although I've never run into problem using core, glad I've learnt a new thing :)
@WebOrCode, I've updated my answer to provide solutions using PIL as requested in OP.
@greatvovan that preview is to whoever using ipython notebook —no-browser for instance (or jupyter for newer version), not necessarily have to have the web browser, if that makes sense?
|
79

Use IPython display to render PIL images in a notebook.

from PIL import Image               # to load images
from IPython.display import display # to display images

pil_im = Image.open('path/to/image.jpg')
display(pil_im)

5 Comments

and if you just want to quickly inspect an image, you can just "return" it, to see its value, and it will be displayed automatically
This is so much simpler than other answers -- there's no need to convert to BytesIO or numpy array.
also it must be more performant (unless the interpreter understands that the data is being transcribed back and fourth)
Unfortunately I can't get this to work in a colab notebook :-/
this is the simplest approach - thanks for breaking out just the display object from IPython and the Image from PIL. i was using PIL to create an image from weird data, and just wanted to display it in my notebook - this worked beautifully and simply.
26

I found that this is working

# source: http://nbviewer.ipython.org/gist/deeplook/5162445
from io import BytesIO

from IPython import display
from PIL import Image


def display_pil_image(im):
   """Displayhook function for PIL Images, rendered as PNG."""

   b = BytesIO()
   im.save(b, format='png')
   data = b.getvalue()

   ip_img = display.Image(data=data, format='png', embed=True)
   return ip_img._repr_png_()


# register display func with PNG formatter:
png_formatter = get_ipython().display_formatter.formatters['image/png']
dpi = png_formatter.for_type(Image.Image, display_pil_image)

After this I can just do:

pil_im

But this must be last line in cell, with no print after it

4 Comments

You can use display.display to display the display.Image you created immediately, avoiding the dependency on being last in the cell: display.display(ip_img). You can see this used here: tensorflow.org/tutorials/mandelbrot
@DavidF no, it seems as if you can't. Trying all permutations of above. How does one show an image in the notebook?
@DavidF Thanks, I was able to also use display.display(i).
@Chris use the imports, function, and register calls. Then generate an image, img = Image.new('RGB', (60, 30), color = 'red'), and then in a code cell run display.display(img) and you should see a small red rectangle printed to the notebook.
19

much simpler in jupyter using pillow.

from PIL import Image
image0=Image.open('image.png')
image0

Comments

17

case python3

from PIL import Image
from IPython.display import HTML
from io import BytesIO
from base64 import b64encode

pil_im = Image.open('data/empire.jpg')
b = BytesIO()  
pil_im.save(b, format='png')
HTML("<img src='data:image/png;base64,{0}'/>".format(b64encode(b.getvalue()).decode('utf-8')))

2 Comments

It is showing the image in its original size. e.g If image is 32x32, then output will also be very small. How to give the size manually in HTML function?
@PramodPatil Easy soln: paste style=\"width:100px; height:100px;\" in between <img and src
10

In order to simply visualize the image in a notebook you can use display()

%matplotlib inline
from PIL import Image

im = Image.open(im_path)
display(im)

Comments

6

You can open an image using the Image class from the package PIL and display it with plt.imshow directly.

# First import libraries.
from PIL import Image
import matplotlib.pyplot as plt

# The folliwing line is useful in Jupyter notebook
%matplotlib inline

# Open your file image using the path
img = Image.open(<path_to_image>)

# Since plt knows how to handle instance of the Image class, just input your loaded image to imshow method
plt.imshow(img)

Comments

2

If you are using the pylab extension, you could convert the image to a numpy array and use matplotlib's imshow.

%pylab # only if not started with the --pylab option
imshow(array(pil_im))

EDIT: As mentioned in the comments, the pylab module is deprecated, so use the matplotlib magic instead and import the function explicitly:

%matplotlib
from matplotlib.pyplot import imshow 
imshow(array(pil_im))

1 Comment

pylab is deprecated, do not use.
2

Based on other answers and my tries, best experience would be first installing, pillow and scipy, then using the following starting code on your jupyter notebook:

%matplotlib inline
from matplotlib.pyplot import imshow
from scipy.misc import imread

imshow(imread('image.jpg', 1))

Comments

1

A cleaner Python3 version that use standard numpy, matplotlib and PIL. Merging the answer for opening from URL.

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

pil_im = Image.open('image.jpg')
## Uncomment to open from URL
#import requests
#r = requests.get('https://www.vegvesen.no/public/webkamera/kamera?id=131206')
#pil_im = Image.open(BytesIO(r.content))
im_array = np.asarray(pil_im)
plt.imshow(im_array)
plt.show()

Comments

-1

Just use

from IPython.display import Image 
Image('image.png')

1 Comment

Your answer is correct in showing an image but as OP wants to use PIL to modify the image further, it sort of doesn't answer the question directly.
-3

I suggest following installation by no image show img.show() (from PIL import Image)

$ sudo apt-get install imagemagick

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.