gpt4 book ai didi

php - 找到图像之间差异的轮廓

转载 作者:可可西里 更新时间:2023-10-31 23:48:44 25 4
gpt4 key购买 nike

我试图找到两幅图像之间一个或多个差异的轮廓。

假设您有两张相同的图片。然后在其中一张图像的随机位置添加一个不透明的正方形和三角形。形状不能重叠。

我想获取这些形状最外层像素的坐标,这些坐标必须“分组”-> 我想获取两组坐标,每个形状一组。

我已经尝试比较每个像素并获取最小和最大 x 和 y 值,这些值给出了形状的边界框。这有两个问题:它给了我边界框,而不是形状的轮廓。并且只有当图像中的形状不超过一个时,它才有效。

我这辈子都想不出办法来完成这件事。

我非常喜欢 php,但可以使用 gd 或 imagick。我稍微偏向于 gd,但 imagick 更快更强大,所以也可以。

奖励点:最终结果应该是每个形状一个简单(尽可能简单)的多边形。一些精度损失是可以的,实际上是鼓励的。多边形的线不必完全遵循等高线,允许有一些偏差以支持较少的点。

编辑:
我所说的“轮廓”是指:假设我有一个图像,上面画了一个矩形。我想找到的轮廓是构成矩形的四个点。这个正方形绘制的图像可以是任何图像。它可能是白色 Canvas 、风景画或肖像画,随您便。
我现在意识到点的顺序很重要。我必须能够重新绘制正方形,而不是以沙漏形状结束。

编辑 2:
我离使用 imagick 更近了一步。

convert img/modified.png img/original.png -compose ChangeMask -composite out.png

此命令使用原始版本作为修改版本的蒙版,并给我一张只有形状的图像。也许对于这张图片我可以使用标准的边缘检测算法。
一个持续存在的问题:它仅在图像中只有一种形状时才有效。但是,如果结果是我想的结果,那也没关系。

编辑 3:
我现在能够获得不太复杂形状的轮廓。但它会产生数百个点,这太多了。它应该被压缩到大约 20 个点。

过程如下:

  • 我使用上面的 imagemagick 命令,它给我一个只有形状的图像,图像的其余部分是透明的
  • 在这张图片中,我从顶部 (0,0) 开始向下看以找到一个非透明像素。然后我看看 (1,0) 等。当我到达终点时,我从 (width,0) 开始,向左看是否有非透明像素。通过这种方式,我可以遍历图像以“感受”轮廓。

最佳答案

Here是几个轮廓追踪算法的一个体面的演练。就个人而言,我使用了 Moore-neighborhood tracing算法 ( another link ) 具有良好的效果。我发现这是准确的,它保留了顺序,所以你不会遇到沙漏问题。

然而,在达到这一点之前,我通常必须进行一些预处理(morphological filters 或图像减法(如您所知))。

在这两个步骤之后,您应该有一个点集合。您有两个选择:

1) 复杂:将它们收集成向量。如果向量显着改变斜率(或方向),你就知道你有一个点。命令行工具,如 potrace可以做到这一点。 potrace 的算法是 here非常好。在您的简单矩形示例中,这将起作用,但它也适用于更复杂的场景,如圆形(您将只有很多矢量用于圆形)。

2) 简单:使用 Moore-Neigborhood 遍历您找到的像素并确定方向的变化。 (也就是说,如果三个像素排成一条线,而接下来的三个像素不是某个阈值 x 的“内联”,那么您就有一个角)。该算法适用于正方形,但对于更复杂的图像(例如八边形和圆形,其中线之间的角度增量更钝)开始分崩离析。

如果您所有的形状都足够简单(方形圆形等),您还可以考虑模板匹配(简单形状检测)。一个好的链接位于here在 Aforge 文档中。

关于php - 找到图像之间差异的轮廓,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17177496/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com