python - 将低于某个 CV2 颜色图阈值的值设置为透明
问题描述
我目前正在尝试将激活热图应用于照片。
目前,我有原始照片,以及概率掩码。我将概率乘以 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 中的有意设计。
有没有人有实现这些目标的好方法?谢谢!
解决方案
关于你的第二个问题:
以下是如何在 Python/OpenCV 中创建一个简单的自定义两色渐变颜色图。
输入:
import cv2
import numpy as np
# load image as grayscale
img = cv2.imread('lena_gray.png', cv2.IMREAD_GRAYSCALE)
# convert to 3 equal channels
img = cv2.merge((img, img, img))
# create 1 pixel red image
red = np.full((1, 1, 3), (0,0,255), np.uint8)
# create 1 pixel blue image
blue = np.full((1, 1, 3), (255,0,0), np.uint8)
# append the two images
lut = np.concatenate((red, blue), axis=0)
# resize lut to 256 values
lut = cv2.resize(lut, (1,256), interpolation=cv2.INTER_LINEAR)
# apply lut
result = cv2.LUT(img, lut)
# save result
cv2.imwrite('lena_red_blue_lut_mapped.png', result)
# display result
cv2.imshow('RESULT', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
应用于图像的颜色图结果:
关于你的第一个问题:
您正在使用恒定的“不透明度”值将热图图像与原始图像混合。您可以用图像替换单个不透明度值。您只需手动执行 addWeighted 作为 heatmap * opacity_img + original * (1-opacity_img) ,其中您的不透明度图像在 0 到 1 范围内浮动。然后剪辑并转换回 uint8。如果您的不透明度图像是二进制的,那么您可以使用 cv2.bitWiseAnd() 代替乘法。
推荐阅读
- android - Android 许可 BIND_NOTIFICATION_LISTENER_SERVICE 不起作用
- nginx - 如何在 nginx 中暂时禁用从 http 到 https 的重定向?
- php - 从服务器下载 Magento 网站,但在本地服务器上运行时遇到困难。
- discord - discord.js 嵌入的空消息问题
- firebase - 使用 auth.uid 限制对 Firebase-Database 的访问不起作用
- php - Facebook Graph API v3.1 开发人员的访问令牌权限限制
- python - Pandas 按多列和最大值分组
- gams-math - 从 GAM 导出到文本文件
- mysql - mysql - 从 2 个不同的表中选择不同的行
- python - python 相当于 vlookup 的系列和数据框