You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何提取带黑色手绘的白色矩形的四个顶点坐标?

提取白色矩形顶点的可行方案

你当前用极值点方法失效的核心原因是:提取的轮廓包含了手绘黑色线条的干扰,导致极值点落在了手绘的突出位置,而非白色矩形的真实顶点。可以通过以下步骤解决:

步骤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 12:15:31