基于OpenCV色彩滤镜精准检测GPR彩色矩形像素长度的技术求助
解决方案
你的问题核心是红色在HSV色彩空间中是跨0°的单色调,只设置一个区间会漏掉偏深红的色块,再加上图像本身的噪声干扰,导致检测不完整。以下是精准检测彩色矩形并输出长度的完整方案:
1. 修复红色HSV检测区间
红色的HSV范围分为两部分:[0, 50, 50]~[10, 255, 255](亮红)和[170, 50, 50]~[180, 255, 255](深红),需要合并这两个区间的掩码才能覆盖所有红色区域。
2. 图像预处理降噪
先对图像做高斯模糊,减少细小噪声点对掩码的干扰,避免后续轮廓检测出现冗余小框。
3. 形态学操作优化掩码
用膨胀+腐蚀的组合(闭运算)填补掩码中的小缺口,让红色区域的掩码更完整连续。
4. 轮廓检测与矩形长度计算
通过轮廓检测找到每个红色矩形的外接边界框,计算其像素长度(根据矩形的宽高判断是横向还是纵向,取对应值)。
5. 导出结果到Excel
用pandas将检测结果(颜色、矩形坐标、像素长度)写入Excel文件,方便后续处理。
完整代码实现
import cv2 import numpy as np import pandas as pd # 加载图像 image = cv2.imread('Image15.jpg') # 预处理:高斯模糊降噪 blurred = cv2.GaussianBlur(image, (5, 5), 0) # 转换为HSV色彩空间 hsv = cv2.cvtColor(blurred, cv2.COLOR_BGR2HSV) # 定义红色的两个HSV区间 lower_red1 = np.array([0, 50, 50]) upper_red1 = np.array([10, 255, 255]) lower_red2 = np.array([170, 50, 50]) upper_red2 = np.array([180, 255, 255]) # 生成两个掩码并合并 mask1 = cv2.inRange(hsv, lower_red1, upper_red1) mask2 = cv2.inRange(hsv, lower_red2, upper_red2) mask = cv2.bitwise_or(mask1, mask2) # 形态学闭运算:先膨胀再腐蚀,填补掩码缺口 kernel = np.ones((3, 3), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 寻找轮廓 contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 存储检测结果 results = [] for cnt in contours: # 过滤过小的轮廓(排除噪声点) if cv2.contourArea(cnt) < 50: continue # 获取外接矩形 x, y, w, h = cv2.boundingRect(cnt) # 判断矩形方向,取长度(假设横向矩形取宽度w,纵向取高度h,可根据实际调整) length = w if w > h else h # 记录结果 results.append({ "颜色": "红色", "矩形左上角坐标": (x, y), "矩形宽度": w, "矩形高度": h, "像素长度": length }) # 在原图上绘制边界框(可选,用于可视化验证) cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) # 可视化结果(可选) cv2.imshow('检测结果', image) cv2.imshow('优化后掩码', mask) cv2.waitKey(0) cv2.destroyAllWindows() # 导出结果到Excel df = pd.DataFrame(results) df.to_excel('红色矩形检测结果.xlsx', index=False) print("结果已导出到红色矩形检测结果.xlsx")
其他颜色检测的适配方法
对于其他颜色(如蓝色、绿色),可以通过以下方式获取精准HSV区间:
- 用取色工具(如OpenCV的
cv2.setMouseCallback)拾取图像中目标颜色的HSV值; - 调整上下限范围,确保覆盖目标颜色的深浅变化;
- 同样可以加入预处理和形态学操作优化检测效果。
内容的提问来源于stack exchange,提问作者Diptajit Das
相关产品推荐
相关产品推荐

