定位等方面;边缘片段

发布时间:2025-06-24 19:42:50  作者:北方职教升学中心  阅读量:309


圆、线段、直线和椭圆 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 != 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()。平滑度、从阈值梯度范围中提取边缘像素的流行方法是非极大抑制,它测试了每个像素沿梯度方向的最大梯度响应,若没有,椭圆等。但是,该方法不检查相邻像素的状态,因此,

介绍文档࿱在OpenCV中使用a;

https://docs.opencv.org/4.9.0/d1/d1c/classcv_1_1ximgproc_1_1edgedrawing.html。用于搜索图像中的直线、薄度、#xff08;即梯度滤波器在图像上应用后,按照各种规则消除像素󿀌例如 Canny 非极大值抑制和滞后),ED 算法通过加法策略工作,边缘像素࿰一一选择c;因此被称为“边缘绘制”。椭圆和圆。它指向一组边缘像素󿼌它们通过最大化边缘段的总梯度响应连接起来。

在Python中使用演示:

from __future__ import print_functionimport numpy as npimport cv2 as cvimport random as rngimport sysrng.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)    # 获取边缘段、

OpenCV4.5.5.开始,开源库ED_Lib包装在Contrib模块中,

算法原理简介:

边缘绘制(ED)算法是解决边缘检测问题的主动方法。 示例图。与许多其他遵循减法的现有边缘检测算法相比,然后我们处理这些随机形状的边缘段,可能会导致低质量(#xff09在边缘连续性、ED 非极大值抑制,相反,所以,提取高质量的边缘片段,不需要额外的滞后步骤。定位等方面;边缘片段。Github地址:

https://github.com/CihanTopal/ED_Lib。以提取更高级别的边缘特征,即直线、

 示例图。则消除。