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

如何用OpenCV定位热力图红色区域并在原始图像标记?

用OpenCV定位热力图红色区域并在原图标记

步骤拆解

  • 加载图像:读取热力图和原始图像,注意OpenCV默认以BGR格式加载。
  • 提取红色区域:将热力图转换为HSV色彩空间,红色在HSV中有两个不连续的范围,需要分别创建掩码后合并。
  • 去除噪声:通过形态学操作(腐蚀+膨胀)过滤掉掩码中的小噪点,让红色区域更规整。
  • 定位并标记:找到红色区域的轮廓,计算每个区域的中心或外接圆,在原始图像上用圆圈标记。

代码实现

import cv2
import numpy as np

# 1. 加载图像
heatmap = cv2.imread('heatmap.jpg')
original_img = cv2.imread('original.jpg')

# 2. 转换为HSV并提取红色区域
hsv = cv2.cvtColor(heatmap, cv2.COLOR_BGR2HSV)
# 红色的HSV范围(两个区间)
lower_red1 = np.array([0, 120, 70])
upper_red1 = np.array([10, 255, 255])
lower_red2 = np.array([170, 120, 70])
upper_red2 = np.array([180, 255, 255])

mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
red_mask = cv2.bitwise_or(mask1, mask2)

# 3. 形态学操作去噪
kernel = np.ones((5,5), np.uint8)
red_mask = cv2.morphologyEx(red_mask, cv2.MORPH_CLOSE, kernel)

# 4. 找轮廓并标记
contours, _ = cv2.findContours(red_mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for cnt in contours:
    # 计算轮廓的外接圆
    (x, y), radius = cv2.minEnclosingCircle(cnt)
    center = (int(x), int(y))
    radius = int(radius)
    # 在原始图像上画圆圈(绿色,线宽2)
    cv2.circle(original_img, center, radius, (0, 255, 0), 2)

# 保存或显示结果
cv2.imwrite('marked_original.jpg', original_img)
cv2.imshow('Marked Image', original_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意事项

  • 红色的HSV阈值可能需要根据你的热力图微调,比如调整120(饱和度下限)和70(明度下限),确保只提取目标红色区域。
  • 形态学操作的核大小可以根据噪点大小调整,核越大,去除的噪点越多,但可能会模糊区域边界。
  • 如果热力图和原始图像尺寸不一致,需要先将热力图缩放至和原图相同尺寸,再进行后续操作。

内容的提问来源于stack exchange,提问作者Sina M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 18:20:33