OpenCV中使用EdgeDrawing模块查找圆

从OpenCV4.5.2开始,Contrib模块中封装了开源库ED_Lib用于查找图像中的直线、线段、椭圆和圆。Github地址:

https://github.com/CihanTopal/ED_Lib

算法原理简介:

边缘绘制(ED)算法是一种解决边缘检测问题的主动方法。与许多其他遵循减法方法的现有边缘检测算法相比(即在图像上应用梯度滤波器后,根据多种规则消除像素,例如 Canny 中的非极大值抑制和滞后),ED 算法通过加法策略工作,即逐一选取边缘像素,因此称为"边缘绘制"。然后我们处理这些随机形状的边缘段以提取更高级别的边缘特征,即直线、圆、椭圆等。从阈值梯度幅度中提取边缘像素的流行方法是非极大值抑制,它测试每个像素是否具有最大值沿其梯度方向的梯度响应,如果没有则消除。然而,此方法不检查相邻像素的状态,因此可能会导致低质量(在边缘连续性、平滑度、薄度、定位方面)边缘片段。ED 不是非极大值抑制,而是指向一组边缘像素,并通过最大化边缘段的总梯度响应来将它们连接起来。因此,它可以提取高质量的边缘片段,而不需要额外的滞后步骤。

OpenCV中使用介绍文档:

https://docs.opencv.org/4.9.0/d1/d1c/classcv_1_1ximgproc_1_1EdgeDrawing.html

Python中使用演示:

python 复制代码
from __future__ import print_function
import numpy as np
import cv2 as cv
import random as rng
import sys

rng.seed(12345)


def main():
    try:
        fn = sys.argv[1]
    except IndexError:
        fn = 'Image1.png'

    # 读取图像
    src = cv.imread(cv.samples.findFile(fn))
    if src is None:
        print(f"Error: Unable to load image '{fn}'")
        return

    # 转换为灰度图像
    gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)

    # 创建边缘绘制器
    ed = cv.ximgproc.createEdgeDrawing()

    # 设置边缘绘制参数
    EDParams = cv.ximgproc_EdgeDrawing_Params()
    EDParams.MinPathLength = 50
    EDParams.PFmode = False
    EDParams.MinLineLength = 20
    EDParams.NFAValidation = True
    ed.setParams(EDParams)

    # 检测边缘
    ed.detectEdges(gray)

    # 获取边缘段、直线和椭圆
    segments = ed.getSegments()
    lines = ed.detectLines()
    ellipses = ed.detectEllipses()

    # 绘制检测到的边缘段
    ssrc = src.copy() * 0  # 创建黑色背景图像用于绘制边缘段
    for i in range(len(segments)):
        color = (rng.randint(0, 256), rng.randint(0, 256), rng.randint(0, 256))
        cv.polylines(ssrc, [segments[i]], isClosed=False, color=color, thickness=1, lineType=cv.LINE_8)

    # 绘制检测到的直线
    lsrc = src.copy()  # 创建原始图像的副本用于绘制直线
    if lines is not None:
        lines = np.uint16(np.around(lines))
        for i in range(len(lines)):
            cv.line(lsrc, tuple(lines[i][0][0:2]), tuple(lines[i][0][2:4]), (0, 0, 255), 1, cv.LINE_AA)

    # 绘制检测到的椭圆和圆
    esrc = src.copy()  # 创建原始图像的副本用于绘制椭圆和圆
    if ellipses is not None:
        for ellipse in ellipses:
            center = tuple(map(int, ellipse[0][0:2]))
            major_axis = int(ellipse[0][2])
            minor_axis = int(ellipse[0][3]) if ellipse[0][2] != ellipse[0][3] else 0  # 如果长短轴相等,则视为圆,minor_axis设为0
            angle = ellipse[0][4]
            color = (0, 0, 255) if minor_axis != 0 else (0, 255, 0)  # 非圆用红色,圆用绿色
            axes = (major_axis // 2, minor_axis // 2) if minor_axis != 0 else (
            major_axis // 2, major_axis // 2)  # 转换为半径
            cv.ellipse(esrc, center, axes, angle, 0, 360, color, 2, cv.LINE_AA)

    # 显示图像
    cv.imshow("Source Image", src)
    cv.imshow("Detected Edge Segments", ssrc)
    if lines is not None:
        cv.imshow("Detected Lines", lsrc)
    if ellipses is not None:
        cv.imshow("Detected Ellipses and Circles", esrc)

    # 等待用户按下任意键
    cv.waitKey(0)

    # 清理
    cv.destroyAllWindows()


if __name__ == '__main__':
    print(__doc__)
    main()

示例图

相关推荐
Raink老师18 小时前
【AI面试临阵磨枪】详细解释 Transformer 架构的核心组件与工作流程。
人工智能·深度学习·transformer·ai 面试·ai 应用开发
qcx2318 小时前
【AI Agent实战】OpenClaw 安全加固完全指南:安全攻击手段与五步防护实践(2026最新)
人工智能·安全
码农小白AI18 小时前
AI报告审核进入技术驱动时代:IACheck如何从规则引擎走向深度学习,构建检测报告审核“技术矩阵”
人工智能·深度学习
song1502653729818 小时前
视觉检测设备:自动识别缺陷、尺寸、瑕疵、装配错误,一键全检
人工智能·计算机视觉·视觉检测
智能化咨询18 小时前
(163页PPT)某著名企业K3生产制造售前营销指导方案P164(附下载方式)
大数据·人工智能
Zzj_tju19 小时前
大语言模型技术指南:SFT、RLHF、DPO 怎么串起来?对齐训练与关键参数详解
人工智能·深度学习·语言模型
金智维科技官方19 小时前
RPA技术赋能电信运营商话单稽核:金智维如何驱动高精度自动化转型
人工智能·自动化·数字化·rpa·智能体·电信
2501_9481142419 小时前
2026模型能力分化加剧:多模型聚合架构的技术解析与工程落地思考
人工智能·ai·chatgpt·架构
新知图书20 小时前
LangGraph中的记忆存储
人工智能·langgraph·智能体设计·多智能体设计
冬奇Lab20 小时前
Claude Code 实战经验分享(上篇):从启动到并发协同
人工智能·ai编程·claude