【问题标题】:How to show PIL Image in ipython notebook如何在 ipython 笔记本中显示 PIL 图像
【发布时间】: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>

【问题讨论】:

标签: python ipython python-imaging-library ipython-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

            【讨论】:

              猜你喜欢
              • 2016-02-24
              • 2016-08-14
              • 2014-10-19
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2022-08-24
              • 1970-01-01
              • 2017-01-25
              相关资源
              最近更新 更多