如何将带透明通道的灰度PNG转换为保留透明度的热力图
带alpha通道灰度PNG转热力图解决方案
核心思路
cv2.applyColorMap()接口仅支持8位单通道/三通道图像输入,直接传入带alpha通道的多通道图像会报错。我们可以通过拆分「灰度通道」和「alpha透明通道」单独处理后再合并的方式实现需求,完全保留原图像透明度,无需依赖不支持Python3的heatmap包。
完整实现代码
import cv2 import numpy as np # 读取带alpha通道的PNG图像,必须加cv2.IMREAD_UNCHANGED参数保留透明通道 img = cv2.imread("input.png", cv2.IMREAD_UNCHANGED) gray = None alpha = None # 适配不同通道类型的输入图像 if len(img.shape) == 2: # 无alpha单通道灰度图 gray = img elif img.shape[2] == 4: # 四通道BGRA格式灰度图 gray = img[:, :, 0] alpha = img[:, :, 3] elif img.shape[2] == 2: # 两通道灰度+alpha格式 gray = img[:, :, 0] alpha = img[:, :, 1] # 可选:如果灰度值范围不是0-255,先做归一化转8位 # gray = cv2.normalize(gray, None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U) # 对灰度通道执行热力图映射 heatmap_bgr = cv2.applyColorMap(gray, cv2.COLORMAP_JET) # 合并回原alpha通道 if alpha is not None: alpha = alpha.reshape((heatmap_bgr.shape[0], heatmap_bgr.shape[1], 1)) heatmap_result = np.concatenate((heatmap_bgr, alpha), axis=2) else: heatmap_result = heatmap_bgr # 保存结果 cv2.imwrite("heatmap_output.png", heatmap_result)
关键说明
- 代码适配无alpha单通道灰度图、两通道灰度+alpha图、四通道BGRA灰度图三类常见输入
- 全程未修改原alpha通道的数值,所有像素的透明度和原图完全一致
- COLORMAP_JET原生匹配需求:最暗的像素映射为蓝色,最亮的像素映射为红色
内容的提问来源于stack exchange,提问作者GirkovArpa
相关产品推荐
相关产品推荐

