python - 在 Python 中删除二维散点的外壳

标签 python algorithm scipy edge-detection convex-hull

对于我的项目,我使用来自望远镜的二维图像。众所周知,由于望远镜故障,每幅图像的外边界都被点过度饱和了。因此我想提取构成二维图像外边界的点。

所以我想做的是以某种方式提取构成外壳的点,根据我的喜好使用所需的外壳宽度。

到目前为止我尝试了什么:

在 Python 中,我尝试通过使用 scipy.ConvexHull 找到外部点然后删除这些点来找到构成边缘的点。在循环中执行此操作时,它应该删除宽度取决于迭代次数的外边缘。但是这种方法依赖于点的密度,对于边缘密度大的地方去除的点较少。我想要的是从整个图像中删除大约相等宽度的外边缘,请参见下图:

为了说明我的意思,我添加了 ConvexHull 结果,在 15 次迭代后它以红色显示为外边缘点: picture1

为了澄清,这是我希望我的算法给我的期望结果,在整个图像上具有相等宽度的外边缘,它与点密度无关。 picture2

最佳答案

既然你只展示了没有代码的想法和图形,我也会这样做。

我看到有几种方法可以在凸包内获得较小的多边形,它们之间的宽度几乎恒定。每个也有变化。我用一个凸包来说明,它是您图形中凸包的简化版本。我的每个解决方案都忽略了问题中的大多数点,并且仅使用凸包的顶点,因此忽略了“点密度”。

在选择多边形之前,您可以找到凸包的“中心点”。有多种方法可以定义它。您可以使用船体顶点的质心,其中 x 和 y 坐标是顶点坐标的平均值,但这会偏向具有许多小段的船体部分。您可以使用边界矩形的中心,其中 x 和 y 坐标是船体顶点的最大坐标和最小坐标的平均值。这是我在图形中使用的方法。还有其他可能的“中心点”。

我的第一个内部多边形将每个顶点向中心点移动一定距离。在我的示例中,我将每个点向中心点移动了四分之一的距离。

enter image description here

我的第二个内部多边形将顶点向中心点移动固定距离。我选择的距离是顶点到中心点平均距离的四分之一。请注意,对于这个特定示例,此多边形与我之前的多边形之间几乎没有区别。对于 come 点比其他一些点更接近中心点的船体,差异会更加明显。

enter image description here

我的第三个多边形放弃了中心点。它将船体的每一侧向船体内部移动固定距离。这些新线段的交点用于定义新的多边形。换句话说,我做了“向内多边形偏移”或“多边形缓冲”。这是计算几何中的一项重要任务,但可以在 this SO question 找到有关此任务和类似任务的一些讨论。 .这看起来确实与其他多边形不同,因为船体的较小边往往会从结果中缩小或完全消失。

enter image description here

选择适合您需要的多边形 - 前两个比第三个更容易计算,但第三个最接近您理想的“外边宽度相等”。

关于python - 在 Python 中删除二维散点的外壳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542382/

相关文章:

python - 为什么 scipy.signal.welch 会抑制零频率?

opencv - FFTPACK Scipy 全局名称未正确定义。怎么修?

Python将字符串转成元组

python - 我正在尝试在 Python 中实现冒泡排序算法,但无法理解为什么它在一种情况下有效,而在另一种情况下无效

java - Python - 集成 Java GUI 和 python 代码的最佳方式

java - 在最小堆中查找最大元素?

C++ 将值移至数组开头

python - scipy 最小化 SLSQP - 'Singular matrix C in LSQ subproblem'

python - 从 Pandas 中的单个字符串列创建新的二进制列

python - Azure Function App 上的 EasyAuth 错误自定义 oidc 提供程序