【发布时间】:2019-10-10 01:05:34
【问题描述】:
我的 Python 程序中有一个 (float32) 热图矩阵,如下所示:
[[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99919313 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
1. 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]
[0.99782705 0.99782705 0.99782705 0.99782705 0.99782705 0.99782705
0.99782705 0.99782705 0.99782705]]
这是通过matplotlib.pyplot.matshow() 打印时热图的样子:
现在我想将该矩阵调整为图像的大小,并将其作为热图覆盖到该图像上。所以首先我加载另一个图像并将热图调整为图像大小:
img = cv2.imread(image_path)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
调整热图矩阵大小后变成这样:
好的,到目前为止一切看起来都很好。现在,根据我在网上找到的各种资源,我想将该热图转换为uint8 RGB 格式,应用cv2.COLORMAP_JET 色图,并将其叠加到原始图像上:
heatmap = cv2.applyColorMap(np.uint8(255 * heatmap), cv2.COLORMAP_JET)
superimposed = heatmap * 0.4 + img
但这似乎不起作用。当我现在通过cv2.imshow('Heatmap', heatmap) 渲染热图时,它变成了一个普通的(红色)图像,它已经失去了原始热图中的所有“特征”。因此,我想要放置热图的图像也与以前保持一致(即渲染 superimposed 看起来与 img 完全相同)。
有什么我可能在这里遗漏的想法吗?
对于其他记录,我想实现类似于此的目标:
Grad-CAM implementation for Keras models
【问题讨论】:
-
请发布一个工作示例,包括“导入”行的完整代码,这样我们就可以重现错误,而不必猜测您的代码是做什么的。
-
所以基本上用你的数字你会得到 3 个值 -> 254.4458 、 254.7942 和 255 然后 uint8 会将它们转换为 254 和 255,颜色映射更像是一个查找表,并且会给你几乎相同的颜色给它。现在,您可以尝试使用 cv2.normalize,这会将第一个数字设为 0,最后一个数字设为 255,中间的数字介于两者之间,如果您愿意,我可以举个例子
-
@L.C.完成,你可以在这里找到它:pastebin.com/YUmPCy1Y
标签: python opencv keras heatmap cv2