无法在Matplotlib中保存注释图像

4
我已经阅读了关于这个主题的所有SO线程,并广泛阅读了文档,甚至从这些问题/教程中复制和粘贴了代码。但我仍然无法使用matplotlib加载jpg图片、注释并保存绘图。我真的需要一些关于这个主题的建议。
以下是我的多次尝试之一的示例:
import cv2
import matplotlib.pyplot as plt

image = cv2.imread(...filepath-to-img...)
fig, ax = plt.subplots()
ax.imshow(image)
ax.add_patch(plt.Rectangle(...params...)
plt.savefig(...filepath...)

图像正确加载,当我交互式工作并运行plt.subplots()和ax.imshow(image)命令时,我看到一个弹出图像的绘图,并得到一条消息说这是一个AxesImage对象。
但当我尝试保存时,它显示“Figure size 432x288 with 0 Axes”,并且保存在磁盘上的结果图像是空白的。
我也尝试了以下内容以保存,但都没有成功。
my_fig = plt.cgf()
my_fig.savefig(...filepath...)

基本上,创建图形和轴,并调用ax.imshow()并没有将图片添加到我的轴中,也没有ax.add_patch()的调用对轴做出任何效果。
我还尝试了不创建单独的轴来实现:
plt.figure()
plt.imshow(image)
my_axes = plt.gca()
my_axes.add_patch(plt.Rectangle(...params...)
plt.savefig(...filepath...)

再次运行后,结果图为空且没有坐标轴。

我知道可能有一个显而易见的步骤我错过了,但我无法弄清楚是什么,即使复制和粘贴代码也没有帮助。

编辑:响应评论添加完整代码

import cv2
from matplotlib import pyplot as plt

img = './1.png' # 364x364

image = cv2.imread(img)
fig, ax = plt.subplots()
ax.imshow(image)

color = (1, 0, 0, 1)
ax.add_patch(plt.Rectangle((139, 25), 85, 336,
    color = color,
    fill = False,
    linewidth = 2))
plt.savefig('./annotated.png')

公平。将复制完整的代码块。 - Darren
另外,是的,图片可以正确加载。我可以使用cv2.imshow()来显示它,正如我在帖子中提到的那样,当运行ax.imshow(image)这一行时,图片会出现在输出中。 - Darren
抱歉,也许我表达不够清晰。我所说的“如何运行代码”是指您可以告诉在哪里输入该代码,执行它的步骤以及使用的程序和库(包括它们各自的版本)。 - ImportanceOfBeingErnest
啊,我明白了。Python 3.6.5,OpenCV 3.4.1,matplotlib 2.2.2。我通常使用Atom/Hydrogen与iPython/Jupyter进行交互式编程。无论是逐行运行还是一次性运行整个脚本,我都会得到相同的结果。在Spyder中运行时也是如此。 - Darren
好的。哇。好吧,至少我知道我不是疯了,而且我做的事情是正确的 - 我真的不知道为什么它会这样表现不良。感谢你的帮助。 - Darren
显示剩余2条评论
1个回答

5
我也遇到了同样的问题,以下是解决方法。
from matplotlib.patches import Rectangle
fig,ax = plt.subplots(figsize=(15,12))
ax.imshow(frames[0])
x,y,w,h = bboxes[0]
ax.add_patch(Rectangle((x,y),w,h, linewidth=3, edgecolor='r', facecolor='none'))
plt.axis('off')
plt.savefig("out.png",bbox_inches='tight',pad_inches=0)
plt.show()

当plt.show()在plt.savefig()之前被调用时,我得到了一个空白的图像。

我已经找了好几个小时了,谢谢 :) - MedoAlmasry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接