วิธีแสดง PIL Image ในโน้ตบุ๊ก 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>

คุณต้องการแสดงภาพเพื่อดูตัวอย่างหรือคุณต้องการแสดงภาพแบบอินไลน์?
Anzel

1
อินไลน์หลังเซลล์
WebOrCode

1
ดูเพิ่มเติมฉันจะแสดงภาพจากไฟล์ใน Jupyter Notebookได้อย่างไร
Robin Dinse

คำตอบ:


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

@ แมทขอบคุณที่ชี้แจงเรื่องนี้ แม้ว่าฉันจะไม่เคยประสบปัญหาในการใช้coreแต่ฉันก็ดีใจที่ได้เรียนรู้สิ่งใหม่ ๆ :)
Anzel

@WebOrCode ฉันได้อัปเดตคำตอบของฉันเพื่อให้วิธีแก้ปัญหาโดยใช้PILตามที่ร้องขอใน OP
Anzel

1
@greatvovan ตัวอย่างนั้นเป็นของใครก็ตามที่ใช้โน้ตบุ๊ก ipython เช่นไม่มีเบราว์เซอร์ (หรือ jupyter สำหรับเวอร์ชันใหม่กว่า) ไม่จำเป็นต้องมีเว็บเบราว์เซอร์หากเป็นเช่นนั้น
Anzel

50

ใช้จอแสดงผล 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 array
levis501

นอกจากนี้ยังต้องมีประสิทธิภาพมากขึ้น (เว้นแต่ล่ามจะเข้าใจว่าข้อมูลกำลังถูกถอดกลับและสี่)
Baedsch

น่าเสียดายที่ไม่สามารถใช้งานได้ในสมุดบันทึก colab: - /
Levon

นี่เป็นวิธีที่ง่ายที่สุด - ขอบคุณสำหรับการแยกเฉพาะวัตถุที่แสดงจาก IPython และรูปภาพจาก PIL ฉันใช้ PIL เพื่อสร้างภาพจากข้อมูลแปลก ๆ และแค่ต้องการแสดงภาพนั้นในสมุดบันทึกของฉัน - มันใช้งานได้อย่างสวยงามและเรียบง่าย
dave campbell

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 ไม่ดูเหมือนว่าคุณทำไม่ได้ ลองเรียงสับเปลี่ยนทั้งหมดข้างต้น หนึ่งแสดงภาพในสมุดบันทึกอย่างไร?
Christopher

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
Pramod Patil

@PramodPatil Easy soln: วางstyle=\"width:100px; height:100px;\"ระหว่าง<imgและsrc
Samy Bencherif


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 magic แทนและนำเข้าฟังก์ชันอย่างชัดเจน:

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


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.