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

如何从二值图像中正确获取四个角点的坐标

二值图像四边形角点提取方案

你原有代码的核心错误是膨胀操作后没有使用处理后的dilated图像查找轮廓,而是继续使用原始输入的img,膨胀操作的优化效果完全没有生效。

正确实现逻辑

  • 预处理:通过膨胀填充目标区域的零散孔洞,若目标区域为黑色、背景为白色,需先做反色处理,保证查找轮廓时目标为白色前景。
  • 轮廓筛选:对查找出的所有轮廓按面积排序,取面积最大的轮廓作为目标四边形的轮廓,排除噪声干扰。
  • 多边形拟合:对目标轮廓做多边形逼近,调整逼近精度参数,直到拟合得到4个顶点,即为所求的四个角点。
  • 顶点排序(可选):可根据坐标对四个角点按左上、右上、右下、左下的逻辑排序,方便后续调用。

完整可运行代码

import cv2
import numpy as np

# 读取二值图像,若读入的是三通道图需先转灰度再做二值化处理
img = cv2.imread('binary_img.png', 0)

# 膨胀操作填充小缺口
kernel = np.ones((3,3), np.uint8)
dilated = cv2.dilate(img, kernel, iterations=3)

# 使用膨胀后的图像查找轮廓
contours, hierarchy = cv2.findContours(dilated, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 筛选面积最大的目标轮廓,排除噪声
max_contour = max(contours, key=cv2.contourArea)

# 多边形逼近得到四个角点,epsilon系数可根据实际拟合效果微调
epsilon = 0.02 * cv2.arcLength(max_contour, True)
approx = cv2.approxPolyDP(max_contour, epsilon, True)

# 输出四个角点坐标,格式为[[x1,y1], [x2,y2], [x3,y3], [x4,y4]]
corner_points = approx.squeeze().tolist()
print(corner_points)

如果拟合得到的顶点数量不是4,可适当调整epsilon的系数:系数越小拟合的顶点越多,系数越大顶点越少,调整到刚好输出4个点即可。

示例图像

你提供的二值示例图像如下:
二值示例图像

内容的提问来源于stack exchange,提问作者Md. Rezwanul Haque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 14:45:02