【发布时间】:2016-04-14 17:05:24
【问题描述】:
我有一张图片 master.png 和超过 10.000 张其他图片(slave_1.png、slave_2.png、...)。他们都有:
- 相同的尺寸(例如 100x50 像素)
- 格式相同(png)
- 图片背景相同
98% 的 slave 与 master 相同,但 2% 的 slave 内容略有不同:
- 新颜色出现
- 新的小形状出现在图像中间
我需要找出那些不同的奴隶。我正在使用 Ruby,但使用其他技术没有问题。
我尝试File.binread 两个图像,然后使用== 进行比较。它适用于 80% 的奴隶。在其他奴隶中,它发现了变化,但图像在视觉上是相同的。所以它不起作用。
替代方案是:
- 计算每个从属设备中存在的颜色数量并与主设备进行比较。它将在 100% 的时间内工作。但我不知道如何在 Ruby 中以“轻量级”的方式进行操作。
- 使用一些图像处理器通过直方图进行比较,如
RMagick或ruby-vips8。这种方式也应该可行,但我需要消耗尽可能少的 CPU/内存。 - 编写一个 C++/Go/Crystal 程序以逐像素读取并返回多种颜色。我认为通过这种方式我们可以从 if 中获得性能。但肯定是艰难的道路。
有什么启示吗?有什么建议吗?
【问题讨论】:
-
查看this question。那里已经讨论了许多选项。
-
另一个关于与
File.binread比较的说明。由于您只是在比较文件内容和资源以及重要性的性能,所以最好简单地使用 bash 来做到这一点。查看:diff、cmp或md5。 -
如果您需要分类器,可以为Tensor Flow 工作。
-
当你说你想以轻量级的方式做的时候,你真的是说你不想使用太多的CPU吗?或者你的意思是你想要快速得到答案——这可能意味着使用所有的 CPU 一段时间?
-
@MarkSetchell “轻量级”是指使用尽可能少的 CPU/RAM。
标签: ruby performance image-processing