首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将数据驱动的基于位置的热图添加到一些图像中?

如何将数据驱动的基于位置的热图添加到一些图像中?
EN

Stack Overflow用户
提问于 2021-04-16 07:09:10
回答 1查看 164关注 0票数 0

我想要在特定的非地理位置使用病毒传播事件发生率的现有数据集,并基于一组坐标创建一个热图,我将为其提供基础图像。

为了做到这一点,我会使用一个网站的现有图片,比如下面的Raccoon City:

在这一点上,我想在某些地区(如市中心,浣熊公园,城市学院)的人数增加时,在上面叠加一个类似于此的热图:

我看过各种库,包括OpenCV和Pillow,但还没有找到合适的解决方案。我一直看到对heatmap.py的引用,但它似乎完全被弃用了;而且我不能在pip中安装它。

如果需要,我可以链接到虚拟数据集。

感谢您的关注!这可能会将我们从迫在眉睫的僵尸启示录中解救出来。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-16 15:59:40

假设您在某个NumPy数组中存储了2D (僵尸攻击)数据,我将使用Matplotlib's colormaps从标准化数据生成热图。this Q&A。然后,我将这个热图与(浣熊市)图像混合在一起。因此,在色彩映射中也有一些alpha透明度是很好的,cf。this Q&A

下面是一些代码:

代码语言:javascript
复制
import cv2
from matplotlib.colors import ListedColormap    # Needed for custom colormap
from matplotlib.pyplot import cm, Normalize     # Needed for heatmap
import numpy as np
from scipy.stats import multivariate_normal     # Needed for mockup data

# Read image
image = cv2.imread('R42nH.jpg')

# Generate mockup data
h, w = image.shape[:2]
x = np.arange(w)
y = np.arange(h)
X, Y = np.meshgrid(x, y)
pos = np.dstack((X, Y))
mus = [[200, 100], [300, 400], [500, 150]]
covs = [[[300, 155], [175, 550]], [[400, -100], [40, 250]], [[150, 10], [35, 200]]]
zombies = np.zeros((h, w), np.float64)
for mu, cov in zip(mus, covs):
    rv = multivariate_normal(mu, cov)
    Z = rv.pdf(pos)
    zombies += Z / np.max(Z)
zombies /= np.max(zombies)

# Generate custom colormap with alpha channel,
# cf. https://stackoverflow.com/a/37334212/11089932
cmap = cm.autumn_r
c_cmap = cmap(np.arange(cmap.N))
c_cmap[:, -1] = np.linspace(0, 1, cmap.N)
c_cmap = ListedColormap(c_cmap)

# Generate heatmap, cf. https://stackoverflow.com/a/31546410/11089932
norm = Normalize(vmin=zombies.min(), vmax=zombies.max())
heatmap = c_cmap(norm(zombies))

# Blend image with heatmap
heatmap = cv2.cvtColor(np.uint8(heatmap * 255), cv2.COLOR_RGBA2BGRA)
alpha = heatmap[..., 3] / 255
alpha = np.tile(np.expand_dims(alpha, axis=2), [1, 1, 3])
output = (image * (1 - alpha) + heatmap[..., :3] * alpha).astype(np.uint8)

# Output
cv2.imshow('Zombie Attack', output)
cv2.waitKey(0)
cv2.destroyAllWindows()

热图将如下所示:

最后的输出如下所示:

请检查您是否可以将您的数据提供给该管道,以及结果是否符合您的想法。

如果你还想要在较低的(僵尸攻击)数字下也有“显著”的颜色,那么整个颜色图上的线性alpha透明度可能没有那么大的好处。也许然后手动调整alpha透明度。

代码语言:javascript
复制
----------------------------------------
System information
----------------------------------------
Platform:      Windows-10-10.0.16299-SP0
Python:        3.9.1
PyCharm:       2021.1
Matplotlib:    3.4.1
NumPy:         1.20.2
OpenCV:        4.5.1
SciPy:         1.6.2
----------------------------------------
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67117074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档