Cara menampilkan Gambar PIL di notebook ipython


112

Ini kode saya

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

Saya ingin melakukan manipulasi gambar, lalu menampilkannya di layar.
Saya mengalami masalah saat menampilkan Gambar PIL di notebook python.

Saya telah mencoba:

print pil_im

Dan hanya

pil_im

Tapi keduanya hanya memberi saya:

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

apakah Anda ingin menampilkan gambar untuk pratinjau, atau Anda ingin menampilkan gambar sebaris?
Anzel

1
sebaris, setelah sel
WebOrCode

Jawaban:


164

Anda dapat menggunakan IPython Module: displayuntuk memuat gambar. Anda dapat membaca lebih lanjut dari Dokumen .

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

diperbarui

Sebagai persyaratan OP adalah dengan menggunakan PIL, jika Anda ingin menampilkan gambar inline, Anda dapat menggunakan matplotlib.pyplot.imshowdengan numpy.asarrayseperti ini juga:

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

Jika Anda hanya membutuhkan pratinjau daripada sebaris, Anda dapat menggunakan showseperti ini:

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

5
Jangan mengimpor apa pun dari IPython.coreitu bukan api stabil, kami mengekspos api stabil secara langsung IPython.display. Saya mengedit postingan sendiri.
Matt

Anda sedang menampilkan gambar dari file. Saya bertanya dari PIL seperti dalam contoh sayapil_im
WebOrCode

@Matt, terima kasih telah mengklarifikasi ini. Meskipun saya tidak pernah mengalami masalah dalam menggunakan core, senang saya telah mempelajari hal baru :)
Anzel

@WebOrCode, saya telah memperbarui jawaban saya untuk memberikan solusi menggunakan PILseperti yang diminta di OP.
Anzel

1
@greatvovan pratinjau itu untuk siapa saja yang menggunakan notebook ipython — misalnya tanpa browser (atau jupyter untuk versi yang lebih baru), tidak harus memiliki browser web, jika itu masuk akal?
Anzel

48

Gunakan tampilan IPython untuk membuat gambar PIL di 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)

3
dan jika Anda hanya ingin memeriksa gambar dengan cepat, Anda dapat "mengembalikannya", untuk melihat nilainya, dan gambar itu akan ditampilkan secara otomatis
Ciprian Tomoiagă

1
Ini jauh lebih sederhana daripada jawaban lain - tidak perlu mengonversi ke BytesIO atau numpy array.
levis501

juga harus lebih berkinerja (kecuali penerjemah memahami bahwa data sedang ditranskripsikan kembali dan keempat)
Baedsch

Sayangnya saya tidak bisa mendapatkan ini untuk bekerja di notebook colab: - /
Levon

ini adalah pendekatan yang paling sederhana - terima kasih telah memisahkan objek tampilan dari IPython dan Gambar dari PIL. Saya menggunakan PIL untuk membuat gambar dari data aneh, dan hanya ingin menampilkannya di notebook saya - ini bekerja dengan indah dan sederhana.
Dave campbell

20

Saya menemukan bahwa ini berfungsi

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

Setelah ini saya hanya bisa melakukan:

pil_im

Tapi ini harus menjadi baris terakhir di sel, tanpa printsetelahnya


2
Anda dapat menggunakan display.display untuk menampilkan display. Gambar yang Anda buat segera, menghindari ketergantungan pada yang terakhir di sel: display.display (ip_img). Anda dapat melihat ini digunakan di sini: tensorflow.org/tutorials/mandelbrot
David F

@DavidF tidak, sepertinya Anda tidak bisa. Mencoba semua permutasi di atas. Bagaimana seseorang menunjukkan gambar di buku catatan?
Christopher

15

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

Ini menunjukkan gambar dalam ukuran aslinya. mis. Jika gambar berukuran 32x32, maka keluarannya juga akan sangat kecil. Bagaimana cara memberi ukuran secara manual dalam fungsi HTML?
Pramod Patil

@PramodPatil Easy soln: paste style=\"width:100px; height:100px;\"di antara <imgdansrc
Samy Bencherif

7

lebih simple di jupyter menggunakan bantal.

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

4

Anda dapat membuka gambar menggunakan kelas Image dari paket PIL dan menampilkannya dengan plt.imshow secara langsung.

# 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

Jika Anda menggunakan ekstensi pylab, Anda dapat mengonversi gambar menjadi array numpy dan menggunakan imshow matplotlib.

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

EDIT: Seperti yang disebutkan di komentar, modul pylab tidak digunakan lagi, jadi gunakan sihir matplotlib sebagai gantinya dan impor fungsinya secara eksplisit:

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

2
pylab sudah usang, jangan gunakan.
Matt

2

Berdasarkan jawaban lain dan percobaan saya, pengalaman terbaik adalah pemasangan pertama, bantal dan scipy pertama, kemudian menggunakan kode awal berikut di notebook jupyter Anda:

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

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

1

Versi Python3 yang lebih bersih yang menggunakan numpy, matplotlib, dan PIL standar. Menggabungkan jawaban untuk membuka dari 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

Saya sarankan mengikuti instalasi tanpa menampilkan gambar img.show () (dari PIL import Image)

$ sudo apt-get install imagemagick


0

Gunakan saja

from IPython.display import Image 
Image('image.png')
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.