- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我的 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 个数字,当你缩放它们(乘以 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)
你得到:
注意:我只是在调整大小中输入了数字,因为我没有样本图像。
但是,这里需要考虑一件事。使用此解决方案,最大的数字将是红色的,而不管它有多小。如果您需要一个新的固定缩放比例(例如 1. 是红色的,0 是最小的数字),您需要手动执行,例如:
newvalue= (maxNew-minNew)/(max-min)*(value-max)+maxNew
其中 maxNew= 255
和 minNew=0
以及 max 和 min 将是您任意决定的(例如 0.9978 和 1.0)
关于python - 在 OpenCV 中将热图矩阵可视化到图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56275515/
我想要类似于以下伪代码的东西: while input is not None and timer = 5: print "took too long" else: print inp
如何将 MainEngine Observable 转换为 Cold?来自这个例子: public IObservable MainEngine { get
自从手表被发明以来,表盘的方圆之争就始终没有停下来过,在漫长的岁月中,无论是方形还是圆形表盘,人们都为其寻找到足够多的设计元素,让其肆意成长,这种生机与活力后来也延续到了智能手表上,在2014年,这
我正在学习 CUDA,试图解决一些标准问题。例如,我正在使用以下代码求解二维扩散方程。但我的结果与标准结果不同,我无法弄清楚。 //kernel definition __global__ void
我的 Web 应用程序使用 native dll 来实现其部分功能(其位置在 PATH 中提供)。一切正常,直到我对 WAR 进行更改并且 JBoss 热部署此 WAR。此时dll已经找不到了,需要手
我看到这个问题here 。这是关于实现每个发出的项目的延迟。这是根据accepted answer如何实现的: Observable.zip(Observable.range(1, 5) .g
我最近一直在进行冷迁移...这意味着我无法在进行迁移时从应用程序级别读取/写入数据库(维护页面)。 这样就不会因为更改结构而发生错误,而且如果负载很大,我也不希望 mysql 在迁移过程中崩溃。 我的
我是一名优秀的程序员,十分优秀!