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

基于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()

优化说明

  1. 预处理阶段:通过二值化锁定白色目标区域,再用形态学操作消除细碎噪声,减少无关干扰点
  2. 轮廓拟合:使用approxPolyDP对轮廓进行多边形近似,精准筛选出拥有4个顶点的矩形轮廓,确保只提取目标角点
  3. 角点分组:每个矩形轮廓对应的4个角点自动归为一组,无需强制分组,保证每组角点属于同一个矩形

内容的提问来源于stack exchange,提问作者user20384021

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 21:15:47