【发布时间】:2020-10-14 22:25:24
【问题描述】:
我目前正在尝试将激活热图应用于照片。
目前,我有原始照片以及概率掩码。我将概率乘以 255,然后向下舍入到最接近的整数。然后我使用 cv2.applyColorMap 和 COLORMAP.JET 将颜色图应用到不透明度为 25% 的图像。
img_cv2 = cv2.cvtColor(np_img, cv2.COLOR_RGB2BGR)
heatmapshow = np.uint8(np.floor(mask * 255))
colormap = cv2.COLORMAP_JET
heatmapshow = cv2.applyColorMap(np.uint8(heatmapshow - 255), colormap)
heatmap_opacity = 0.25
image_opacity = 1.0 - heatmap_opacity
heatmap_arr = cv2.addWeighted(heatmapshow, heatmap_opacity, img_cv2, image_opacity, 0)
当前代码成功生成热图。不过,我希望能够进行两项更改。
-
将不透明度保持在 25% 对于高于某个阈值的所有值(可能 > 0,但我更喜欢灵活性),但是当蒙版低于该阈值时,将这些单元格的不透明度降低到 0%。换句话说,如果激活很少,我想保留原始图像的颜色。
-
如果可能的话,我还希望能够指定一个自定义颜色图,因为原生颜色图非常有限,但如果我可以做自定义不透明度的事情,我也许可以在没有这个的情况下逃脱。
我在 Stackoverflow 上读到,您可能会欺骗 cv2 使其不使用 NaN 值覆盖任何颜色,但也读到它仅适用于浮点数而不适用于整数,因为我使用的是 int8,所以这会使事情变得复杂。我还担心此功能在未来可能会发生变化,因为我不认为这是故意内置到 cv2 中的设计。
有没有人有实现这些目标的好方法?谢谢!
【问题讨论】:
-
本身不是答案,但您可以将 alpha 通道添加到您的
heatmapshow并将其设置为 1 用于值高于 25%(或您想要的任何阈值)的所有像素,并0 到所有其他像素,然后像现在一样使用cv2.addWeighted。请告诉您是否需要有关如何使用 Numpy 执行此操作的更多详细信息。 -
您可以将不透明的颜色映射应用到图像。然后创建一个灰度图像,将您想要的不透明度表示为灰度值,并将阈值设为 0,您不需要任何透明度。然后将该图像放入颜色映射图像的 Alpha 通道中。
-
@TheHalf-BloodPrince 这似乎很合理,最好的方法是什么?
-
@fmw42 听起来很有希望,但是首先将不透明的颜色映射应用于图像会导致信息丢失吗?就像它是 100% 不透明的红色一样,那么我相信我最终会得到一个没有原始颜色信息的透明红色。除非我弄错了,否则我需要在将颜色图应用于原始图像之前对其进行修改?
-
也许我理解错了。 100% 不透明度是完全不透明的。所以红色将是没有透明度的全红色。您正在使用恒定的“不透明度”值将热图图像与原始图像混合。您可以用图像替换单个不透明度值。您只需手动执行 addWeighted 作为 heatmap * opacity_img + original * (1-opacity_img) ,其中您的不透明度图像在 0 到 1 范围内浮动。然后剪辑并转换回 uint8。如果您的不透明度图像是二进制的,那么您可以使用 cv2.bitWiseAnd() 代替乘法。 你能发布你的输入图像和掩码吗?
标签: python numpy opencv cv2 colormap