首页 > 解决方案 > 使用 Python 绘制热图

问题描述

我正在研究对象检测的定位问题。我得到了不同视频帧中矩形框的坐标。所以我的 numpy 数组看起来像这样——

[[403 172 614 326]
[345 153 652 383]
[345 172 537 326]
...
[134 115 326 307]
[153 57 403 307]
[191 19 479 230]]

这里每列中有4个值是x1,y1,x2,y2,它们基本上是矩形框的坐标,定义为-

    __________________(x2,y2)
    |                |
    |                |
    |                |
    _(x1,y1)__________

(x1,y1) 和 (x2,y2) 是矩形局部框的坐标,如图所示。
帧大小(取自视频)是恒定的。它是 480 * 850。
我需要为这些值绘制热图,表示被更多没有占用的像素。的盒子需要更亮。

示例热图
基本上,这不是一个正常的热图(基于其值绘制二维数组)。
谁能建议如何以这种方式获取热图?

标签: pythonpython-3.xmatplotlibgraphheatmap

解决方案


M如果我理解正确,您有一个长度数组n。的每个元素M,比如第一个元素M[0],是一个四元素数组[x_1, y_1, x_2, y_2],在更大的空间中定义了一个盒子。然后,这些框可以重叠,并且您想要由所有这些框的总组合/分层产生的热图。

我将从生成一些随机数据开始:

import numpy as np
M = np.random.randint(0, high=500, size=(50,4))

然后,我们初始化一个空矩阵(我在这里假设生成的热图根据您提供的样本数据具有 500x500 的尺寸,但您可以酌情调整):

R = np.zeros((500,500))

然后,对于输入数组中的每个条目,我们通过将正方形尺寸覆盖的每个“像素”加 1 来填充相应的正方形:

for row in M:
    x1, y1, x2, y2 = row
    for x in range(x1,x2+1):
        for y in range(y1,y2+1):
            R[x,y] += 1

最后,我们可以绘制生成的热图:

import matplotlib.pyplot as plt
import seaborn as sns

sns.heatmap(R)
plt.show()

根据需要,这将为我们提供带有重叠框的热图: 生成的热图


推荐阅读