如何提取带黑色手绘的白色矩形的四个顶点坐标?
提取白色矩形顶点的可行方案
你当前用极值点方法失效的核心原因是:提取的轮廓包含了手绘黑色线条的干扰,导致极值点落在了手绘的突出位置,而非白色矩形的真实顶点。可以通过以下步骤解决:
步骤1:预处理图像,去除手绘干扰
先通过二值化+形态学操作,把白色矩形区域从干扰中分离出来:
import cv2 import numpy as np # 读取图像(假设是灰度图,彩色图先转灰度) img = cv2.imread("your_image.jpg", 0) # 二值化:将白色区域设为255,其余为0(阈值根据图像亮度调整,示例用200) ret, thresh = cv2.threshold(img, 200, 255, cv2.THRESH_BINARY) # 闭运算:填补白色矩形内部的手绘空隙,核大小根据线条粗细调整 kernel = np.ones((5,5), np.uint8) thresh_clean = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
步骤2:提取轮廓并做多边形逼近
得到干净的白色矩形轮廓后,用多边形逼近把不规则轮廓简化为矩形顶点:
# 提取最外层轮廓 contours, _ = cv2.findContours(thresh_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选面积最大的轮廓(目标白色矩形) target_contour = max(contours, key=cv2.contourArea) # 计算轮廓周长,设置逼近精度(0.02为周长比例,可微调) epsilon = 0.02 * cv2.arcLength(target_contour, True) # 多边形逼近 approx_vertices = cv2.approxPolyDP(target_contour, epsilon, True) # 若逼近后得到4个点,即为矩形顶点 if len(approx_vertices) == 4: # 转换为坐标元组 vertices = [tuple(pt[0]) for pt in approx_vertices] print("矩形顶点坐标:", vertices)
备选方案:最小外接矩形
如果多边形逼近效果不理想,可直接计算包围白色区域的最小外接矩形:
rect = cv2.minAreaRect(target_contour) # 提取矩形四个顶点 box_vertices = cv2.boxPoints(rect) box_vertices = np.int0(box_vertices) vertices = [tuple(pt) for pt in box_vertices] print("最小外接矩形顶点:", vertices)
关键注意点
- 二值化的阈值和形态学操作的核大小,需要根据你的实际图像调整,确保白色矩形区域被完整保留。
- 若图像中有多个轮廓,必须通过面积筛选目标轮廓,避免误提取其他区域。
内容的提问来源于stack exchange,提问作者Eric Lee
相关产品推荐
相关产品推荐

