javascript - 在 map 图像上检测到 "concave hull"

标签 javascript algorithm image-processing convex-hull concave-hull

我正在为 Waze 开发开源 JavaScript 插件——著名的免费 G​​PS 导航器——专门用于 online editor .这个用户脚本的想法是可以快速选择大的统一颜色的 map 区域以将它们转换为地标。

到目前为止我已经 successfully implemented您在 Photoshop 等图形编辑器中称为“魔术棒”的工具:用户单击 map 上的某处(例如,在湖泊或森林上),脚本选择由相同颜色覆盖的整个区域并为地标创建多边形。

Pixels marked as boundary after image processing

一切都很好,除了我使用凸包算法来获得...好吧...凸包 :) 即:连接找到的点云的最外点的多边形。

Automatically created landmark

但众所周知,只有少数地标具有凸形,而现实世界中的大多数物体都是具有凹形区域的折线形。在上图中,您可以看到该区域几乎没有锋利的边缘,右下角的农田被凸包覆盖——这是错误的。

我在谷歌上搜索了合适的算法并翻阅了数学论文,但仍然找不到合适的算法。 The most popular question关于 Stackoverflow 上的凹包是指 Alpha 形状和 Delaunay 三 Angular 形。虽然我不明白如何使用它以防万一:所有点都相互连接形成一条连续的多段线,因此我似乎找不到合适的 alpha 半径,因为半径等于 1 像素的偶数圆被 alpha 暴露。

任何关于如何实现构建凹壳目标的想法都将不胜感激!可能是我走错了方向,需要查看位图矢量化算法?

最佳答案

Alpha 形状是通过找到一组点的 delaunay 三 Angular 剖分然后删除超过 alpha 的边来定义的。您需要 delaunay 三 Angular 剖分但不需要圆圈。它也适用于线条。要使用 JS 计算形状,您可以使用 TopoJSON 或尝试这个答案:Calculate bounding polygon of alpha shape from the Delaunay triangulation .你也可以试试我的php包http://concavehull.codeplex.com/ .

关于javascript - 在 map 图像上检测到 "concave hull",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23467951/

相关文章:

javascript - 如何在php中的数组中间不爆炸逗号

javascript - 短路代替三元运算符

algorithm - k-way合并中合并和项目数之间的关系是什么

java - 用于数字检索的节省空间的概率数据结构

最小化像素拉伸(stretch)效应的算法

javascript - 从 iframe 中访问父 DevExpress 弹出窗口

javascript - 在另一个网站上搜索元素

iphone - 在 iOS 上应用带通滤波器

visual-c++ - 如何在 CamShift 中平滑跟踪

image-processing - 将 EXR 图像序列转换为 .MOV