20

有没有一种有效的方法来获取图像指纹以进行重复检测?

也就是说,给定一个图像文件,比如 jpg 或 png,我希望能够快速计算一个值,该值标识图像内容并且对图像的其他方面(例如图像元数据)变化具有相当的弹性。如果它处理调整大小,那就更好了。

[更新] 关于 jpg 文件中的元数据,有人知道它是否存储在文件的特定部分吗?我正在寻找一种简单的方法来忽略它 - 例如。我可以跳过文件的前 x 个字节或从文件末尾获取 x 个字节以确保我没有获取元数据吗?

4

8 回答 8

21

如果您想规避元数据和大小相关的事情,请在黑暗中刺伤:

  1. 边缘检测和与尺度无关的比较
  2. 灰度/RGB值的采样和统计分析(平均亮度,平均颜色图)
  3. FFT 和其他变换(好文章Classification of Fingerprints using FFT

还有许多其他人。

基本上:

  1. 将 JPG/PNG/GIF 等格式转换为独立于编码的 RGB 字节数组
  2. 使用模糊模式分类方法在图像中生成“模式散列”......而不是一些人建议的 RGB 数组的散列
  3. 然后,您需要一种基于封装散列或模式编码的匹配阈值的快速散列比较分布式方法。Erlang 会很适合这个:)

优点是:

  1. 如果您使用任何 AI/Training,无论编码、大小、纵横比、色调和亮度修改、动态范围/二次采样差异以及在某些情况下的透视如何,都会发现重复

缺点:

  1. 可能很难编码..像OpenCV这样的东西可能会有所帮助
  2. 概率性...可能会出现误报,但可以通过神经网络和其他人工智能来减少
  3. 慢,除非您可以封装模式质量并分发搜索(MapReduce 样式)

查看图像分析书籍,例如:

  1. 模式分类 2ed
  2. 图像处理基础
  3. 图像处理-原理与应用

和别的

如果您正在缩放图像,那么事情就更简单了。如果不是,那么您必须面对这样一个事实,即缩放比样本减少在更多方面是有损的。

于 2009-08-11T17:06:06.587 回答
4

使用图像的字节大小进行比较将适用于许多应用程序。另一种方法是:

  1. 去掉元数据。
  2. 计算图像的 MD5(或其他合适的散列算法)。
  3. 将其与潜在的欺骗图像的 MD5(或其他)进行比较(前提是您也删除了该图像的元数据)
于 2009-08-11T17:06:10.440 回答
3

您可以使用像 SIFT(尺度不变特征变换)这样的算法来确定图片中的关键点并进行匹配。

http://en.wikipedia.org/wiki/Scale-invariant_feature_transform

它用于例如在全景图中拼接图像以检测不同图像中的匹配点。

于 2011-12-26T18:30:40.870 回答
1

您想要执行图像哈希。由于您没有指定特定的语言,我猜您没有偏好。至少有一个 Matlab 工具箱(测试版)可以做到这一点:http ://users.ece.utexas.edu/~bevans/projects/hashing/toolbox/index.html 。大多数谷歌结果都是研究结果,而不是实际的库或工具。

MD5ing 的问题在于 MD5 对输入的微小变化非常敏感,听起来你想做一些“更聪明”的事情。

于 2009-08-11T17:08:47.300 回答
0

很有趣的问题。最快和最简单的方法是计算内容字节数组的 crc32,但这仅适用于 100% 相同的图像。为了更智能的比较,您可能需要某种模糊逻辑分析......

于 2009-08-11T17:05:47.053 回答
0

我已经实现了至少一个简单的版本。我将所有图像转换并调整为非常小的(固定大小)黑白缩略图。然后我比较这些。它检测精确、调整大小和转换为黑白的副本。它可以在没有大量成本的情况下获得大量重复。

于 2009-08-11T17:08:17.173 回答
0

最简单的做法是对图像数据进行散列(如 MD5),忽略所有其他元数据。您可以找到许多可以解码常见图像格式的开源库,因此很容易剥离元数据。

但是,当图像本身被以任何方式操纵时,包括缩放、旋转,这不起作用。

要完全按照您的意愿行事,您必须使用图像水印,但它已获得专利并且可能很昂贵。

于 2009-08-11T17:09:44.067 回答
0

这只是一个想法:jpeg 的 DCT 中可能存在的低频分量可以用作大小不变的标识符。

于 2009-08-11T17:24:58.170 回答