如何在python中使用matplotlib在图像上绘制图形?

时间:2018-12-01 08:54:47

标签: python matplotlib

我已将tensorflow对象检测API与OpenCv集成在一起,以跟踪框架中的人物,以便python脚本可以绘制图形来显示人物进入和退出框架的位置以及其移动的位置在框架内。

要绘制图形,我正在使用matplotlib。我有x y坐标,该图显示得非常好。现在,我需要在该图的背景中放置一个图像。为此,我已经完成以下操作:

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()

在上面的代码中,我正在读取作为图像的文件,然后将其显示在图形上。这样做会使我的最终图形看起来不好,因为图像向上移动,而线形图保留在下部,而我希望线形图位于图像上。我提到了这个question,这是我要实现的目标,但是在我提到的问题中,解决方案说明了在图像上画一条线。在我的方案中,我必须绘制一个具有多个坐标的图形。

我尝试了所提及问题中说明的解决方案,并在显示extent中的图像时使用了matplotlib,如下所示:

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

如您所见,图像已正确拟合到图形中,但是一旦我绘制了x y坐标,它就会如下所示:

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

任何人都可以告诉我我在做什么错。请帮忙。谢谢

1 个答案:

答案 0 :(得分:1)

如果extent仅使用开始和停止位置,则图像的角将与这些位置匹配。这会将所有较高或较低的中间xy值放置在图像外部。

我不确定xy的坐标都包含什么,但是如果它们在整个所需范围内都具有点,则可以使用最小值和最大值来获取{{1 }}。

extent

enter image description here

但是,考虑到边界框的这些跟踪位置,我认为情况不会如此,在这种情况下,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() 根本不应该基于这些值。相反,请使用原始图像尺寸,我猜是1280x720。

extent

enter image description here

如果您要跟踪边界框的中上方,它似乎会对齐。