图像指纹以比较许多图像的相似性
image
image-processing
6
0

我需要创建许多图像的指纹(大约有100.000,每天有1000新图像,RGB,JPEG,最大尺寸为800x800),以非常快速地将每个图像与其他图像进行比较。我不能使用二进制比较方法,因为还应该识别几乎相似的图像。

最好是现有的库,但是对现有算法的一些提示将对我有很大帮助。

参考资料:
Stack Overflow
收藏
评论
共 10 个回答
高赞 时间 活跃

有关iPhone图像比较和图像相似性开发的信息,请访问: http : //sites.google.com/site/imagecomparison/

要查看实际效果,请在iTunes AppStore上查看eyeBuy Visual Search。

收藏
评论

您是否真的想将每个图像与其他图像进行比较?有什么用途?也许您只需要基于某些描述符的某种索引和图像检索?然后,例如,您可以查看“多媒体内容描述接口”的MPEG-7标准。然后,您可以比较不同的图像描述符,它们不是那么准确,但是速度要快得多。

收藏
评论

因此,您想要进行与“图像匹配”完全不同的“指纹匹配”。在过去的20年中,对指纹的分析进行了深入的研究,并且开发了一些有趣的算法来确保正确的检测率(相对于FARFRR措施- 错误接受率错误拒绝率 )。

我建议您最好使用LFA(局部特征分析)类检测技术,这些技术主要基于细节检查。细节是任何指纹的特定特征,并且已分为几类。实际上,大多数公共机构都会将光栅图像映射到细节图上,以提交犯罪分子或恐怖分子文件。

请参阅此处以获取更多参考

收藏
评论

您可以执行此操作的一种方法是调整图像大小并大幅降低分辨率(也许降低到200x200?),然后存储较小的(像素平均)版本进行比较。然后定义一个公差阈值并比较每个像素。如果所有像素的RGB都在公差范围内,则说明匹配。

最初的运行时间为O(n ^ 2),但是如果对所有匹配项进行分类,则每个新图像都只是O(n)算法进行比较(您只需将其与每个先前插入的图像进行比较)。但是,随着要比较的图像列表变大,它最终会崩溃,但是我认为您暂时可以安全使用。

运行400天后,您将拥有500,000张图像,这意味着(不考虑缩小图像尺寸的时间) 200(H)*200(W)*500,000(images)*3(RGB) = 60,000,000,000比较。如果每个图像都完全匹配,那么您将会落后,但是事实可能并非如此,对吧?请记住,一旦单个比较超出阈值,您就可以打折图像作为匹配项。

收藏
评论

截至2015年(回到未来...关于这个2009年的问题,现在在Google中排名很高),可以使用深度学习技术来计算图像相似度。称为自动编码器的算法家族可以创建可搜索相似性的矢量表示。有一个演示这里

收藏
评论

与IC的答案类似-您可以尝试比较多种分辨率的图像。因此,每个图像都保存为1x1、2x2、4x4 .. 800x800。如果最低分辨率不匹配(受阈值限制),则可以立即拒绝。如果匹配,则可以在下一个更高的分辨率下进行比较,依此类推。

另外-如果图像共享任何类似的结构(例如医学图像),则您可能能够将该结构提取到描述中,以便于比较/更快地进行比较。

收藏
评论

您绝对应该看看phash

为了进行图像比较,有一个php项目: https : //github.com/kennethrapp/phasher

和我的小JavaScript克隆: https : //redaktorcms.com/dev/phasher/demo_js/index.html

不幸的是,这是基于“位计数”的,但是可以识别旋转的图像。 Javascript中的另一种方法是借助画布来根据图像构建亮度直方图。您可以在画布上可视化多边形直方图,并在数据库中比较该多边形(例如,mySQL空间...)

这是视频直方图的演示: https : //redaktorcms.com/dev/globetrottr/testHashVideo.php

收藏
评论

常规哈希或CRC计算算法不适用于图像数据。必须考虑信息的维度性质。

如果您需要非常鲁棒的指纹识别,从而考虑了仿射变换(缩放,旋转,平移,翻转),则可以在图像源上使用Radon变换来生成图像数据的规范映射-将其与每个图像一起存储并然后只比较指纹。这是一个复杂的算法,并不适合胆小的人。

可能有一些简单的解决方案:

  1. 为图像创建亮度直方图作为指纹
  2. 创建每个图像的缩小版本作为指纹
  3. 将技术(1)和(2)组合为混合方法以提高比较质量

亮度直方图(尤其是被分成RGB分量的直方图)是图像的合理指纹-可以非常有效地实现。从另一个直方图中减去一个直方图将产生一个新的直方图,您可以对其进行处理以确定两个图像的相似程度。直方图,因为仅评估发光度/颜色信息的分布和发生,可以很好地处理仿射变换。如果将每个颜色分量的亮度信息量化为8位值,则768字节的存储空间足以容纳几乎任何合理大小的图像指纹。当操纵图像中的颜色信息时,亮度直方图会产生假阴性。如果您应用了诸如对比度/亮度之类的变换,后代化,色彩偏移,亮度信息改变。某些类型的图像也可能出现误报现象,例如风景和单色占主导的图像。

使用缩放图像是将图像的信息密度降低到易于比较的水平的另一种方法。缩小到原始图像尺寸的10%以下通常会丢失太多信息以供使用-因此800x800像素的图像可以缩小到80x80,并且仍然提供足够的信息来执行不错的指纹识别。与直方图数据不同,当源分辨率的宽高比变化时,必须对图像数据执行各向异性缩放。换句话说,将300x800的图片缩小为80x80的缩略图会导致图片变形,因此与300x500的图片(非常相似)相比,会导致假阴性。当涉及仿射变换时,缩略图指纹通常还会产生假阴性。如果翻转或旋转图像,其缩略图将与原始图像有很大不同,并可能导致误报。

结合两种技术是对冲您的赌注并减少误报和误报的发生的合理方法。

收藏
评论

很久以前,我在一个具有类似特征的系统上工作,这是我们遵循的算法的近似值:

  1. 将图片分成几个区域。在本例中,我们正在处理4:3分辨率的视频,因此我们使用了12个区域。这样做会使源图像的分辨率脱离图片。
  2. 对于每个区域,计算总体颜色-该区域中所有像素的平均值
  3. 对于整个图像,计算整体颜色-所有区域的平均值

因此,对于每个图像,您要存储n + 1整数值,其中n是要跟踪的区域数。

为了进行比较,您还需要单独查看每个颜色通道。

  1. 对于整体图像,比较整体颜色的颜色通道以查看它们是否在某个阈值之内-例如10%
  2. 如果图像在阈值内,则接下来比较每个区域。如果所有区域也都在阈值之内,则图像具有足够强的匹配度,您至少可以标记它们以进行进一步比较。

这样,您可以快速丢弃不匹配的图像。您还可以使用更多区域和/或递归地应用算法,以获得更强的匹配置信度。

收藏
评论

与此处提出的按比例缩小的图像变体相比,临时方法要少得多,该变体保留了它们的一般风味,但是为正在发生的事情提供了更为严格的数学基础。

拍摄图像的Haar小波 。从本质上讲,Haar小波是从较低分辨率图像到每个高分辨率图像的连续差分,但是由mipmap的“树”中的深度来加权。计算很简单。然后,一旦您对Haar小波进行了适当的加权,则丢弃除k个最大系数(就绝对值而言)以外的所有系数,对向量进行归一化并保存。

如果您采用这些归一化向量中两个向量的点积,则会为您提供相似度的度量,其中1几乎相同。我在这里发布了更多信息。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号