【问题标题】:How to add a data driven location based heatmap to some image?如何将基于数据驱动的基于位置的热图添加到某些图像?
【发布时间】:2021-04-15 23:09:10
【问题描述】:

我想获取特定非地理位置的病毒传播事件率的现有数据集,并根据一组坐标创建热图,我将把它提供给基本图像。

为此,我会拍摄一个网站的现有图片,例如下面的浣熊市:

在此之上,随着某些地区(如市中心、浣熊公园、浣熊市学院)的数量增加,我想在其上叠加一个类似于此的热图:

我查看了包括 OpenCV 和 Pillow 在内的各种库,但没有找到合适的解决方案。我不断看到对heatmap.py 的引用,但它似乎已被完全弃用;我无法使用pip 安装它。

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

感谢收看!这可能只是将我们从即将到来的僵尸启示录中拯救出来(¬º-°)¬。

【问题讨论】:

  • 发布您的图片和对应的热图图片。
  • 我没有关注?我在帖子中放了 2 张图片。
  • 它们的大小不同。那么我怎么知道在图像上放置热图的位置呢?是否居中?
  • 啊...我明白了。第二张图片只是我想做的一个例子。这个想法是一个坐标网格将映射到原始图像上,每个坐标元组将包含一个值,该值会随着相应的颜色变化而增加和减少。这有意义吗?
  • 不完全。 x,y 坐标与您的热图值有什么关系?您是否有想要使用的功能或只是一些强度值?如果是后者,它们是在图像上插值还是只是需要插值的稀疏点位置?

标签: python opencv python-imaging-library heatmap


【解决方案1】:

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

这里有一些代码:

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 透明度。

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

【讨论】:

    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 2017-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 1970-01-01
    相关资源
    最近更新 更多