Как показать изображение PIL в блокноте ipython


112

Это мой код

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

Я хотел бы поработать с ним над изображением, а затем показать его на экране.
У меня проблема с отображением изображения PIL в записной книжке Python.

Я пытался:

print pil_im

И просто

pil_im

Но оба просто дают мне:

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

вы хотите показать изображение для предварительного просмотра или хотите показать встроенное изображение?
Анзель

1
встроенный, после ячейки
WebOrCode

Ответы:


168

Вы можете использовать IPython Module: displayдля загрузки изображения. Вы можете прочитать больше в Док .

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

обновлено

Как требование OP заключается в использовании PIL, если вы хотите , чтобы показать встроенное изображение, вы можете использовать matplotlib.pyplot.imshowс numpy.asarrayкак это тоже:

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

Если вам нужен только предварительный просмотр, а не встроенный, вы можете просто использовать showэто:

pil_im = Image.open('data/empire.jpg', 'r')
pil_im.show()

5
Не импортируйте ничего из IPython.coreэтого нестабильного api, мы выставляем стабильный api прямо в IPython.display. Я сам редактировал пост.
Мэтт

вы показываете изображение из файла. Я спросил у PIL, как в моем примереpil_im
WebOrCode

@Matt, спасибо, что разъяснили это. Хотя я никогда не сталкивался с проблемами при использовании core, рад, что узнал что-то новое :)
Анзель

@WebOrCode, я обновил свой ответ, чтобы предоставить решения, использующие PILв соответствии с запросом в OP.
Анзель

1
@greatvovan, этот предварительный просмотр предназначен для тех, кто использует ipython notebook - например, без браузера (или jupyter для более новой версии), не обязательно иметь веб-браузер, если это имеет смысл?
Анзель

50

Используйте IPython display для рендеринга изображений PIL в записной книжке.

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)

3
и если вы просто хотите быстро изучить изображение, вы можете просто «вернуть» его, чтобы увидеть его значение, и оно будет отображаться автоматически,
Ciprian Tomoiagă

1
Это намного проще, чем другие ответы - нет необходимости преобразовывать в массив BytesIO или numpy.
levis501 09

также он должен быть более производительным (если интерпретатор не понимает, что данные транскрибируются обратно и четвертый)
Baedsch

К сожалению, я не могу заставить это работать в записной книжке
Левон

это самый простой подход - спасибо за выделение только экранного объекта из IPython и изображения из PIL. Я использовал PIL для создания изображения из странных данных и просто хотел отобразить его в своем блокноте - это сработало красиво и просто.
Дэйв Кэмпбелл

20

Я обнаружил, что это работает

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

После этого я могу просто сделать:

pil_im

Но это должна быть последняя строка в ячейке, printпосле которой нет


2
Вы можете использовать display.display для отображения созданного сразу же display.Image, избегая зависимости от последнего в ячейке: display.display (ip_img). Вы можете увидеть это здесь: tenorflow.org/tutorials/mandelbrot
Дэвид Ф,

@DavidF нет, похоже, ты не можешь. Пробуем все перестановки выше. Как показать изображение в блокноте?
Кристофер

15

чехол 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')))

Изображение отображается в исходном размере. например, если изображение 32x32, то вывод также будет очень маленьким. Как задать размер вручную в функции HTML?
Прамод Патил

@PramodPatil Easy soln: вставить style=\"width:100px; height:100px;\"между <imgиsrc
Сами Бенчериф

9

В jupyter намного проще использовать подушку.

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

4

Вы можете открыть изображение, используя класс Image из пакета PIL, и отобразить его напрямую с помощью 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)

2

Если вы используете расширение pylab, вы можете преобразовать изображение в массив numpy и использовать imshow matplotlib.

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

РЕДАКТИРОВАТЬ: Как упоминалось в комментариях, модуль pylab устарел, поэтому вместо этого используйте магию matplotlib и явно импортируйте функцию:

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

2
pylab устарел, не используйте.
Мэтт

2

Основываясь на других ответах и ​​моих попытках, лучше всего сначала установить подушку и scipy, а затем использовать следующий начальный код на вашем ноутбуке jupyter:

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

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

1

Более чистая версия Python3, использующая стандартные numpy, matplotlib и PIL. Слияние ответа на открытие с 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()

0

Я предлагаю после установки без изображения показать img.show () (из изображения импорта PIL)

$ sudo apt-get install imagemagick


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.