Delaunay三角网 alpha shape 2D点集边缘线提取

alpha shapes提取平面点云边界点 1、原理介绍 由Edelsbrunner H提出的alpha shapes算法是一种简单、有效的快速提取边界点算法。其克服了点云边界点形状影响的缺点,可快速准确提取边界点,其原理如下: 如下图所示,对于任意形状的平面点云,若一个半径为a的圆,绕其进行滚动,其滚动的轨迹形成的点为轮廓点。需要注意的是,alpha shapes算法只能探测二维点的轮廓点,大多数是将点投影到二维平面,形成二维点,再进行轮廓点探测。 源码下载网站: 2、代码示例: void main() { vec 阅读详情
AI摘要

本文介绍了一种利用Delaunay三角网进行点集边缘线提取的方法,并提供了完整的Python实现代码。该方法首先构建Delaunay三角形,然后通过检查边的有效性来确定边界线。适用于Alpha Shapes等几何处理。

Delaunay三角网 alpha shape 2D点集边缘线提取

  1. Delaunay三角网
    参考blog:
    Scipy
    笔记
    [Geometry] Alpha Shapes - 原理及我的实现
  2. Alpha Shape
    Widyaningrum E , Peters R Y , Lindenbergh R C . Building outline extraction from als point clouds using medial axis transform descriptors[J]. Pattern Recognition, 2020:107447.
    在这里插入图片描述

  1. Codes
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

from scipy.spatial import Delaunay
from sklearn.neighbors import KDTree


def plot_circle(centers,rs,ax):
    N = centers.shape[0]
    for i in range(N):
        theta = np.arange(0, 2*np.pi, 0.01)
        x = centers[i,0] + rs[i] * np.cos(theta)
        y = centers[i,1] + rs[i] * np.sin(theta)
        ax.plot(x, y, 'b-', alpha=0.1)


def edge_check_vaild(e,tree,r,err):
    xp = e[0]
    xq = e[1]
    L = np.sqrt(np.dot(xq-xp,xq-xp))
    if L > 2*r:
        return False, -1
    vec = (xq-xp)/L # the vector from p to q
    normal = np.array([vec[1],-vec[0]])
    c1 = (xp + xq) / 2 + normal * np.sqrt(r**2-(L/2)**2)
    c2 = (xp + xq) / 2 - normal * np.sqrt(r**2-(L/2)**2)
    c = np.array([c1,c2])
    count = tree.query_radius(c,r=r+err,return_distance=False,count_only=True,sort_results=False)
    if count[0]<=2:
        return True, c[0]
    elif count[1]<=2:
        return True, c[1]
    else:
        return False, -1


def boundary_extract(points,alpha,err=10e-3):
    """
    Here, parameter err was place, because there are errors when calculating distance
    meanwhile, this err was different for different scaling 2D point cloud
    so, a parameter was placed here to considering the calculation errors
    """
    R = 1 / alpha
    pts = np.copy(points)
    tree = KDTree(pts, leaf_size=2)
    tri = Delaunay(pts)
    s = tri.simplices
    N = s.shape[0]
    i = 0
    edges = []
    centers = []
    while i <= N - 1:
        if s[i,0]==-1:
            i = i + 1
            continue
        p3 = s[i]
        e1 = np.array([points[p3[0],:],points[p3[1],:]])
        e2 = np.array([points[p3[1],:],points[p3[2],:]])
        e3 = np.array([points[p3[0],:],points[p3[2],:]])
        e = [e1,e2,e3]
        for j in range(3):
            flag, center = edge_check_vaild(e[j],tree,R,err)
            if flag:
                edges.append(e[j])
                centers.append(center)
        nb = tri.neighbors[i]
        nb_valid = nb[nb!=-1]
        #nb_valid_num = nb_valid.shape[0]
        #s[nb_valid] = -1
        i = i + 1
    return edges, centers


def show_edge(edges,points,circle=None,r=None):
    fig = plt.figure()
    ax = fig.add_subplot(111)
    ax.scatter(*zip(*points),s=4,c='k')
    for i in range(len(edges)):
        ax.plot(*zip(*edges[i]),'-r')
    if circle is not None:
        plot_circle(circle,r,ax)
    plt.show()


if __name__ == "__main__":
    pts = np.random.rand(200, 2) # 随机生成10个2维点
    alpha = 6
    edges, centers = boundary_extract(pts,alpha,err=10e-5)
    show_edge(edges,pts,circle=np.array(centers),r=np.ones(len(centers))/alpha)
    print("over!!!")
  1. Results
    在这里插入图片描述
    在这里插入图片描述
alpha shape 2D点集边缘线提取 【代码】alpha shape 2D点集边缘线提取。 阅读详情

相关推荐

坐标与表面关联:从离散点到连续曲面的核心技术与实战

在数据可视化、地理信息系统和计算机图形学中,将离散的二维坐标点(x, y)映射到连续的三维表面是一个基础且关键的操作。其核心原理是通过插值算法,为每个坐标点赋予或计算一个对应的z值(如高度、强度),从而在表面上定位该点。这一过程的技术价值在于,它能将抽象的离散数据转化为可用于直观分析和空间建模的连续曲面,是进行地形建模、热力图生成、科学计算可视化等工作的基石。常用的插值方法包括双线性插值、克里金法和径向基函数等,它们在不同场景下权衡着精度、平滑度与计算效率。例如,双线性插值因其在规则网格上速度快、效果平滑而

weixin_30955617的博客 383

CGAL功能大纲

CGAL功能大纲Computational Geometry Algorithms Library,CGAL,计算几何算法库。使用C++语言编写的,提供高效、可控的算法库。广泛应用于计算几何相关领域,如地理信息系统、计算机图形学、计算机辅助设计、信息可视化系统、生物医学等。官网网址:https://www.cgal.org/CGAL,提供了计算几何相关的数据结构和算法,如:(1)三角剖分。2D约束三角剖分,2D和3D Delaunay三角剖分;(2)Voronoi图。

我的博客 1309

scipy griddata插值绘制等高线:常见报错与解决方案

科学计算与工程可视化中,离散采样点如何变成连续场分布,一直是数据处理的关键环节。等高线图作为展示地形高程、温度场、浓度场等空间变化的重要手段,其绘制流程核心在于插值:先通过算法将散点映射到规则网格,再基于网格化数据生成等值线。scipy.interpolate.griddata 是 Python 生态中最常用的二维插值工具,配合 matplotlib 的 contourf 可快速完成从散点到等高线图的转换;但坐标维度错位、Qhull 输入异常、凸包外 NaN 空洞等问题常导致绘图失败。掌握 griddata

weixin_34224941的博客 301

CGAL 凹包(alpha-Shape)

本文转自https://doc.cgal.org/latest/Alpha_shapes_2/index.html。 Introduction Assume we are given a set S of points in 2D or 3D and we would like to have something like “the shape formed by these points”. This is quite a vague notion and there are probably many

McQueen_LT的博客 4004

cass坐标标注插件_默认设置中的陷阱:CASS软件三角网生成问题

三角网在CASS软件有几大比较重要的用途:1、绘制等高线;2、三维模型生成;3、土方计算;4、表面积计算等。本篇内容给大家讲解一下,三角网无法正常生成的解决方案。我们知道,软件的最终发布还有重要的阶段:软件内测,这个过程一般都是研发部门下的测试用户或者提供给商业用户,由测试者反馈存在的问题。所以软件最终发布之后,有部分内容参数会保存的是测试的一些数据参数。部分参数可能与实际应用不相符,我...

weixin_39717598的博客 2870

2D Alpha Shape:基于二维Delaunay(德洛内)三角网的边缘点查找

基于C++和Opencv的实现:Delaunary+Alpha Shape

lddx_123456的博客 1609

基于图像的裂缝分割与裂缝宽度计算(正交骨架线法)

可以使用的阈值分割,或者使用 CNN 等深度学习的方法进行裂缝分割,一般得到的分割结果如下,这里不再赘述。

weixin_47744862的博客 2084

CGAL 点云AlphaShpaes边缘提取算法(基于三角剖分)

CGAL 点云AlphaShpaes边缘提取算法(基于三角剖分)

dayuhaitang1的博客 1596

CGAL AlphaShape2算法提取有序边界

CGAL AlphaShape2算法提取有序边界

wish5201314的博客 1151

基于Open3D的点云处理11-三维点云表面重建

三维表面建模

zfjBIT的专栏 3302

CGAL AlphaShape算法(自适应Alpha值,二维版本)

CGAL AlphaShape算法(自适应Alpha值,二维版本)

dayuhaitang1的博客 2321

【保姆级教程】三角网生成库---triangle快速入门及使用说明(再不会就说不过去了啊兄弟)

今天我先讲一下triangle三角构网库,这个库不但运行效率高、并且能通过几个参数轻松的解决前面所述的全部问题。但是他的很多命令,很多人还是不清楚,以至于不知道如何上手。这篇博文在总结了我应用的基础上带领大家快速、轻松入门triangle使用!

韦_恩的博客 8875

CGAL 点云Alpha-Shape曲面重建算法

CGAL 点云Alpha-Shape曲面重建算法

dayuhaitang1的博客 1320

CGAL AlphaShape算法提取有序边界

使用该算法的初衷是想找到一个二维点集的有序边界,调用到CGAL中的Alpha_shape2。但是CGAL中的Alpha_shape2获取到的segment是随机的,也就是各个端点是无序的,如下图: 而我们需要的是有序边界,如下图所示: /* 1. 计算Alpha_Shape2 2. 获取segment端点坐标存入points_in_segment 3. 计算points_in_segment vector内所有点的重心barycenter 4. 构造aBary vector,aBary[i].

kw123472的博客 3056

点云边缘提取算法:使用CGAL库的Alpha Shapes(C/C++实现)

在点云数据中,提取点云的边缘信息对于许多应用是非常重要的。在本文中,我们将介绍如何使用CGAL库中的Alpha Shapes算法来提取点云的边缘。Alpha Shapes算法是一种基于Alpha值的几何形状描述方法,通过对点云数据进行分析,可以提取出点云的边缘信息。这样,我们就可以使用CGAL库中的Alpha Shapes算法来提取点云的边缘信息了。函数,我们可以设置Alpha值,该值控制着边缘提取的敏感度。较小的Alpha值将产生更多的边缘,而较大的Alpha值将产生较少的边缘。对于每个边缘,我们使用。

PixelShadeZ的博客 931

python多点外接多边形(Delaunay三角网),凸多边形、非凸多边形

计算Delaunay三角网,通过调整阈值,得到不同的外接多边形(凸、非凸) 这里的凸的意思是外接凸多边形,非凸指的是按照最外面的点相互连接得到的多边形。如这里白色区域为非凸,外面绿色连线围成的区域为凸。 以下代码生成的为非凸。 points = [(319, 320), (125, 198), (250, 366), (129, 182), (262, 375), (235, 344), (248, 369), (367, 261), (196, 307), (163, 286)] pts = np.a

Hello Word! 5007

CGAL笔记之形状重建——尺度-空间表面重建

CGAL笔记之网格生成——尺度-空间表面重建

younggung的博客 1835

STM32f103--ADC配置

2.对于规则通道,选中EXTI线路11或TIM8_TRGO作为外部触发事件,可以分别通过设置ADC1和ADC2的ADC1_ETRGREG_REMAP位和ADC2_ETRGREG_REMAP位实现。注意: 在双ADC模式里,当转换配置成由外部事件触发时,用户必须将其设置成仅触发主ADC,从ADC设置成软件触发,这样可以防止意外的触发从转换。2.在某些双ADC模式中,在完整的ADC1数据寄存器(ADC1_DR)中包含了ADC1和ADC2的规则转换数据。通过设置ADC_CR2寄存器的ADON位可给ADC上电。

weixin_51864506的博客 5312
上一篇: Camera Calibration [相机标定-张正友]
下一篇: 基于图像的裂缝分割与裂缝宽度计算(正交骨架线法)
SubChange
博客等级 码龄9年 104粉丝 9原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值