【问题标题】:How can I display an image from a file in Jupyter Notebook?如何在 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 中打开/显示图像吗?

【问题讨论】:

    标签: python jupyter-notebook 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 的图像。
                      猜你喜欢
                      • 2018-12-21
                      • 2018-05-10
                      • 1970-01-01
                      • 2020-01-19
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-03-14
                      相关资源
                      最近更新 更多