如何将热成像图中低于特定阈值的区域设为透明后叠加到RGB摄像头画面
实现方案
核心思路是基于原始灰度热成像图生成二值化掩码,直接用掩码控制热成像像素的拷贝,无需使用统一透明度的加权融合,刚好满足低温完全透明、高温完全不透明的需求。
实现步骤
- 第一步:保留原始的灰度热成像图(不要直接覆盖为彩色图),设置对应温度的灰度阈值,生成二值掩码。低于阈值的区域掩码值为0,高于阈值的区域掩码值为255。
- 第二步:将灰度热成像转换为彩色热成像图。
- 第三步:使用
cv2.copyTo方法,基于掩码只把高温区域的彩色热成像像素复制到RGB背景的对应区域。
示例代码
# 假设thermal_gray为原始输出的灰度热成像图,foreground_height/foreground_width为热成像图尺寸 threshold_val = 120 # 可根据实际温度对应灰度值调整,值越高保留的高温区域越少 # 生成二值掩码:低于阈值的区域为0(透明),高于阈值的区域为255(不透明) ret, mask = cv2.threshold(thermal_gray, threshold_val, 255, cv2.THRESH_BINARY) # 灰度热成像转彩色 thermal_colored = cv2.applyColorMap(thermal_gray, cv2.COLORMAP_HOT) # 取背景图对应热成像尺寸的ROI区域 background_roi = background[:foreground_height, :foreground_width, :] # 仅将掩码为255的热成像像素复制到背景ROI上 cv2.copyTo(thermal_colored, mask, background_roi) # 直接显示最终合成画面 cv2.imshow('composited image', background)
调整说明
你可以根据实际需求调整threshold_val的数值:如果想要保留更高温度的区域,就调高阈值;想要保留更多温度偏高的区域,就调低阈值。如果热成像输出不是8位灰度范围,需要先将灰度值映射到0-255范围再做阈值处理。
内容的提问来源于stack exchange,提问作者yoyo
相关产品推荐
相关产品推荐

