定位等方面;边缘片段
发布时间: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。以提取更高级别的边缘特征,即直线、