Як показати зображення PIL у зошиті ipython


110

Це мій код

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
inline, після клітинки
WebOrCode

Відповіді:


163

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

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

оновлено

Оскільки вимога ОП полягає в тому, щоб використовувати 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як вимагається в ОП.
Анзель

1
@greatvovan, що попередній перегляд призначений для того, хто використовує ноутбук ipython - наприклад, не-браузер (або jupyter для нової версії), не обов'язково повинен мати веб-браузер, якщо це має сенс?
Анзель

48

Використовуйте дисплей IPython для відображення 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

також він повинен бути більш ефективним (якщо перекладач не розуміє, що дані
переносяться

На жаль, я не можу змусити це працювати в зошиті про колаб: - /
Левон

це найпростіший підхід - дякую за те, що вирвали просто об’єкт відображення з 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.display (ip_img). Ви можете побачити це, що використовується тут: tensorflow.org/tutorials/mandelbrot
David F

@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
Samy Bencherif

7

набагато простіше в джуптері, використовуючи подушку.

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, ви можете перетворити зображення в масивний масив і використовувати implohow matplotlib.

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

EDIT: Як зазначено в коментарях, модуль pylab застарів, тому використовуйте замість магії matplotlib та імпортуйте функцію явно:

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

2
пілаб застарілий, не використовувати.
Метт

2

Виходячи з інших відповідей та моїх спроб, найкращим досвідом буде перша установка, подушка та шпигун, а потім використання наступного стартового коду у вашому ноутбуці з юпітером:

%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

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

$ sudo apt-get install imagemagick


0

Просто використовуйте

from IPython.display import Image 
Image('image.png')
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.