You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在OpenCV中将热力图的渐变色彩替换为固定颜色?

实现离散固定颜色的热力图

你需要替换掉OpenCV自带的渐变色彩映射,手动定义离散的灰度区间和对应的固定颜色,具体步骤和代码如下:

核心思路

cv2.applyColorMap生成的是连续渐变的热力图,不符合你的需求。我们需要将灰度图像的像素值划分为多个区间,每个区间对应唯一的固定颜色,通过批量赋值实现离散色彩的热力图。

具体实现

  1. 定义区间与对应颜色
    先根据你的需求划分灰度区间,并为每个区间指定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))
  2. 批量映射颜色到图像
    使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:57:25