plt.imshow() 和 plt.show() 没有图像弹出或显示

Posted

技术标签:

【中文标题】plt.imshow() 和 plt.show() 没有图像弹出或显示【英文标题】:No image pop-up or display for plt.imshow() and plt.show() 【发布时间】:2019-02-10 04:14:10 【问题描述】:

我试图通过将 cocoapi 演示脚本复制粘贴到我自己的本地脚本中来重新创建它,而不是在 Jupyter 笔记本上运行它。一切正常,肯定有一个图像可以读取并且可以显示,因为我已经使用 openCV 的 imshow() 函数对其进行了测试(并且图像会弹出)。但是,当我尝试使用 plt.imshow() 和 plt.show() 打开图像时,图像不会出现。

我上网搜索解决方案,他们建议是后端问题?但是,当我运行 matplotlib.get_backend() 时,它返回:'TkAgg'。

我也跑了:sudo apt-get install tcl-dev tk-dev python-tk python3-tk 没有错误也没有问题。

from __future__ import print_function
from pycocotools.coco import COCO
import os, sys, zipfile
import urllib.request
import shutil
import numpy as np
import skimage.io as io
import matplotlib.pyplot as plt
import pylab
pylab.rcParams['figure.figsize'] = (8.0, 10.0)
...
# load and display image
I = io.imread('%s/images/%s/%s'%(dataDir,dataType,img['file_name']))
plt.axis('off')
plt.imshow(I)
plt.show()

版本 * 操作系统:Ubuntu 16.04 * Matplotlib 版本:2.2.3 * Matplotlib 后端 (print(matplotlib.get_backend())): TkAgg * Python 版本:3.5.2

【问题讨论】:

您收到任何消息/警告吗?你能用plt.savefig('savedImage.png')保存图片吗? 我意识到为什么我会遇到这个问题。 cocoapi 的源代码将 matplotlib 预设为使用 Agg,因此我无法将其更改为 TkAgg。非常感谢你的建议!!!! :) 很高兴您解决了这个问题,也许可以发布一个答案,以防其他人遇到类似问题。 好的!谢谢! :) 【参考方案1】:

对此有两种解决方案。 @ImportanceOfBeingErnest 指出第一个解决方案是切换后端。解决办法是stated in this thread

正如@ImportanceOfBeingErnest 所指出的,第二种解决方案不太理想,因为它涉及更改源代码。但是,如果由于某种原因第一种方法不起作用,请随意尝试第二种方法。

第二种解决方案: 当我运行 matplotlib.get_backend() 时,它返回:'TkAgg' 所以我很困惑为什么它仍然不起作用。结果它返回了“TkAgg”,因为我在终端做了类似的事情:

Python 3.5.2 (default, Nov 23 2017, 16:37:01)  
[GCC 5.4.0 20160609] on linux  
Type "help", "copyright", "credits" or "license" for more information.  
import matplotlib  
matplotlib.get_backend()  

但是用线

from pycocotools.coco import COCO

从终端:

This call to matplotlib.use() has no effect because the backend has already
been chosen; matplotlib.use() must be called *before* pylab, matplotlib.pyplot,
or matplotlib.backends is imported for the first time.

在 cocoapi/PythonAPI/pycocotools/coco.py 文件中,导入的第三行是:

import matplotlib; matplotlib.use('Agg')

将其更改为:

import matplotlib; matplotlib.use('TkAgg')

一切都会好起来的。

【讨论】:

难道switching backends而不是设置它不起作用? 嗯,我不确定。我会尝试一下,并尽快让你知道!感谢您的建议! :) 那你能编辑答案吗?我认为我们不希望人们认为他们需要更改某些源代码才能获得不同的后端。 哦,是的,确定

以上是关于plt.imshow() 和 plt.show() 没有图像弹出或显示的主要内容,如果未能解决你的问题,请参考以下文章

matplotlib中的imshow()

python plt关闭坐标轴,刻度不可见

K-means算法应用:图片压缩

K-means算法应用:图片压缩

python之图像加载和简单处理

K-means算法应用:图片压缩