找到图像之间的差异轮廓

时间:2013-06-18 19:41:30

标签: php image-processing gd imagick

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

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

我想得到这些形状的最外面像素的坐标,这些坐标必须'分组' - >我想获得两组坐标,每个形状一组。

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

我不能为我的生活想办法来完成这件事。

我几乎与php有关,但可以选择gd或imagick。我对gd略有偏好,但是想象力更快,更强大,所以也没关系。

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

修改
我的意思是'轮廓'是这样的:假设我有一个画有矩形的图像。我想要找到的轮廓是构成矩形的四个点。绘制此正方形的图像可以是任何图像。它可能是白色帆布或风景或肖像,你可以命名 而我现在意识到点的顺序很重要。我必须能够重新绘制正方形而不是沙漏形状。

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

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

此命令使用原件作为修改版本的蒙版,并为我提供仅包含其形状的图像。也许使用这个图像我可以使用标准的边缘检测算法 一个持久存在的问题:它只有在图像中只有一个形状时才有效。但如果结果证明这是一个结果,我猜它会没问题。

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

流程如下:

  • 我使用上面的imagemagick命令,它给我一个只有形状的图像,图像的其余部分是透明的
  • 在此图像中,我从顶部(0,0)开始,向下看以找到非透明像素。然后我看(1,0)等。当我到达结束时,我从(宽度,0)开始,向左看一个非透明像素。这样我就可以在图像周围“感觉”轮廓。

1 个答案:

答案 0 :(得分:0)

Here是几种轮廓追踪算法的不错演练。就个人而言,我使用Moore-neighborhood tracing算法(another link)并取得了良好的效果。我发现这是准确的,它保留了订单,所以你不会遇到沙漏问题。

然而,在我达到这一点之前,我经常需要做一些预处理(morphological filters或图像减法(如你所知))。

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

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

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

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