在作热度图的时候我们经常需要将热度图调整透明度后叠加在原图上达到更好的展示效果。比如检测人气密度的热度图:

(来自sensetime)
一般作图的时候会第一时间想到matplotlib,因为可以很方便作几乎任何图图,但是最近发现用opencv也很容易执行这个操作。

1. 获取人群密度

输入一张图片我们首先需要获取里面有多少人以及每个人所在的位置信息。这个工作比较复杂,这里不展开讲了,不过提一下集中模式:一种是人群密度不高的场景,可以利用行人检测识别图片中的人及其所在位置,这个方法有很多了,像MTCNN,RCNN,YOLO之类的方法都能用;另一种是广场高密度人群的场景,这样的话因为人与人之间的重叠度很高,大部分人是检测不到的,需要利用检测人头或者用这篇文章的方法来提高检测精度。

2. 热度图的梯度设置

热力图的颜色主要表现的就是这个点代表的人群密度,密度越高,颜色越深。之前我们获取的是检测到的人的bounding box的中心的坐标,那么获取每个点的热度有一下两种方法:1. 设定半径,计算每个像素点在此半径内所包含的人所在的点的数量,此数量即代表词典的热度;2. 设定半径,以每个人所在的点以此半径设定热度梯度,如果两个点有交叉将交叉区域的热度叠加。第一种方法如果图片比较大的时候会很慢,所以一般用第二种。

3. 根据热度分配像素颜色

所谓的热度图就是根据所在位置的值的大小从颜色梯度提取合适的颜色。获取颜色梯度可以通过matplotlib的get_cmap函数,也可以用colour包下的Color函数自己定义(当然也可以用matplotlib定义,就是有点麻烦)。
下面的例子就是用上述2里面第一种结合get_cmap/Color函数将每个像素的热度转换成相应的颜色:

def density_heatmap(image, box_centers, radias=100):import matplotlib.pyplot as pltfrom colour import Colordensity_range = 100gradient = np.linspace(0, 1, density_range)img_width = image.shape[1]img_height = image.shape[0]density_map = np.zeros((img_height, img_width))color_map = np.empty([img_height, img_width, 3], dtype=int)# get gradient color using rainbowcmap = plt.get_cmap("rainbow") # 使用matplotlib获取颜色梯度blue = Color("blue") # 使用Color来生成颜色梯度hex_colors = list(blue.range_to(Color("red"), density_range))rgb_colors = [[rgb * 255 for rgb in color.rgb] for color in hex_colors][::-1]for i in range(img_height):for j in range(img_width):for box in box_centers:dist = distance.euclidean(box, (j, i))if dist <= radias * 0.25:density_map[i][j] += 10elif dist <= radias:density_map[i][j] += (radias - dist) / (radias * 0.75) * 10ratio = min(density_range-1, int(density_map[i][j]))for k in range(3):# color_map[i][j][k] = int(cmap(gradient[ratio])[:3][k]*255)color_map[i][j][k] = rgb_colors[ratio][k]return color_map

但是利用heatmap包可以很方便用2里面的第二种方式画热度图:

def use_heatmap(image, box_centers):import heatmaphm = heatmap.Heatmap()box_centers = [(i, image.shape[0] - j) for i, j in box_centers]img = hm.heatmap(box_centers, dotsize=200, size=(image.shape[1], image.shape[0]), opacity=128, area=((0, 0), (image.shape[1], image.shape[0])))return img

4. 将热度图调整透明度覆盖到原图上

利用opencv函数(opencv的安装可以参考这里)里面的addWeighted函数可以实现。

frame = cv2.imread(img) # origin image
heatmap = cv2.imread(hm) # heatmap image
overlay = frame.copy()
alpha = 0.5 # 设置覆盖图片的透明度
cv2.rectangle(overlay, (0, 0), (frame.shape[1], frame.shape[0]), (255, 0, 0), -1) # 设置蓝色为热度图基本色
cv2.addWeighted(overlay, alpha, frame, 1-alpha, 0, frame) # 将背景热度图覆盖到原图
cv2.addWeighted(heatmap, alpha, frame, 1-alpha, 0, frame) # 将热度图覆盖到原图
cv2.imshow('frame', frame)
cv2.waitKey(0)

cv2.addWeighted有6个参数(具体可以看这里):第一个为需要叠加的表层图片;第二个为叠加图片的透明度,越接近1越不透明;第三个为叠加的底层图片;第4个为底层图片的透明度,为1-alpha;第5个为一个标量直接加在两张图片的加权和上面,一般直接设为0就行;第6个为最后的加权和操作后的输出的目标图片。

通过上述操作就可以拿到所需的热度图了。

参考:

http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html
http://jjguy.com/heatmap/
https://pypi.python.org/pypi/colour/
https://matplotlib.org/examples/color/colormaps_reference.html
http://www.pyimagesearch.com/2016/03/07/transparent-overlays-with-opencv/
http://bsou.io/posts/color-gradients-with-python

转载于:https://www.cnblogs.com/arkenstone/p/6932632.html

利用opencv作透明重叠人群密度热度图相关推荐

  1. 深度学习上的又一重点发现——利用MSCNN实现人群密度监测

    作者|李秋键 出品|AI科技大本营(ID:rgznai100) 人群密度计数是指估计图像或视频中人群的数量.密度或分布,它是智能视频监控分析领域的关键问题和研究热点,也是后续行为分析.拥塞分析.异常检 ...

  2. 利用MSCNN实现人群密度监测

    人群密度计数是指估计图像或视频中人群的数量.密度或分布,它是智能视频监控分析领域的关键问题和研究热点,也是后续行为分析.拥塞分析.异常检测和事件检测等高级视频处理任务的基础.随着城市化进程的快速推进, ...

  3. 利用OpenCV、Python和Ubidots构建行人计数器程序(附完整代码)

    作者 | Jose Garcia 译者 | 吴振东 校对 | 张一豪.林亦霖,编辑 | 于腾凯 来源 | 数据派(ID:datapi) 导读:本文将利用OpenCV,Python和Ubidots来编写 ...

  4. 利用OpenCV进行图像的轮廓检测

    简 介: 本文对于OpenCV中的轮廓检测算法进行了讨论,可以看到一些基于轮廓检测的应用.接着对四种不同的提取方式的结果进行了讨论.你还了解了如何将轮廓进行绘制的方法. 关键词: 轮廓检测,二值化 § ...

  5. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  6. 利用OpenCV的函数cvtcolor()进行颜色空间转换时需要注意的地方

    OpenCV的函数cvtcolor()的原型如下: C++原型: void cv::cvtColor(InputArray src,OutputArray dst,int code,int dstCn ...

  7. 利用OpenCV实现图像拼接的代码

    图像处理开发需求.图像处理接私活挣零花钱,请加微信/QQ 2487872782 图像处理开发资料.图像处理技术交流请加QQ群,群号 271891601 图像拼接是利用连续帧图像生成全景图或更高分辨率的 ...

  8. 如何利用OpenCV自带的级联分类器训练程序训练分类器

    介绍 使用级联分类器工作包括两个阶段:训练和检测. 检测部分在OpenCVobjdetect 模块的文档中有介绍,在那个文档中给出了一些级联分类器的基本介绍.当前的指南描述了如何训练分类器:准备训练数 ...

  9. 人群密度算法_算法人群的力量。

    人群密度算法 介绍 (Introduction) One of the most fascinating historical examples of the power of crowds can ...

最新文章

  1. 面试官问:MySQL 的自增 ID 用完了,怎么办?
  2. ios unrecognized selector sent to instance出现的原因和解决方案
  3. 1.2 @Override注解
  4. 不使用java内置函数,将String字符串转换为int类型
  5. C#中修改文件或文件夹的权限,为指定用户、用户组添加完全控制权限
  6. 异常mongodb:Invalid BSON field name XXXXXX:YYYYY.zz
  7. [Python] isinstance() for checking object type
  8. 微信扫描二维码和浏览器扫描二维码 ios和Android 分别进入不用的提示页面
  9. ffmpeg的内部Video Buffer管理和传送机制
  10. 报错 hint: Updates were rejected because the remote contains work that you do 解决方法
  11. 【优化调度】基于matlab多目标粒子群算法求解风电光伏储能电网发电与需求响应调度优化问题【含Matlab源码 239期】
  12. WZOI.CC基础题库答案向导
  13. lisp6 暖通cad_AutoCAD超强小工具(ARKtools)说明
  14. win7 局域网服务器 文件共享,Win7系统电脑设置局域网共享文件的操作方法-电脑自学网...
  15. 所有浏览器主页都变成hao123,hao123劫持浏览器(亲测有效)
  16. python自学第七天之字典的增删改查
  17. 快速理清Paxos、Zab、Raft协议
  18. 【ninja】Ninja安装和基本使用
  19. 数据结构算法常见的 100 道面试题全解析:2019 版
  20. 汇编指令: JO、JNO、JB、JNB、JE、JNE、JBE、JA、JS、JNS、JP、JNP、JL、JNL、JNG、JG、JCXZ、JECXZ、JMP、JMP...

热门文章

  1. 公安信息通信网边界接入平台安全规范_【市场动态】3.56 亿元,阿里云中标青岛智慧公安项目...
  2. Javascript选择排序
  3. Python的for循环显示每个元素的下标
  4. python花瓣长度和花瓣宽度散点图鸢尾花_Python可视化seaborn练习题
  5. html5 中keygen用法,HTML5: keygen 标签
  6. 20200320:反转字符串中的元音字母(leetcode345)
  7. treeset 是有序吗_TreeSet如何实现有序?
  8. sunplus8202v 无线游戏手柄——续
  9. 加密解密你了解多少?
  10. 【转载】石油天然气常用单位换算