Mat*_*ias 4 python opencv heatmap keras cv2
float32我的 Python 程序中有一个 ( ) 热图矩阵,如下所示:
[[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]]
Run Code Online (Sandbox Code Playgroud)
这是通过matplotlib.pyplot.matshow()以下方式打印的热图的样子:
现在我想将该矩阵的大小调整为图像的大小,并将其作为热图覆盖在该图像上。所以首先我加载另一个图像并将热图调整为图像大小:
img = cv2.imread(image_path)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
Run Code Online (Sandbox Code Playgroud)
调整热图矩阵大小后变为:
好的,到目前为止一切都很好。现在,根据我在网上找到的各种资源,我想将该热图转换为uint8RGB 格式,应用cv2.COLORMAP_JET颜色图,并将其叠加到原始图像上:
heatmap = cv2.applyColorMap(np.uint8(255 * heatmap), cv2.COLORMAP_JET)
superimposed = heatmap * 0.4 + img
Run Code Online (Sandbox Code Playgroud)
但这似乎不起作用。当我现在通过cv2.imshow('Heatmap', heatmap)它渲染热图时它变成了一个普通(红色)图像,它已经失去了原始热图的所有“特征”。因此,我想要放置热图的图像也保持与以前相同(即渲染superimposed看起来与 完全一样img)。
有什么想法我可能会在这里遗漏吗?
对于这些记录,我想实现类似的东西:
Keras 模型的 Grad-CAM implementation
PS:完整的工作示例在这里
如果是用于可视化,则需要在数字之间进行更大的分离。你基本上有 3 个数字,当你对它们进行缩放(乘以 255)时,它们基本上变成了 2 个数字(254 和 255)。涂上颜色的时候,两个数字几乎一样,真的很难知道哪个是哪个……
解决方案:
使用当前数字创建一个新比例。您可以使用 cv2.normalize 轻松做到这一点
import matplotlib.pyplot as plt
import numpy as np
import cv2
heatmap = np.array([
[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.00000000,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]
])
heatmap = cv2.resize(heatmap, (400,300))
plt.matshow(heatmap)
plt.show()
heatmapshow = None
heatmapshow = cv2.normalize(heatmap, heatmapshow, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
heatmapshow = cv2.applyColorMap(heatmapshow, cv2.COLORMAP_JET)
cv2.imshow("Heatmap", heatmapshow)
cv2.waitKey(0)
Run Code Online (Sandbox Code Playgroud)
你会得到:
注意:我只是在调整大小中输入数字,因为我没有示例图像。
但是,这里需要考虑一件事。使用此解决方案,最大的数字将是红色的,无论它有多小。如果您需要一个新的固定比例(例如 1. 是红色的,0 是最小的数字),您需要手动执行以下操作:
newvalue= (maxNew-minNew)/(max-min)*(value-max)+maxNew
Run Code Online (Sandbox Code Playgroud)
where maxNew= 255andminNew=0和 max 和 min 将是您任意决定的(例如 0.9978 和 1.0)
| 归档时间: |
|
| 查看次数: |
6166 次 |
| 最近记录: |