如何在OpenCV中将热力图的渐变色彩替换为固定颜色?
实现离散固定颜色的热力图
你需要替换掉OpenCV自带的渐变色彩映射,手动定义离散的灰度区间和对应的固定颜色,具体步骤和代码如下:
核心思路
cv2.applyColorMap生成的是连续渐变的热力图,不符合你的需求。我们需要将灰度图像的像素值划分为多个区间,每个区间对应唯一的固定颜色,通过批量赋值实现离散色彩的热力图。
具体实现
定义区间与对应颜色
先根据你的需求划分灰度区间,并为每个区间指定BGR格式的颜色(OpenCV图像默认使用BGR通道顺序,注意和RGB顺序相反)。示例区间和颜色可根据需求调整:- 像素值>240 → 红色(BGR:
(0, 0, 255)) - 200<像素值≤240 → 橙色(BGR:
(0, 165, 255)) - 150<像素值≤200 → 黄色(BGR:
(0, 255, 255)) - 100<像素值≤150 → 绿色(BGR:
(0, 255, 0)) - 50<像素值≤100 → 蓝色(BGR:
(255, 0, 0)) - 像素值≤50 → 深蓝色(BGR:
(139, 0, 0))
- 像素值>240 → 红色(BGR:
批量映射颜色到图像
使用numpy.select实现高效的批量像素赋值,避免逐像素循环的低效问题:
import cv2 import numpy as np # 保留你的高斯模糊步骤 blur = cv2.GaussianBlur(mask,(13,13),11) # 定义灰度区间条件 threshold_conditions = [ blur > 240, (blur > 200) & (blur <= 240), (blur > 150) & (blur <= 200), (blur > 100) & (blur <= 150), (blur > 50) & (blur <= 100), blur <= 50 ] # 对应每个区间的BGR颜色 target_colors = [ (0, 0, 255), # 最高热度:红色 (0, 165, 255), # 橙色 (0, 255, 255), # 黄色 (0, 255, 0), # 绿色 (255, 0, 0), # 蓝色 (139, 0, 0) # 最低热度:深蓝色 ] # 创建空的3通道热力图 heatmap_img = np.zeros((blur.shape[0], blur.shape[1], 3), dtype=np.uint8) # 为每个通道分配对应颜色值 for channel_idx in range(3): # 提取每个颜色对应通道的值,生成通道映射 channel_values = np.select(threshold_conditions, [color[channel_idx] for color in target_colors]) heatmap_img[:, :, channel_idx] = channel_values # 或者用更简洁的写法(直接生成3通道图像) # heatmap_img = np.select(threshold_conditions, target_colors, default=(0,0,0)).astype(np.uint8)
注意事项
- 确保区间覆盖所有0-255的像素值,避免出现未匹配的像素(可通过
np.select的default参数设置默认颜色)。 - 若需要调整热度区间或颜色,直接修改
threshold_conditions和target_colors列表即可,灵活性很高。 - 该方法使用numpy批量操作,处理1080×1920的图像效率远高于逐像素循环。
内容的提问来源于stack exchange,提问作者rxl
相关产品推荐
相关产品推荐

