如何获取特定图像在另一图像中的位置?

如何获取特定图像在另一图像中的位置?

我有很多 PNG 屏幕截图,每个屏幕截图中都有一张相同的图形。该作品在所有图像中都具有相同的尺寸。

我可以使用什么命令行程序来查找它在每个文件中的位置(一个一个地输入)?

答案1

以下只是一个粗略的想法,没有现成的解决方案(尤其是没有代码!)。

我会将小图形和屏幕截图的样本转换为原始(未压缩)格式(热重分析绝对没有压缩,它只是每个像素的完整转储),然后 grep 查找屏幕截图文件中的图形。然后计算位置。

为了进行计算,您需要图像的尺寸(宽度和高度),您可以使用 Image Magick 的identify命令获得这些尺寸。那是:

GRAPHIC_WIDTH=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*Geometry:\ \(.*\)x.*%\1%p')
GRAPHIC_HEIGHT=$(identify -verbose graphic.tga | sed -n '/Geometry:/s%.*x\([^+]*\)+.*%\1%p')

TGA 文件的前 18 个字节不包含像素信息,因此应省略:

tail -c +19 graphic.tga > graphic.colorinfo

而且,正如 MatthewRock 的评论中那样,您不能grep一次查找整个图形,因为它是逐行保存的,并且周围都是屏幕截图中的像素,您应该逐行搜索,即搜索图形的第一个像素行,如果找到,则进一步搜索第二行 X 像素,其中 X 是屏幕截图的宽度减去图形的宽度。

您应该使用grep该选项-F和一个由 K 像素处的换行符分隔的图形文件,其中 K 是图形的宽度乘以其颜色深度(以字节为单位)。使用head和执行此操作tail。如果颜色深度为 8 位,则每个像素线的长度为 K 字节,如果颜色深度更高,例如 24 位或 3 字节,则像素线的长度为 K 乘以 3 字节,依此类推:

第 10 行长 20 像素,颜色深度为 3 字节,可以通过以下方式获得:

head -c $((10*20*3)) graphic.colorinfo | tail -c 60

当然,在某些情况下,用 shell 代码编写这种方法会有些复杂,例如,如果屏幕截图完全是单色白色(图形也是如此),并且图形只有一个黑色像素。

这个想法是保存临时起始坐标(第一行匹配的最左边和最上面像素的位置),并从那里搜索下面的行,直到一行不匹配,然后从下一个匹配的第一行开始,等等。

最后我不得不说,在字节级别上执行此操作会容易得多(不适用于使用文本工具处理图像),例如十六进制编辑器。或者更好地使用 C 或 python。但方法是相同的(搜索匹配行)。

相关内容