Cách hiển thị Hình ảnh PIL trong sổ ghi chép ipython


109

Đây là mã của tôi

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

Tôi muốn thực hiện một số thao tác hình ảnh trên nó, và sau đó hiển thị nó trên màn hình.
Tôi đang gặp sự cố với việc hiển thị Hình ảnh PIL trong sổ ghi chép python.

Tôi đã thử:

print pil_im

Và chỉ

pil_im

Nhưng cả hai chỉ cho tôi:

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

bạn muốn hiển thị hình ảnh để xem trước hay bạn muốn hiển thị hình ảnh nội tuyến?
Anzel

1
inline, sau khi các tế bào
WebOrCode

Câu trả lời:


162

Bạn có thể sử dụng IPython Module: displayđể tải hình ảnh. Bạn có thể đọc thêm từ Tài liệu .

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

cập nhật

Theo yêu cầu OP là sử dụng PIL, nếu bạn muốn hiển thị hình ảnh nội tuyến, bạn có thể sử dụng matplotlib.pyplot.imshowvới numpy.asarraynhư quá này:

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

Nếu bạn chỉ yêu cầu bản xem trước thay vì nội dòng, bạn chỉ có thể sử dụng shownhư sau:

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

5
Không nhập bất cứ thứ gì từ IPython.corenó không phải là api ổn định, chúng tôi hiển thị trực tiếp api ổn định vào IPython.display. Tôi đã tự sửa bài.
Matt

bạn đang hiển thị hình ảnh từ tệp. Tôi hỏi từ PIL như trong ví dụ của tôipil_im
WebOrCode

@Matt, cảm ơn vì đã làm rõ điều này. Mặc dù tôi chưa bao giờ gặp phải vấn đề sử dụng core, vui vì tôi đã học được một điều mới :)
Anžel

@WebOrCode, tôi đã cập nhật câu trả lời của mình để cung cấp giải pháp sử dụng PILtheo yêu cầu trong OP.
Anzel

1
@greatvovan rằng bản xem trước dành cho bất kỳ ai sử dụng máy tính xách tay ipython — chẳng hạn như không có trình duyệt (hoặc jupyter cho phiên bản mới hơn), không nhất thiết phải có trình duyệt web, nếu điều đó hợp lý?
Anzel

48

Sử dụng màn hình IPython để hiển thị hình ảnh PIL trong sổ ghi chép.

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
và nếu bạn chỉ muốn nhanh chóng kiểm tra một hình ảnh, bạn có thể chỉ là "trở lại" nó, để xem giá trị của nó, và nó sẽ được hiển thị tự động
Ciprian Tomoiagă

1
Điều này đơn giản hơn nhiều so với các câu trả lời khác - không cần phải chuyển đổi thành BytesIO hoặc mảng numpy.
levis501 09/09

cũng nó phải là performant hơn (trừ khi người phiên dịch hiểu rằng dữ liệu đang được sao chép lại và thứ tư)
Baedsch

Rất tiếc, tôi không thể làm cho điều này hoạt động trong sổ ghi chép colab: - /
Levon

đây là cách tiếp cận đơn giản nhất - cảm ơn bạn đã chỉ ra đối tượng hiển thị từ IPython và Hình ảnh từ PIL. tôi đang sử dụng PIL để tạo một hình ảnh từ dữ liệu kỳ lạ và chỉ muốn hiển thị nó trong sổ ghi chép của mình - điều này hoạt động rất đẹp và đơn giản.
dave campbell

20

Tôi thấy rằng điều này đang hoạt động

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

Sau đó, tôi chỉ có thể làm:

pil_im

Nhưng đây phải là dòng cuối cùng trong ô, không có printsau nó


2
Bạn có thể sử dụng display.display để hiển thị display.Image bạn đã tạo ngay lập tức, tránh phụ thuộc vào ô cuối cùng trong ô: display.display (ip_img). Bạn có thể thấy điều này được sử dụng tại đây: tensorflow.org/tutorials/mandelbrot
David F

@DavidF không, có vẻ như bạn không thể. Đang thử tất cả các hoán vị ở trên. Làm thế nào để hiển thị một hình ảnh trong sổ ghi chép?
Christopher

15

trường hợp 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')))

Nó đang hiển thị hình ảnh ở kích thước ban đầu. Ví dụ: Nếu hình ảnh là 32x32, thì đầu ra cũng sẽ rất nhỏ. Làm thế nào để cung cấp kích thước theo cách thủ công trong hàm HTML?
Pramod Patil

@PramodPatil Dễ soln: dán style=\"width:100px; height:100px;\"ở giữa <imgsrc
Samy bencherif

7

đơn giản hơn nhiều trong jupyter sử dụng gối.

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

4

Bạn có thể mở một hình ảnh bằng cách sử dụng lớp Hình ảnh từ gói PIL và hiển thị trực tiếp bằng 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

Nếu bạn đang sử dụng tiện ích mở rộng pylab, bạn có thể chuyển đổi hình ảnh thành một mảng numpy và sử dụng imshow của matplotlib.

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

CHỈNH SỬA: Như đã đề cập trong các nhận xét, mô-đun pylab không được dùng nữa, vì vậy hãy sử dụng phép thuật matplotlib để thay thế và nhập hàm một cách rõ ràng:

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

2
pylab không được dùng nữa, không sử dụng.
Matt

2

Dựa trên các câu trả lời khác và sự cố gắng của tôi, trải nghiệm tốt nhất sẽ là cài đặt, gối đầu và scipy, sau đó sử dụng mã bắt đầu sau trên sổ ghi chép jupyter của bạn:

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

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

1

Phiên bản Python3 sạch hơn sử dụng numpy, matplotlib và PIL tiêu chuẩn. Hợp nhất câu trả lời để mở từ 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

Tôi đề nghị cài đặt sau bằng cách không hiển thị hình ảnh img.show () (từ Hình ảnh nhập PIL)

$ sudo apt-get install imagemagick


0

Chỉ dùng

from IPython.display import Image 
Image('image.png')
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.