如何在ipython笔记本中显示PIL图像


109

这是我的代码

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

我想对其进行一些图像处理,然后在屏幕上显示它。
我在python笔记本中显示PIL图像时遇到问题。

我努力了:

print pil_im

而只是

pil_im

但是两者都给我:

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

您要显示图像以进行预览还是要显示嵌入式图像?
Anzel 2014年

1
内联,在单元格之后
WebOrCode 2014年

Answers:


162

您可以使用IPython Module: display加载图像。您可以从Doc阅读更多内容。

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

更新

由于OP的要求是使用PIL,如果要显示嵌入式图像,也可以使用matplotlib.pyplot.imshownumpy.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 2014年

@Matt,感谢您澄清这一点。尽管我从来没有遇到过使用问题core,但很高兴我学到了新东西:)
Anzel 2014年

@WebOrCode,我已经更新了答案,可以PIL按照OP中的要求提供解决方案。
Anzel 2014年

1
@greatvovan预览适用于使用ipython笔记本的任何人-例如,没有浏览器(对于较新版本,则为jupyter),不一定非要使用网络浏览器,如果有意义的话?
Anzel

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)

2
如果您只想快速检查图像,则可以“返回”该图像以查看其值,然后该图像将自动显示
CiprianTomoiagă18年

1
这比其他答案要简单得多-无需转换为BytesIO或numpy数组。
levis501 '18

还必须具有更高的性能(除非口译员理解数据是在向后转录和第四次转录的)
Baedsch

不幸的是,我无法在colab笔记本中使用它:-/
Levon

这是最简单的方法-感谢您仅分解来自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图像,而不必依赖于单元格中的最后一个: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简单的溶液:粘贴style=\"width:100px; height:100px;\"之间<imgsrc
萨米·谢里夫

7

使用枕头在jupyter中简单得多。

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

4

您可以使用PIL包中的Image类打开图像,并直接使用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数组,并使用matplotlib的imshow。

%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

使用标准numpy,matplotlib和PIL的更干净的Python3版本。合并从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')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.