如何用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
相关产品推荐
相关产品推荐

