找到隧道“中心线”?

2023-11-20

我有一些由代表隧道的“折线”(每条线只是顶点列表)组成的地图文件,我想尝试找到隧道“中心线”(粗略地在下面以红色显示)。

alt text

我过去使用过一些成功的方法德劳内三角剖分但我想避免使用这种方法,因为它(通常)不允许轻松/频繁地修改我的地图数据。

关于我如何能够做到这一点有什么想法吗?



一种适用于本地数据更改的“算法”。


批评者的观点

The Good

好的部分是它使用大多数库中可用的图像处理和图形操作的混合,可以轻松并行化,速度相当快,可以调整为使用相对较小的内存占用,并且不必在修改后的外部重新计算区域(如果您存储中间结果)。

The Bad

我在引号中写了“算法”,只是因为我开发了它,并且肯定不足以应对病理情况。如果你的图表有很多循环,你可能会得到一些虚线。稍后将详细介绍这一点和示例。

和丑陋者

丑陋的部分是你需要能够淹没地图,但这并不总是可能的。几天前我发表了一条评论,询问您的图表是否可以洪水填充,但没有收到答案。所以我决定无论如何都要发布它。


素描

这个想法是:

  1. 使用图像处理获得代表中心路径的细线像素
  2. 将图像划分为与隧道最薄通道相称的块
  3. 在每个分区,表示所包含像素的“质心”处的一个点
  4. 使用这些像素来表示图的顶点
  5. 基于“近邻”策略向图添加边
  6. 删除诱导图中的虚假小环
  7. 结束 - 剩余的边代表您想要的路径

并行化机会源于以下事实:分区可以在独立进程中计算,并且可以对结果图进行分区以找到需要删除的小循环。这些因素还可以减少序列化而不是并行计算所需的内存,但我没有这样做。


The Plot

我不会提供伪代码,因为困难的部分只是您的库未涵盖的部分。我将发布连续步骤产生的图像,而不是伪代码。 我把程序写在数学,如果对您有帮助,我可以发布它。

A- 从一张漂亮的充满洪水的隧道图像开始

alt text

B- 应用距离变换

The 距离变换给出图像的距离变换,其中每个像素的值被其到最近背景像素的距离替换.
您可以看到我们想要的路径是隧道内的局部最大值

alt text

C- 使用适当的内核对图像进行卷积

所选内核是高斯拉普拉斯核像素半径为2。它具有增强灰度边缘的神奇属性,如下所示。

alt text

D- 截止灰度级并对图像进行二值化

以获得中心线的美景!

alt text

评论

也许这对您来说就足够了,因为您知道如何将细线转换为近似的分段线段序列。由于我的情况并非如此,因此我继续这条道路以获得所需的细分。

电子图像分区

这时该算法的一些优点就显现出来了:您可以开始使用并行处理或决定一次处理每个段。您还可以将结果片段与之前的运行进行比较并重新使用之前的结果

alt text

F-质心检测

All the white points in each sub-image are replaced by only one point at the center of mass
XCM = (Σ i∈Points Xi)/NumPoints

YCM = (Σ i∈Points Yi)/NumPoints

白色像素很难看到(参数“a”age 渐近困难),但它们就在那里。

alt text

从顶点设置 G-图

使用选定的点作为顶点形成图形。仍然没有边缘。

alt text

H-选择候选边

使用点之间的欧几里得距离,选择候选边。截止用于选择一组适当的边。这里我们使用 1.5 的子图像大小。

正如您所看到的,生成的图表有一些小循环,我们将在下一步中将其删除。

alt text

H- 去除小循环

使用循环检测例程,我们删除达到一定长度的小循环。截止长度取决于几个参数,您应该根据图表系列的经验来计算它

alt text

我-就是这样!

您可以看到生成的中心线稍微向上移动。原因是我在 Mathematica 中叠加了不同类型的图像......并且我放弃了试图说服程序做我想做的事情:)

alt text


几张照片

当我进行测试时,我收集了一些图像。它们可能是世界上最不隧道的东西,但我的 Tunnels-101 误入了歧途。

不管怎样,他们来了。请记住,我向上移动了几个像素......

alt text

HTH !

.

Update

以防万一您可以访问数学8(今天收到了)有一个新功能Thinning。只是看看:

alt text

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

找到隧道“中心线”? 的相关文章

  • 全部配对图表上的所有路径

    这可能是一个没有最佳解决方案的问题 假设我有一个有向图 不知道它是否有循环 循环检测将是这个问题的方面之一 给定一组顶点 可能是数百万个顶点 我需要计算给定图的所有唯一对之间的所有不同路径 没有重复顶点的路径 我该如何应对这种情况 让我们看
  • 如果数据库可访问,加盐和散列有什么意义?

    我刚刚学习了散列的概念 嘿 不要忘记盐 并使用盐来确保密码安全 散列它是一种单向加密 实际上不是加密而是散列 因此无法对其进行逆向工程 加盐是在散列之前在密码上添加随机创建的值的前缀或附加值 因为散列 只是散列 的问题是 一些天才提供了字典
  • 加密单个int的方法

    如何以廉价的方式对 32 位 int 进行双向加密 使每个数字都映射到该空间中的其他 int 并以难以预测的方式映射回来 当然 并且不需要在映射表中预先存储 42 9 亿个整数 您想要的是 32 位分组密码 不幸的是 大多数分组密码都是 6
  • 二指针算法

    我想了解两指针算法方法 所以我一直在阅读本文 https tp iiita quora com The Two Pointer Algorithm 所以这是问题 假设我们有一个包含 N 个元素的数组 我们想要找到该数组中最大的连续元素序列
  • 数独生成器算法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我制作了一个生成数独的算法 但效率非常低 每个谜题都需要几分钟才能生成 所以现在我正在尝试以最佳方式重新编写它 但我遇到了一些问题 需
  • Jest 中从未调用图像 onLoad 处理程序

    我正在尝试使用 Jest 测试将 dataUrl 加载到图像中 我正在使用 JSDOM 并按照说明添加resources usable 作为一个选项 如果我直接从 Node 运行该代码 则该代码可以工作 但是当我尝试在 Jest 中运行它时
  • 有向无环图的拓扑排序为阶段

    是否有一种算法 给定一个未加权的有向无环图 将所有节点排序到节点集列表中 使得 拓扑顺序被保留 即 对于所有边u gt v v出现在列表中更靠下的集合中u and 列表的长度是最小的 这个问题有名字吗 Example 下图的一种可能的排序是
  • 获取大于某个数字的元素个数

    我正在尝试解决以下问题 数字被插入到容器中 每次插入数字时 我需要知道容器中有多少元素大于或等于当前插入的数字 我相信这两个操作都可以以对数复杂度完成 我的问题 C 库中有标准容器可以解决这个问题吗 我知道std multiset可以在对数
  • C# WPF 将粘贴在 richtextbox 中的 BitmapImage 转换为二进制

    我有一个 Richtextbox 我计划将其保存到数据库中 该数据库可以加载回同一个 Richtextbox 中 我已经让它工作了 这样我就可以将流程文档保存为 DataFormats XamlPackage 这可以保存图像 但问题是文本不
  • 什么是 NOR 逻辑运算符?

    Is nor a 或 b a 或 b a 和 b 还有什么吗 a 或 b see http en wikipedia org wiki Logical NOR http en wikipedia org wiki Logical NOR了解
  • 求从1到N的所有数字的数字之和[重复]

    这个问题在这里已经有答案了 问题 求1到N 包括两端 所有数字的数字之和 时间复杂度应该是 O logN 对于 N 10 总和为 1 2 3 4 5 6 7 8 9 1 0 46 对于 N 11 总和为 1 2 3 4 5 6 7 8 9
  • 如何在 Objective-C 中的导航栏中央添加图像?

    我正在IOS中开发 我使用以下代码来设置背景navigationBar self navigationController navigationBar setBackgroundImage UIImage imageNamed bar ba
  • php 发送带有图像的电子邮件

    我正在尝试发送一封带有图片的电子邮件 我的电子邮件正文是 当我收到电子邮件时 我看不到图片 相反 我 看 img src http planet earth bogus us icons secret pictures gif 我知道这是因
  • 如何解决素数函数的大O表示法?

    我正在尝试理解 Big O 表示法 很抱歉 如果我问的问题太明显了 但我似乎无法理解这一点 我有以下 C 代码函数 我正在尝试为其计算 Big O 表示法 for i 2 i lt 100 i for j 2 j lt i j j if i
  • 如何使 CSS 动画/过渡以固定速度而不是固定持续时间播放? [复制]

    这个问题在这里已经有答案了 我有一个 CSS 动画 可以使元素沿直线移动未定义的距离 据我所知 动画具有固定的持续时间 因此无论元素必须移动多远 动画始终需要相同的时间来运行 我该如何制作才能使动画没有固定的duration 但有固定的运动
  • 如何在 UIImagePickerController 捕获图像的瞬间获取当前位置?

    我研究了如何从返回的图像中获取位置数据UIImagePickerController相机 但是 我认为最简单的方法是获取当前位置CLLocationManager此刻UIImagePickerController捕获图像 有办法做到这一点吗
  • 检查列表是否已排序的 Pythonic 方法

    有没有一种Python式的方法来检查列表是否已经排序ASC or DESC listtimestamps 1 2 3 5 6 7 就像是isttimestamps isSorted 返回True or False 我想输入一些消息的时间戳列
  • 在 Android 中将图像从可绘制图像转换为字节数组

    由于我要将图像发送到 Parse com 因此我必须将其转换为字节数组 我的第一种方法是从图库中选择图像并将其转换为字节数组 如下所示 Override protected void onActivityResult int request
  • 找出区间内绝对差值最小的两个元素

    我给定了一个数组和一个 L R 类型的查询列表 这意味着找到任何两个数组元素之间的最小绝对差 使得它们的索引在 L 和 R 之间 其中数组的起始索引是 1 而不是 0 例如 采用包含元素 2 1 8 5 11 的数组 a 则查询 1 3 将
  • 将这个 if-then 逻辑转换为布尔表达式?

    我在使这段代码更简洁 最好是单个布尔表达式 方面有点绞尽脑汁 这是我的代码 if d Unemployed if type Unemployed tmp Unemployed true else tmp Unemployed false

随机推荐