给定一组定义形状的点,我如何收缩这个形状,如Photoshop的Selection> Contract

时间:2010-10-03 15:54:17

标签: image-processing selection

我有一组点来定义一个形状。这些点是有序的,基本上是我的“选择”。

我希望能够以任意数量收缩此选择,以获得原始形状的较小版本。

在一个带有三角形的基本示例中,这些点只是沿着它们的法线移动,法线由相关点左侧和右侧的点定义。

最终所有3个点都会相遇并形成一个点,但在此之前它们会形成一个越来越小的三角形。

对于更复杂的形状,当向内移动各个点时,它们可能会穿过形状的外边缘,从而产生奇怪的伪影。显然我需要剔除这些点并从阵列中删除它们。

我将非常感谢您对我如何做到这一点的任何帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

这只是一个想法,但你不能找到物体的质心,从中心到每个点创建一个向量,并沿着这个向量移动每个点?

找到质心当然会涉及平均每个x和y坐标。获得一个矢量就像用中心点减去相关点一样简单。规范化和缩放是可以在Google上找到的常见矢量操作。

修改
另一种解释你所问的是你希望侵蚀你的积分。与morphology erosion中一样。这通常应用于二进制图像,但您可以稍微修改该概念以使用一组点。基本上,您需要编写一个函数,给定一个点,将返回true(黑色)或false(白色),具体取决于该点是在您的点定义的形状内部还是外部。您必须查找如何为不总是凹陷的形状(这更难但不是不可能)这样做。

现在,显然,你的实际点中的每一个都会返回false,因为它们都在边界上(根据定义)。但是,您现在在您的兴趣点周围有一个点矩阵,用于定义“内部”和“外部”的位置。平均所有“内部”点,并将实际点沿着矢量移动到它自身和平均值之间。您可以使用不同的侵蚀内核来查看最佳效果。

您甚至可以使用具有浮点权重的内核而不是任何一个/或值,这将影响与其权重成比例的平均计算。有了这个,您可以近似一个点数较少的圆形内核。首先尝试更简单的方法。

答案 1 :(得分:0)

  1. 找到选择中心(按照colithium的建议)
  2. 将选择点映射到坐标系,选择中心位于(0,0)。例如,如果选择中心位于(150,150),并且给定的选择点位于(125,75),则该点的映射位置变为(-25,-75)。
  3. 缩放映射点(将X和Y乘以0.0..1.0范围内的某些值)
  4. 将点重新映射回原始坐标系
  5. 只需要简单的数学,不需要关于规范化矢量。