如何向某些图像添加基于数据驱动位置的热图?
How to add a data driven location based heatmap to some image?
我想获取特定非地理位置病毒传播事件率的现有数据集,并根据一组坐标创建热图,我将把它作为基本图像。
为此,我会拍摄网站的现有图像,例如下面的浣熊市:
在此基础上,随着某些区域(如市中心、浣熊公园、浣熊城市学院)人数的增加,我想在其上叠加一个类似于此的热图:
我查看了各种库,包括 OpenCV 和 Pillow,但没有找到非常合适的解决方案。我一直看到对 heatmap.py
的引用,但它似乎已被完全弃用;我无法使用 pip
.
安装它
如果需要,我可以 link 到虚拟数据集。
感谢观看!这可能只是将我们从迫在眉睫的僵尸末日中拯救出来 (¬º-°)¬。
假设您将 2D(僵尸攻击)数据存储在某个 NumPy 数组中,我将使用 Matplotlib's colormaps to generate a heatmap from the normalized data, cf. . Then, I'd blend that heatmap with the (Raccoon City) image. Therefore, it'd be nice to also have some alpha transparency within the colormap, cf. .
这是一些代码:
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.
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.
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
----------------------------------------
我想获取特定非地理位置病毒传播事件率的现有数据集,并根据一组坐标创建热图,我将把它作为基本图像。
为此,我会拍摄网站的现有图像,例如下面的浣熊市:
在此基础上,随着某些区域(如市中心、浣熊公园、浣熊城市学院)人数的增加,我想在其上叠加一个类似于此的热图:
我查看了各种库,包括 OpenCV 和 Pillow,但没有找到非常合适的解决方案。我一直看到对 heatmap.py
的引用,但它似乎已被完全弃用;我无法使用 pip
.
如果需要,我可以 link 到虚拟数据集。
感谢观看!这可能只是将我们从迫在眉睫的僵尸末日中拯救出来 (¬º-°)¬。
假设您将 2D(僵尸攻击)数据存储在某个 NumPy 数组中,我将使用 Matplotlib's colormaps to generate a heatmap from the normalized data, cf.
这是一些代码:
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.
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.
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
----------------------------------------