如何在 Python 中使用 Matplotlib 在图像上绘制图形?

4
我已经将tensorflow目标检测API与OpenCv集成,以便在帧内跟踪一个人,这样Python脚本就可以绘制一个图表,显示人进入和离开帧的位置以及其在帧内移动的位置。
为了绘制图表,我正在使用matplotlib。我有xy坐标,并且图表显示得非常好。现在我需要在该图表的背景中放置一张图片。为此,我已经完成以下操作:
image = mpimg.imread(file)
plt.imshow(image)
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()

在上述代码中,我正在读取一个图像文件并将其显示在图形上。这样做使得我的最终图形不够美观,因为图像向上移动,而线图仍然停留在较低部分,而我希望线图位于图像上方。我参考了这个问题,这就是我想要实现的,但在我提到的问题中,解决方案是解释如何在图像上绘制一条直线。在我的情况下,我必须绘制一个具有多个坐标的图形。
我尝试了所提到问题中解释的解决方案,并在matplotlib中显示图像时使用了extent,如下:
image = mpimg.imread(file)
plt.imshow(image, extent=[x[0], x[-1], y[0], y[-1]])
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()

在上述代码中,我使用了extent=[x[0], x[-1], y[0], y[-1]],其中x[0]、x[-1]、y[0]、y[-1]表示xy坐标的第一个和最后一个点,以便将图像正确适配到图表上。这样做,我得到了以下结果:

enter image description here

你可以看到图像已经正确地适应于图表中,但是一旦我绘制我的xy坐标,它看起来像下面这样:

enter image description here

这不如线条应该在图像上好看。 我在这里感到困惑,不知道哪里做错了。 我尝试遵循相同的答案并使用了extent,但在绘制图像时,它稍微向前移动了一些。 以下是我的坐标:
x = [612, 590, 646, 712, 466, 475]
y = [623, 562, 557, 567, 530, 536]

绿点代表起点,蓝点代表终点。下面是图形的图像,如果我不使用背景图像。需要注意的一点是,x,y坐标不与上面的图像匹配,只与下面的图形匹配(没有背景图像):

enter image description here

请问有人可以告诉我在这里做错了什么。请帮忙,谢谢。


我认为问题并不是特别清晰。所有提到的坐标在图表中都被正确绘制了。从外部来判断是否合理地假设图像需要恰好延伸到第一个和最后一个坐标之间是很难的。然而,如果这个决定是有道理的,那么所有的图像都是正确的。 - ImportanceOfBeingErnest
1个回答

1
如果extent只使用起始和结束位置,则图像的角落将与这些位置匹配。这将使任何中间的xy值高于或低于图像外部。
我不确定xy坐标包括什么,但如果它们跨越整个所需范围,则可以使用最小值和最大值来获取extent
image = mpimg.imread(file)
plt.imshow(image, extent=[min(x), max(x), min(y), max(y)])
plt.plot(x, y)
plt.plot(x[0], y[0], 'og')
plt.plot(x[-1], y[-1], 'ob')
plt.show()

enter image description here

然而,我认为这不会是情况,因为这些是边界框的跟踪位置,extent 不应该基于这些值。相反,应使用原始图像大小,我猜测它是1280x720。
plt.imshow(image, extent=[0, 1280, 0, 720])

enter image description here

如果您跟踪边界框的中上部,它似乎是对齐的。

谢谢您提供在extent中使用max min值的想法,我会尝试一下。有一个问题,您是如何从图表底部删除通常出现的缩放、主页和其他按钮的?谢谢。 - S Andrew
我使用Jupyter Notebook来绘制图像。然后,只需右键单击,保存,这就是我得到的图像。此外,“x”和“y”具体指什么? - A Kruger
关于xy,我正在从TensorFlow获取对象边界框的坐标。然后,我将这些坐标传递到OpenCV的质心跟踪算法中,该算法返回跟踪对象质心的(x, y)坐标。Opencv算法会一直提供这些质心坐标,直到帧中存在对象为止。这些坐标就是xy值。 - S Andrew
我认为最小值/最大值不会起作用。如果它不起作用,原始图像尺寸是多少?此外,TensorFlow 给出相对于左上角的位置。这里的位置是相对于左下角绘制的。 - A Kruger

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