OpenCV Python形状检测:分割图像中两个矩形并提取坐标
Hey, 看你的问题描述,现在轮廓检测把整个图像识别成圆形,没法分割出两个矩形还得去除多余凸起——这情况我之前调试时也碰到过,大概率是阈值处理没精准分离两个矩形,或者轮廓检测的参数没适配需求。给你一套针对性的调整方案,一步步来:
1. 先优化阈值处理,把两个矩形彻底分开
你当前用的固定阈值(60)可能太宽松,导致两个矩形之间的区域也被填充成前景,直接连在一起了。换成自适应阈值试试,它能根据局部区域的亮度调整阈值,避免整体阈值的一刀切问题:
# 替换你原来的thresh生成代码 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) blurred = cv2.GaussianBlur(gray, (3, 3), 0) # 把高斯核从5x5改成3x3,避免过度模糊边界 # 如果你的矩形是浅色、背景深色,用THRESH_BINARY;反之用THRESH_BINARY_INV thresh = cv2.adaptiveThreshold(blurred, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY_INV, 11, 2)
2. 用形态学操作去除多余凸起
接下来用开运算先去掉小的凸起和噪点,再用闭运算修复矩形边缘的小缺口,让轮廓更规整:
# 创建3x3的矩形结构元素,适配矩形轮廓的修复 kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 开运算:先腐蚀再膨胀,干掉小凸起 thresh = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) # 闭运算:先膨胀再腐蚀,修复矩形边缘的小缺口 thresh = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
3. 调整轮廓检测参数,精准定位矩形
你原来用的cv2.RETR_LIST会检索所有轮廓,容易混入干扰;换成cv2.RETR_EXTERNAL只找最外层轮廓,再配合轮廓近似筛选出矩形:
# 替换轮廓检测代码 cnts, _ = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历轮廓,筛选出矩形并提取坐标 for cnt in cnts: # 计算轮廓周长,用于后续的近似精度 perimeter = cv2.arcLength(cnt, True) # 近似轮廓,epsilon设为周长的2%,这个值可以根据你的图像微调 approx = cv2.approxPolyDP(cnt, 0.02 * perimeter, True) # 矩形的近似轮廓应该有4个顶点 if len(approx) == 4: # 获取矩形的边界坐标(x,y是左上角,w是宽度,h是高度) x, y, w, h = cv2.boundingRect(approx) print(f"检测到矩形:左上角({x}, {y}),宽度{w},高度{h}") # 可选:在原图上画出矩形,方便调试 cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
额外调试小贴士
- 如果图像是黑白倒置的(比如矩形是黑色、背景白色),记得把
THRESH_BINARY_INV改成THRESH_BINARY - 如果还是有干扰轮廓,可以加一步面积筛选:计算轮廓面积
cv2.contourArea(cnt),只保留面积在合理范围内的轮廓
把这些代码替换到你原来的detect_shapes.py里,应该就能顺利分割出两个矩形,提取坐标,同时去掉多余凸起了。
内容的提问来源于stack exchange,提问作者Menaga
相关产品推荐
相关产品推荐

