Jak wyświetlić obraz PIL w notatniku ipython

112

To jest mój kod

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

Chciałbym zrobić na nim jakąś obróbkę obrazu, a następnie pokazać go na ekranie.
Mam problem z wyświetlaniem obrazu PIL w notatniku Pythona.

Próbowałem:

print pil_im

I tylko

pil_im

Ale po prostu daj mi:

<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=569x800 at 0x10ECA0710>
WebOrCode
źródło
chcesz pokazać obraz do podglądu, czy chcesz pokazać obraz w tekście?
Anzel
1
inline, po komórce
WebOrCode

Odpowiedzi:

164

Możesz użyć IPythona Module: displaydo załadowania obrazu. Możesz przeczytać więcej z Doc .

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

zaktualizowany

Ponieważ OP wymaga użycia PIL, jeśli chcesz wyświetlać obraz w tekście, możesz użyć również matplotlib.pyplot.imshoww numpy.asarrayten sposób:

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))

Jeśli potrzebujesz tylko podglądu, a nie wstawki, możesz po prostu użyć w showten sposób:

pil_im = Image.open('data/empire.jpg', 'r')
pil_im.show()
Anzel
źródło
5
Nie importuj niczego z IPython.coretego, że nie jest to stabilne api, wystawiamy stabilne api bezpośrednio w IPython.display. Sam zredagowałem post.
Matt
wyświetlasz obraz z pliku. Zapytałem z PIL jak w moim przykładziepil_im
WebOrCode
@Matt, dziękuję za wyjaśnienie. Chociaż nigdy nie miałem problemu z używaniem core, cieszę się, że nauczyłem się nowej rzeczy :)
Anzel
@WebOrCode, zaktualizowałem moją odpowiedź, aby zapewnić rozwiązania przy użyciu PILzgodnie z wymaganiami w OP.
Anzel
1
@greatvovan ten podgląd jest przeznaczony dla każdego, kto używa ipython notebook - na przykład bez przeglądarki (lub jupyter w nowszej wersji), niekoniecznie musi mieć przeglądarkę internetową, jeśli to ma sens?
Anzel
48

Użyj wyświetlacza IPython do renderowania obrazów PIL w notatniku.

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)
sathyz
źródło
3
a jeśli chcesz tylko szybko sprawdzić obraz, możesz go po prostu „zwrócić”, aby zobaczyć jego wartość, a zostanie on wyświetlony automatycznie
Ciprian Tomoiagă
1
Jest to o wiele prostsze niż inne odpowiedzi - nie ma potrzeby konwersji na tablicę BytesIO lub numpy.
levis501
także musi być bardziej wydajne (chyba że tłumacz zrozumie, że dane są przepisywane z powrotem i po czwarte)
Baedsch
Niestety nie mogę tego zmusić do pracy w notebooku Colab: - /
Levon
jest to najprostsze podejście - dzięki za wyodrębnienie tylko obiektu wyświetlanego z IPython i obrazu z PIL. Używałem PIL do tworzenia obrazu z dziwnych danych i chciałem po prostu wyświetlić go w moim notatniku - to działało pięknie i prosto.
dave campbell
20

Okazało się, że to działa

# 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)

Po tym mogę po prostu zrobić:

pil_im

Ale to musi być ostatnia linia w komórce, bez printpo niej

WebOrCode
źródło
2
Możesz użyć display.display, aby wyświetlić display.Image, który utworzyłeś od razu, unikając zależności od ostatniego w komórce: display.display (ip_img). Możesz zobaczyć to tutaj: tensorflow.org/tutorials/mandelbrot
David F
@DavidF nie, wydaje się, że nie możesz. Próbuję wszystkich kombinacji powyższych. Jak wyświetlić obraz w notatniku?
Christopher
15

przypadku 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')))
gaziya
źródło
Pokazuje obraz w jego oryginalnym rozmiarze. np. jeśli obraz ma wymiary 32x32, wynik będzie również bardzo mały. Jak ręcznie podać rozmiar w funkcji HTML?
Pramod Patil
@PramodPatil Easy soln: wklej style=\"width:100px; height:100px;\"pomiędzy <imgasrc
Samy Bencherif
7

dużo prostsze w jupyter z użyciem poduszki.

from PIL import Image
image0=Image.open('image.png')
image0
Prabhat
źródło
4

Możesz otworzyć obraz za pomocą klasy Image z pakietu PIL i wyświetlić go bezpośrednio za pomocą plt.imshow.

# 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)
M. Franklin
źródło
2

Jeśli używasz rozszerzenia pylab, możesz przekonwertować obraz na tablicę numpy i użyć narzędzia imshow matplotlib.

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

EDYCJA: Jak wspomniano w komentarzach, moduł pylab jest przestarzały, więc zamiast tego użyj magii matplotlib i zaimportuj funkcję jawnie:

%matplotlib
from matplotlib.pyplot import imshow 
imshow(array(pil_im))
Obrabować
źródło
2
pylab jest przestarzały, nie używaj go.
Matt,
2

Opierając się na innych odpowiedziach i moich próbach, najlepszym doświadczeniem byłoby najpierw zainstalowanie, poduszka i scipy, a następnie użycie następującego kodu startowego na notebooku jupyter:

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

imshow(imread('image.jpg', 1))
Ebrahim Byagowi
źródło
1

Czystsza wersja Pythona3, która używa standardowych numpy, matplotlib i PIL. Łączenie odpowiedzi na otwarcie z adresu 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()
Punnerud
źródło
0

Proponuję następującą instalację bez obrazka show img.show () (z importu obrazu PIL)

$ sudo apt-get install imagemagick

Dr.-Ing. Hiesik KIm
źródło
0

Po prostu użyj

from IPython.display import Image 
Image('image.png')
Quanlong
źródło