Python绘制场景热力图实战:基于行人检测坐标的可视化叠加
本文介绍如何在Python中利用行人检测得到的中心坐标绘制场景热力图。通过获取Bounding Box中心点并传入HeatMap库,可生成热力层。代码演示了如何将热力图以指定透明度加权叠加至原图,并通过调整半径参数控制可视化效果,适用于人群密集度等场景分析。
Python热力图绘制原理与流程
在进行如人群密集度等数据的可视化展示时,热力图是一种直观且常用的手段。在Python生态中,实现热力图的绘制相对便捷。
接下来,将以识别图片中的行人并据此绘制热力图为例,详细讲解具体操作流程。
- 第一步:对图像中的人员进行识别,获取每个检测目标的Bounding Box中心坐标。识别算法可选用多种方案,坐标数据亦可手动定义。
- 第二步:将所有获取到的中心坐标存入一个列表类型的变量data中,格式示例为data = [[x1,y1], [x2,y2], …]。
- 第三步:基于坐标数据绘制热力图,并将其以加权方式叠加到原始图像上,形成最终可视化结果。
首先需要导入必要的依赖包:
环境依赖与核心代码实现
import cv2
import numpy as np
from PIL import Image
from pyheatmap.heatmap import HeatMap
import matplotlib.pyplot as plt
根据识别结果生成data数据后,将其作为参数传入apply_heatmap(image, data)函数以执行热力图绘制;
def apply_heatmap(image,data):
'''image是原图,data是坐标'''
'''创建一个新的与原图大小一致的图像,color为0背景为黑色。这里这样做是因为在绘制热力图的时候如果不选择背景图,画出来的图与原图大小不一致(根据点的坐标来的),导致无法对热力图和原图进行加权叠加,因此,这里我新建了一张背景图。'''
background = Image.new("RGB", (image.shape[1], image.shape[0]), color=0)
# 开始绘制热度图
hm = HeatMap(data)
hit_img = hm.heatmap(base=background, r = 100) # background为背景图片,r是半径,默认为10
# ~ plt.figure()
# ~ plt.imshow(hit_img)
# ~ plt.show()
#hit_img.save('out_' + image_name + '.jpeg')
hit_img = cv2.cvtColor(np.asarray(hit_img),cv2.COLOR_RGB2BGR)#Image格式转换成cv2格式
overlay = image.copy()
alpha = 0.5 # 设置覆盖图片的透明度
cv2.rectangle(overlay, (0, 0), (image.shape[1], image.shape[0]), (255, 0, 0), -1) # 设置蓝色为热度图基本色蓝色
image = cv2.addWeighted(overlay, alpha, image, 1-alpha, 0) # 将背景热度图覆盖到原图
image = cv2.addWeighted(hit_img, alpha, image, 1-alpha, 0) # 将热度图覆盖到原图
实验验证与效果调节
此处选取一张网络图片作为实验素材:
原始输入图像如下:

处理后的结果图像如下:

可视化效果支持参数调节,例如通过修改hm.heatmap(base=background, r = 100)中的r参数,即可调整热力点的半径大小。
以上即为Python绘制场景热力图的完整示例,如需了解更多Python热力图绘制相关内容,欢迎查阅本站其他技术文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









