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

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

然而,我在想,一种解决这个问题的方法是将绘图/基因组图写入一个文件,然后内联打开图像,结果会是这样的:

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

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

436848 次浏览

这篇文章提供,你可以做以下事情:

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

(官方文档)

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

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

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

如果你想让它更简单,而不需要导入更多的库,或者你想在你的Ipython Notebook中显示一个动画或非动画的GIF文件。转换行,你想显示它markdown和使用这个漂亮的短hack!

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

页提供,我发现当上面的建议没有时,这是有效的:

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

当与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"))

[参见Notebook] .

这将在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

一个更干净的Python3版本,使用标准numpy, matplotlib和PIL。合并从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()
你可以在html代码中使用markdown部分: 例子:< / p >
 <img src="https://www.tensorflow.org/images/colab_logo_32px.png" />

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

import ipyplot


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

enter image description here

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

enter image description here

from IPython.display import Image


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

我见过一些解决方案,有些不会工作,因为原始目录,当添加像上面这样的代码时,只记得在目录前添加'r'。这应该可以避免这种错误:(unicode error)'unicodeescape'编解码器无法解码位置2-3中的字节:截断的\UXXXXXXXX转义

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

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

a是数组

a.shape
(720, 1280, 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()

如果您希望将映像从本地主机嵌入到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中选择了正确的图像类型。

这是使用opencv-python的解决方案,但它打开的新窗口在等待中很忙

import cv2 # pip install opencv-python
image = cv2.imread("foo.png")
cv2.imshow('test',image)
cv2.waitKey(duration) # in milliseconds; duration=0 means waiting forever
cv2.destroyAllWindows()

如果你不想在另一个窗口中显示图像,使用matplotlib或其他代替cv2.imshow()

import cv2
import matplotlib.pyplot as plt
image = cv2.imread("foo.png")
plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
plt.show()

你可以直接使用这个,不用进口PIL

from IPython.display import Image, display
    

display(Image(base_image_path))