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

Posted

技术标签:

【中文标题】如何在 ipython 笔记本中显示 PIL 图像【英文标题】:How to show PIL Image in ipython notebook 【发布时间】:2014-12-26 07:12:39 【问题描述】:

这是我的代码

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>

【问题讨论】:

您要显示图片以供预览,还是要显示内嵌图片? 内联,在单元格之后 另见How can I display an image from a file in in Jupyter Notebook。 【参考方案1】:

2021 年 11 月 17 日更新

当使用 PIL/Pillow 时,Jupyter Notebooks 现在有一个内置的 display 可以直接显示图像,没有额外的麻烦。

display(pil_im)

如果图像只是单元格中的最后一行,Jupyter 也会显示该图像(自原始帖子以来已更改)。感谢@Dean 和@Prabhat 的回答指出这一点。

其他方法

从文件

您也可以使用 IPython 的 display 模块来加载图像。你可以从the doc阅读更多内容。

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

来自 PIL.Image 对象

由于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()

【讨论】:

不要从IPython.core导入任何东西,它不是stable api,我们直接在IPython.display中暴露stable api。我自己编辑了这篇文章。 您正在显示来自文件的图像。我向 PIL 询问,例如我的示例 pil_im @Matt,感谢您澄清这一点。虽然我在使用 core 时从未遇到过问题,但很高兴我学到了新东西 :) @WebOrCode,我已经更新了我的答案,以便按照 OP 中的要求使用 PIL 提供解决方案。 @greatvovan 预览适用于任何使用 ipython notebook 的人——例如无浏览器(或新版本的 jupyter),如果有意义的话,不一定非得有网络浏览器?【参考方案2】:

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

【讨论】:

如果你只是想快速检查一个图像,你可以直接“返回”它,查看它的值,它会自动显示 这比其他答案简单得多——无需转换为 BytesIO 或 numpy 数组。 它还必须具有更高的性能(除非解释器理解数据正在被转录回来和第四次) 不幸的是,我无法在 colab 笔记本中使用它:-/ 这是最简单的方法 - 感谢您从 IPython 中分离出显示对象和从 PIL 中分离出图像。我正在使用 PIL 从奇怪的数据创建图像,只是想将其显示在我的笔记本中 - 这非常漂亮且简单。【参考方案3】:

我发现这行得通

# 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

【讨论】:

您可以使用 display.display 来显示您立即创建的 display.Image,避免依赖于在单元格中的最后一个:display.display(ip_img)。你可以在这里看到这个:tensorflow.org/tutorials/mandelbrot @DavidF 不,好像你不能。尝试上述所有排列。如何在笔记本中显示图像? @DavidF 谢谢,我也可以使用display.display(i) @Chris 使用导入、函数和注册调用。然后生成图像img = Image.new('RGB', (60, 30), color = 'red'),然后在代码单元中运行display.display(img),您应该会看到笔记本上打印出一个红色的小矩形。【参考方案4】:

案例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:在&lt;imgsrc之间粘贴style=\"width:100px; height:100px;\"【参考方案5】:

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

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

【讨论】:

【参考方案6】:

为了简单地可视化笔记本中的图像,您可以使用 display()

%matplotlib inline
from PIL import Image

im = Image.open(im_path)
display(im)

【讨论】:

【参考方案7】:

您可以使用 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)

【讨论】:

【参考方案8】:

如果您使用的是 pylab 扩展,您可以将图像转换为 numpy 数组并使用 matplotlib 的 imshow。

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

编辑: 如 cmets 中所述,pylab 模块已弃用,因此请改用 matplotlib 魔法并显式导入函数:

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

【讨论】:

pylab 已弃用,请勿使用。【参考方案9】:

根据其他答案和我的尝试,最好的体验是首先安装 pillow 和 scipy,然后在您的 jupyter notebook 上使用以下起始代码:

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

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

【讨论】:

【参考方案10】:

使用标准 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()

【讨论】:

【参考方案11】:

随便用

from IPython.display import Image 
Image('image.png')

【讨论】:

您的答案在显示图像时是正确的,但由于 OP 想使用 PIL 进一步修改图像,它有点不直接回答问题。【参考方案12】:

我建议通过 no image show img.show() 进行安装 (从 PIL 导入图片)

$ sudo apt-get install imagemagick

【讨论】:

以上是关于如何在 ipython 笔记本中显示 PIL 图像的主要内容,如果未能解决你的问题,请参考以下文章

pil 不显示图像

Ipython笔记本:在下一步之前“实时”显示for循环图像[重复]

使用 IPython.display.image 显示来自网络的图像:有时有效,有时无效

如何在屏幕上显示 PIL 图像?

如何在 Django 视图中显示 PIL 图像对象?

Skimage:如何显示图像