如何在 Jupyter Notebook 中显示文件中的图像?

Posted

技术标签:

【中文标题】如何在 Jupyter Notebook 中显示文件中的图像?【英文标题】:How can I display an image from a file in Jupyter Notebook? 【发布时间】:2012-08-04 23:48:48 【问题描述】:

我想使用IPython notebook 作为一种交互式分析我使用 Biopython 的GenomeDiagram 模块制作的一些基因组图表的方法。虽然有大量文档介绍如何使用 matplotlib 在 IPython 笔记本中获取内联图形,但 GenomeDiagram 使用 ReportLab 工具包,我认为 IPython 中的内联图形不支持该工具包。

然而,我在想,解决这个问题的一种方法是将绘图/基因组图写到一个文件中,然后打开内联图像,这将具有相同的结果,如下所示:

gd_diagram.write("test.png", "PNG")
display(file="test.png")

但是,我不知道如何做到这一点 - 也不知道这是否可能。那么有人知道是否可以在 IPython 中打开/显示图像吗?

【问题讨论】:

【参考方案1】:

这是解决方案,但它会打开正在等待的新窗口

cv2.imshow('test',image)
cv2.waitKey()
cv2.destroyAllWindows()

【讨论】:

【参考方案2】:

如果您希望将图像从本地主机嵌入到 ipython 笔记本中,您可以执行以下操作:

首先:查找当前本地路径:

# show current directory
import os
cwd = os.getcwd()
cwd

例如结果是:

'C:\\Users\\lenovo\\Tutorials'

接下来,按如下方式嵌入图片:

from IPython.display import display
from PIL import Image

path="C:\\Users\\lenovo\\Tutorials\\Data_Science\\DS images\\your_image.jpeg"
display(Image.open(path))

确保在 jpg、jpeg 或 png 中选择正确的图像类型。

【讨论】:

【参考方案3】:

另一个选择是:

from matplotlib import pyplot as plt 
from io import BytesIO
from PIL import Image
import Ipython

f = BytesIO()
plt.savefig(f, format='png')
Ipython.display.display(Ipython.display.Image(data=f.getvalue()))
f.close()

【讨论】:

【参考方案4】:

从图像数组内联绘制的另一个选项可能是:

import IPython
def showimg(a):
    IPython.display.display(PIL.Image.fromarray(a))

其中 a 是一个数组

a.shape
(720, 1280, 3)

【讨论】:

【参考方案5】:
from IPython.display import Image

Image(filename =r'C:\user\path')

我已经看到了一些解决方案,有些由于原始目录而无法工作,在添加上述代码时,请记住在目录前添加'r'。这应该避免这种错误:(unicode error) 'unicodeescape' codec can't decode bytes in position 2-3: truncated \UXXXXXXXX escape

【讨论】:

【参考方案6】:

如果你想有效地显示大量图像,我建议使用IPyPlot package

import ipyplot

ipyplot.plot_images(images_array, max_images=20, img_width=150)

该包中还有一些其他有用的功能,您可以在交互式选项卡中显示图像(每个标签/类的单独选项卡),这对所有 ML 分类任务非常有帮助。

【讨论】:

这在单个图像上存在一些渲染问题,无法正确放大(显示的内容不会增长到适合放大的图像)... 有趣!感谢@PiotrDabkowski 的信息!我对 html 和 CSS 很不好,所以我完全有可能把它弄得很糟糕:)。不过,您介意在 repo 中添加一个问题 -> github.com/karolzak/ipyplot【参考方案7】:

您可以在 markdown 部分的 html 代码中使用: 示例:

 <img src="https://www.tensorflow.org/images/colab_logo_32px.png" />

【讨论】:

简单最好!,您可以将其添加到.ipnb markdown 部分或README.md 引用图像相对于项目目录的路径。 &lt;img src='project_dir/docs/imgs/123.png' /&gt;【参考方案8】:

使用标准 numpy、matplotlib 和 PIL 的更简洁的 Python3 版本。合并从 URL 打开的答案。

import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

pil_im = Image.open('image.png') #Take jpg + png
## 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()

【讨论】:

【参考方案9】:

这将在 Jupyter 中导入并显示 .jpg 图像(在 Anaconda 环境中使用 Python 2.7 测试)

from IPython.display import display
from PIL import Image


path="/path/to/image.jpg"
display(Image.open(path))

你可能需要安装 PIL

在 Anaconda 中,这是通过键入来完成的

conda install pillow

【讨论】:

【参考方案10】:

感谢this post,您可以执行以下操作:

from IPython.display import Image
Image(filename='test.png') 

(official docs)

【讨论】:

最好使用公共 API 而不访问内部:from IPython.display import Image 应该从 0.13 开始工作。 如果在循环内则不显示图像 大多数人都希望得到 DrMcCleod 的答案。 这仅适用于我通过 Image(filename='test.png') 来显示,如以下线程中所建议的:from IPython.core.display import Image, display display(Image(filename='test.png')) 如果您希望图像也以幻灯片演示模式显示(使用 jupyter nbconvert mynotebook.ipynb --to slides --post serve 运行),则图像路径应以 / 开头,以便它是来自网络的绝对路径根,即![alt text](/test.jpg "Some Title")【参考方案11】:

GenomeDiagram 与 Jupyter (iPython) 一起使用时,显示图像的最简单方法是将 GenomeDiagram 转换为 PNG 图像。这可以使用 IPython.display.Image 对象进行包装,使其显示在笔记本中。

from Bio.Graphics import GenomeDiagram
from Bio.SeqFeature import SeqFeature, FeatureLocation
from IPython.display import display, Image
gd_diagram = GenomeDiagram.Diagram("Test diagram")
gd_track_for_features = gd_diagram.new_track(1, name="Annotated Features")
gd_feature_set = gd_track_for_features.new_set()
gd_feature_set.add_feature(SeqFeature(FeatureLocation(25, 75), strand=+1))
gd_diagram.draw(format="linear", orientation="landscape", pagesize='A4',
                fragments=1, start=0, end=100)
Image(gd_diagram.write_to_string("PNG"))

[See Notebook]

【讨论】:

【参考方案12】:

感谢this 页面,我发现当上面的建议不起作用时,这很有效:

import PIL.Image
from cStringIO import StringIO
import IPython.display
import numpy as np
def showarray(a, fmt='png'):
    a = np.uint8(a)
    f = StringIO()
    PIL.Image.fromarray(a).save(f, fmt)
    IPython.display.display(IPython.display.Image(data=f.getvalue()))

【讨论】:

【参考方案13】:

注意,到目前为止发布的解决方案仅适用于 png 和 jpg!

如果您希望在不导入更多库的情况下更轻松,或者您想在 Ipython Notebook 中显示动画或非动画 GIF 文件。将要显示的行转换为 markdown 并使用这个漂亮的简短技巧!

![alt text](test.gif "Title")

【讨论】:

把图片和 Jupyter notebook 放在同一个文件夹,或者用“relative/path/test.gif”代替“test.gif”【参考方案14】:

如果您尝试在循环中以这种方式显示 Image,则需要将 Image 构造函数包装在 display 方法中。

from IPython.display import Image, display

listOfImageNames = ['/path/to/images/1.png',
                    '/path/to/images/2.png']

for imageName in listOfImageNames:
    display(Image(filename=imageName))

【讨论】:

为什么? (不要告诉我,否则它不起作用。请解释为什么在循环中需要对“显示”的调用,但如果只显示一张图像则不需要)。 因为 IPython Notebooks 只显示单元格中的最后一个返回值,所以当你有来自同一个单元格的两个输出时,你需要使用 'display' 方法。请参阅this question 了解更多信息。 你是我的英雄——我已经找了两天了。 这很棒。如何让下一张图片替换现有图片,例如随着时间的推移图像发生变化的动画效果? 我想知道,我们如何平铺图像?例如显示一组 4x4 的图像。

以上是关于如何在 Jupyter Notebook 中显示文件中的图像?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Jupyter Notebook 中显示文件中的图像?

如何在 Jupyter Notebook 中显示更多行数据框? [复制]

Jupyter Notebook——如何显示目录的导航栏(安装 Jupyter Notebook extension)

如何在 Jupyter notebook (iPython) 中并排显示 2 张图像?

如何在 Jupyter Notebook 的同一行上显示两个 SVG 图像

如何在jupyter-notebook中打印字典?