我试图找到两个图像之间一个或多个差异的轮廓。
假设您有两个相同的图像。然后在其中一个图像的随机位置添加一个不透明的正方形和三角形。这些形状不能重叠。
我想要获取这些形状最外层像素的坐标,并且这些坐标必须被“分组” -> 我想要获取两组坐标,每组一个形状。
我尝试比较每个像素并获取最小和最大x和y值,这给了我形状的边界框。这有两个问题:它给我边界框而不是形状的轮廓。而且它仅适用于图像中没有超过一个形状的情况。
我无法想出一种方法来完成这项任务。
我几乎完全依赖php,但可以使用gd或imagick。我稍微倾向于gd,但imagick更快,更强大,所以也可以。
额外加分:最终结果应该是每个形状的简单(尽可能简单)多边形。某些精度损失是可以接受的,事实上是可以鼓励的。多边形的线条不必完美地遵循轮廓,允许一些偏差以换取更少的点。
编辑:
我所说的“轮廓”是这样的:假设我有一个画了一个矩形的图像。我想要找到的轮廓是组成矩形的四个点。涂上这个正方形的图像可以是任何图像。它可能是白色画布,也可能是风景或肖像,你说了算。
我现在意识到顺序很重要。我必须能够重新绘制正方形,而不会得到沙漏形状。
编辑2:
我正在使用imagick接近一步。
convert img/modified.png img/original.png -compose ChangeMask -composite out.png
这个命令使用原始图像作为蒙版(mask),将其应用到修改后的版本中,得到只有形状的图像。也许我可以使用标准的边缘检测算法来处理这张图像。
但是存在一个问题:只有当图像中只有一种形状时才能正常工作。但如果这是必然的结果,那么应该就没问题了。 编辑 3:
现在我可以获取不太复杂的形状轮廓。但它的结果有数百个点,这太多了。需要将其压缩到大约20个点左右。
具体过程如下:
- 我使用上述 ImageMagick 命令得到只包含形状的图像,其余部分透明。
- 在此图像中,我从顶部 (0,0) 开始向下查找非透明像素。然后查看 (1,0) 等等。当到达末尾时,我从 (width,0) 开始向左查找非透明像素,这样就遍历了整个图像的轮廓。