基于Python与OpenCV从黑灰白图像提取矩形角点失败求助
黑白图像矩形角点定位优化方案
此前参考Stack Overflow相关讨论尝试提取黑白图像中的白色矩形角点,但未达到预期的精准定位效果,期望实现每个白色矩形的四个角点被准确识别并分组的目标。
原代码存在的问题
- 直接对灰度图使用
goodFeaturesToTrack,会误识别大量噪声点或非目标区域的角点 - 简单按4个点一组强制分组,无法保证每组点属于同一个矩形
- 未针对白色目标区域做针对性预处理,干扰点过多
优化实现代码
import cv2 as cv import numpy as np # 读取图像并转为灰度图 img = cv.imread("/home/joy/桌面/test_11_8/original.png") gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 预处理:二值化提取白色区域(根据图像亮度调整阈值) _, binary = cv.threshold(gray, 200, 255, cv.THRESH_BINARY) # 膨胀+腐蚀去除噪声,强化白色区域轮廓 kernel = np.ones((3,3), np.uint8) binary = cv.morphologyEx(binary, cv.MORPH_CLOSE, kernel) # 轮廓检测:只提取最外层轮廓 contours, _ = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) rect_corners_list = [] for cnt in contours: # 计算轮廓周长,用于多边形拟合的精度控制 perimeter = cv.arcLength(cnt, True) # 多边形拟合,筛选矩形轮廓(4个顶点) approx = cv.approxPolyDP(cnt, 0.02 * perimeter, True) if len(approx) == 4: # 提取并整理当前矩形的4个角点 corners = [tuple(point[0]) for point in approx] rect_corners_list.append(corners) # 在原图上标记角点(绿色实心圆) for (x, y) in corners: cv.circle(img, (int(x), int(y)), 3, (0, 255, 0), -1) print(f"\n找到 {len(rect_corners_list)} 个矩形\n") for idx, corners in enumerate(rect_corners_list): print(f"矩形 {idx+1} 的角点:{corners}") # 显示处理结果 cv.imshow("预处理二值图", binary) cv.imshow("角点定位结果", img) if cv.waitKey(0) & 0xff == 27: cv.destroyAllWindows()
优化说明
- 预处理阶段:通过二值化锁定白色目标区域,再用形态学操作消除细碎噪声,减少无关干扰点
- 轮廓拟合:使用
approxPolyDP对轮廓进行多边形近似,精准筛选出拥有4个顶点的矩形轮廓,确保只提取目标角点 - 角点分组:每个矩形轮廓对应的4个角点自动归为一组,无需强制分组,保证每组角点属于同一个矩形
内容的提问来源于stack exchange,提问作者user20384021
相关产品推荐
相关产品推荐

