几乎重复的图像检测


93

用给定的一组图像彼此之间的相似度排序的快速方法是什么。

目前,我有一个可以在两个图像之间进行直方图分析的系统,但这是一个非常昂贵的操作,而且看起来过于矫kill过正。

理想情况下,我正在寻找一种算法,可以给每个图像一个分数(例如整数分数,例如RGB平均数),并且我可以按该分数排序。相同分数或彼此相邻的分数可能重复。

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994 

每个图像的RGB平均差,有类似的东西吗?


5
一个关键问题,考虑到您写的内容以及纳夫(Naaff)指出的相关问题的一些答案,您可能想更清楚地定义“相似性”的含义。偏移了五个像素的相同图像是否会“相似”?视觉上是...但是对于算法...可能不是,除非您已经想到并说明了它。您能否提供更多详细信息?重复的内容是精确的还是“接近”的?您是否正在查看可能略有不同角度的扫描?强度呢?这里有很多变量...
Beska

“重复项”有何不同?例如,它们是同一位置的图像,但姿势/移位是否不同?您似乎想要带有图像数量的O(nlog(n))。有人知道这是否可能吗?似乎是这样
。-–贾斯汀·谢纳

@未知:如果您对当前的答案不满意,可以给我们更多指导吗?我们已尽力回答您的问题,但是如果没有任何反馈,我们不太可能提出更好的建议。
纳夫

当前,这是计算机科学中尚未解决的重大问题之一。祝你好运!
约翰·克特吉克

Answers:


70

关于图像搜索和相似性度量的研究很多。这不是一个容易的问题。通常,仅凭一个图像int就无法确定图像是否非常相似。您的假阳性率很高。

但是,由于已经进行了很多研究,因此您可以看一下其中的一些内容。例如,本文(PDF)提供了一种紧凑的图像指纹算法,该算法适用于快速查找重复图像而无需存储大量数据。如果您想要强大的功能,这似乎是正确的方法。

如果您正在寻找更简单但绝对是临时的东西,那么这个SO问题有一些不错的想法。


2
那篇论文来自2004年,不确定是否仍然是最佳答案?
安德鲁

50

我建议您考虑不再使用RGB直方图。

如果对图像进行二维Haar小波处理(比听起来容易得多,仅进行多次平均并且使用一些平方根来加权系数),则可以获得更好的图像摘要,并且仅保留最大的k将小波中的加权系数作为稀疏矢量进行归一化,然后保存以减小其大小。您应该至少事先使用感知权重来缩放RG和B,或者我建议切换到YIQ(或YCoCg,以避免量化噪声),以便可以降低重要性的色度信息采样。

现在,您可以使用这些稀疏归一化向量中的两个的点积作为相似度。具有最大点积的图像对在结构上将非常相似。这样做的好处是对大小调整,色相移动和水印处理略有抵抗,并且真正易于实现和紧凑。

您可以通过增加或减少k来权衡存储和准确性。

对于这种分类问题,按单个数字分数进行排序将很困难。如果您考虑一下,它将要求图像只能沿一个轴“改变”,而不能。这就是为什么需要特征向量的原因。在Haar小波情况下,大约发生图像中最不连续的地方。您可以成对计算图像之间的距离,但是由于您所拥有的只是一个距离度量标准,因此线性排序无法表示3个均等距的图像的“三角形”。(例如,想象一个全是绿色的图像,一个全是红色的图像和全是蓝色的图像。)

这意味着要解决您的问题,任何真正的解决方案都需要在您拥有的图像数量中进行O(n ^ 2)个操作。如果可以线性化度量,则可以只要求O(n log n),或者如果度量适合于基数排序,则可以要求O(n)。就是说,您不需要花费O(n ^ 2),因为在实践中您不需要筛选整个集合,只需要查找比某个阈值更近的东西即可。因此,通过应用几种技术中的一种来划分稀疏向量空间,与天真地将每个图像与每个图像进行比较相比,您可以获得“发现比给定阈值更相似的图像的更快”的渐近性。您可能需要...即使不是您所要的。

无论如何,几年前,当我尝试最小化我存储的不同纹理的数量时,我亲自使用了此效果,但是在该空间中也有很多研究噪音显示了它的功效(在这种情况下,以更复杂的直方图分类形式):

http://www.cs.princeton.edu/cass/papers/spam_ceas07.pdf

如果您需要更高的检测精度,则可以将minHash和tf-idf算法与Haar小波(或直方图)一起使用,以更强大地处理编辑:

http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf

最后,斯坦福大学基于这种方法的一个更奇特的变体进行了图像搜索,它基于从小波中提取更多特征以查找旋转或缩放的图像部分等,但这可能超出了您的工作量想做。

http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi


似乎您是间接描述kd树等,以便在空间中搜索潜在的候选对象。可能值得注意。
Boojum,2009年

1
好吧,我之所以没有具体说明技术的原因是,当您的空间中维数较少时,kd树会很好地工作。在这里,您可能拥有约128个或更多的稀疏维度。由于它们是稀疏的,因此大多数值将为零,因此跨维循环以kd样式进行分区实际上几乎没有用。同样,R树崩溃了,最有可能成为最好的选择:X树。不幸的是,当面对这么多尺寸时,它们也接近其性能极限。
爱德华KMETT,2009年

”,而只是将小波中的k个最大加权系数保留为稀疏矢量,”-每行还是整个小波都保留?
ivan.ukr

“您应该至少事先使用感知权重来缩放RG和B,否则我建议您切换到YIQ(或YCoCg,以避免量化噪声),以便可以降低重要性的色度信息。” -然后呢?是将小波仅用于Y还是将其用于所有通道?如果对所有通道都适用-如何测量多个通道的图像相似度?添加每个渠道的点积并将其视为相似性度量还是应该进行加权加法?
ivan.ukr

15

我为此实现了一种非常可靠的算法,称为快速多分辨率图像查询。我的代码(古老,未经维护)在这里

快速多分辨率图像查询的作用是根据YIQ颜色空间将图像分为3个部分(比RGB更好地匹配差异)。然后,基本上使用小波算法压缩图像,直到每个颜色空间中只有最突出的特征才可用。这些点存储在数据结构中。查询图像经过相同的过程,并且查询图像中的突出特征与存储的数据库中的特征相匹配。匹配次数越多,图像相似的可能性就越大。

该算法通常用于“按草图查询”功能。我的软件仅允许通过URL输入查询图像,因此没有用户界面。但是,我发现将缩略图与该图像的大版本相匹配的效果非常好。

Retrievr比我的软件印象深刻得多,它使您可以尝试使用Flickr图像作为源的FMIQ算法。很酷!通过草图或使用源图像进行尝试,您可以看到其效果。


它还能识别旋转的图像吗?
endlith

我怀疑这样做是否会很好。您可能希望对每个旋转编码图像,以最大化相关匹配。
路加·弗朗克

到retrievr的链接似乎已断开-存档在任何地方吗?
mmigdol

10

图片具有很多功能,因此除非您将自己缩小到一个范围(例如平均亮度),否则您将要处理n维问题空间。

如果我要求您为世界上的城市分配一个整数,那么我可以分辨出哪个城市比较近,那么结果将不是很好。例如,您可以选择时区作为单个整数,并在某些城市获得良好的效果。但是,即使北极附近的城市和南极附近的城市位于地球的相对两端,也可以位于同一时区。如果我让您使用两个整数,则经度和纬度都可以得到很好的结果。对于图像相似性,问题是相同的。

综上所述,有些算法会尝试将相似的图像聚类在一起,而这正是您所要求的。当您使用Picasa进行人脸检测时,就会发生这种情况。甚至在您识别任何面孔之前,它都会将相似的面孔聚集在一起,因此很容易遍历一组相似的面孔,并为大多数面孔赋予相同的名称。

还有一种称为“主成分分析”的技术,它使您可以将n维数据减少到任意数量的维。因此,具有n个特征的图片可以简化为一个特征。但是,这仍然不是比较图像的最佳方法。


1
这是一个有争议的问题,但是您可以使用一个整数来表示任意多个特征的组合,例如,如果特征x = 2和特征y = 3并且特征z = 5和特征aa = 7,等等那么以一个整数的因式分解形式将素数基数提高到的幂将是该特定图像的特征值。再次,有争议的是因为数字的大小是荒谬的。尽管可以进一步减小该大小……我们只是在谈论结构化数据。
argyle 2013年

真正。但是真正的重点是排列数字,以使相似的图像在数字上接近。尽管我上面说了什么,但这是可能的。简而言之,您可以解决“旅行推销员”问题,以在n维空间(其中n是要用于比较图像的要素数量)中找到通过图像的最小(或接近最小)路径。但这很昂贵。
尼尔

8

有一个C库(“libphash” - http://phash.org/),将计算出的图像的“感知哈希”,并允许您通过比较散列(检测类似的图像,因此您不必每次图像进行比较直接与所有其他图像相对),但不幸的是,当我尝试使用它时,它似乎不太准确。


5

您必须确定什么是“相似”。对比?色调?

图片是否与同一图片上下颠倒?

我敢打赌,通过将图像分解为4x4片段并为每个网格单元获得平均颜色,您可以找到很多“关闭呼叫”。每个图像您将获得16分。要判断相似度,您只需要对图像之间的差异进行平方和即可。

我认为没有一个哈希是有意义的,除非它与诸如色相,亮度或对比度之类的单个概念背道而驰。

这是您的想法:

0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994

首先,我将假设它们是R *(2 ^ 16)+ G *(2 ^ 8)+ B或类似的十进制数。显然,这不好,因为红色是过分加权的。

进入HSV空间会更好。您可以将HSV的各个位散布到哈希中,或者可以单独设置H或S或V,或者每个图像可以有三个哈希。


还有一件事。如果对R,G和B进行加权。则权重最高的是绿色,然后是红色,然后是蓝色,以符合人类的视觉敏感性。


5

在网络服务时代,您可以尝试http://tineye.com


3
tineye背后的代码似乎正是发问者所追求的,但是我认为作为网络服务它不是非常有用,因为没有(显而易见的)方式给它两个图像并问“这些是相同的吗? ” -第二张图片必须在网页上,并由tineye编制索引
-dbr

1
也许正在为企业用户提供API?应该就此与他们联系。
zproxy

有一个商业API正是提供该service.tineye.com/MatchEngine
朱斯


1

我假设其他重复图像搜索软件对图像执行FFT,并将不同频率的值存储为矢量:

Image1 = (u1, u2, u3, ..., un)
Image2 = (v1, v2, v3, ..., vn)

然后您可以通过计算两个图像的权重向量之间的距离来比较两个图像的相等性

distance = Sqrt(
     (u1-v1)^2 +
     (u2-v2)^2 +
     (u2-v3)^2 +
     ...
     (un-vn)^2);

2
大多数自然图像的频率含量非常相似,因此我怀疑这是否是一个很好的指标。
汉尼斯·奥夫雷恩09年

1

一种解决方案是对执行气泡排序所需的每对图片执行RMS / RSS比较。其次,您可以对每个图像执行FFT,并进行一些轴平均以为每个图像检索一个整数,并将其用作索引进行排序。您可以考虑对调整后大小(25%,10%)的原始版本进行任何比较,具体取决于您选择忽略的差异有多小以及所需的加速比。让我知道这些解决方案是否有趣,我们可以讨论或者提供示例代码。


FFT仅提供颜色信息,而没有位置信息。调整大小会忽略给定尺寸以下的所有功能,无论对结果图像的影响如何。在这种情况下,灰度图像和棋盘格可以相同。小波方法(Daubechies,Haar等)具有通过权衡每个数据点中位置和颜色信息的比例来提供位置和颜色信息的优点。
爱德华·KMETT 09年

2
不,图像的FFT包含原始图像的所有空间信息。您可以从FFT重构原始图像。 homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm 但是,直方图可能不是您所想的。
保罗,2009年

1

用于检测近重复图像检测的最现代方法是使用有趣的点检测和描述这些点周围区域的描述符。通常使用SIFT。然后,您可以对描述符进行量化,并使用聚类作为可视词词汇。

因此,如果我们看到两个图像的通用视觉词与这些图像的所有视觉词的比率,则可以估计图像之间的相似性。有很多有趣的文章。其中之一是 近重复图像检测:minHash和tf-idf加权


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.