如何在 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.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()
【讨论】:
不要从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:在<img
和src
之间粘贴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 图像的主要内容,如果未能解决你的问题,请参考以下文章
Ipython笔记本:在下一步之前“实时”显示for循环图像[重复]