近重复图像检测
Posted
技术标签:
【中文标题】近重复图像检测【英文标题】:Near-Duplicate Image Detection [closed] 【发布时间】:2010-11-05 07:33:18 【问题描述】:根据图像彼此的相似性对一组给定图像进行排序的快速方法是什么?
目前我有一个系统可以在两个图像之间进行直方图分析,但这是一项非常昂贵的操作,而且似乎过于矫枉过正。
最好我正在寻找一种算法,它会给每个图像一个分数(例如一个整数分数,如 RGB 平均值),我可以按该分数排序。相同的分数或彼此相邻的分数可能是重复的。
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
每张图像的 RGB 平均值很糟糕,有类似的吗?
【问题讨论】:
一个关键问题,考虑到您所写的内容以及 Naaff 指出的相关问题的一些答案,您可能想要更清楚地定义“相似性”的含义。相同但偏移五个像素的图像是否“相似”?视觉上是的……但是对于算法……可能不是,除非你已经想到并解释了它。你能提供更多细节吗?重复是准确的,还是只是“关闭”?您是否正在查看它们可能会因轻微角度测量而有所不同的扫描?强度如何?这里有很多变量... “重复”有何不同?例如它们会是具有不同姿势/移位的同一位置的图像吗?您似乎想要图像数量为 O(nlog(n)) 的东西。有谁知道这是否可能?好像是.. @The Unknown:如果您对当前的任何答案都不满意,能否再给我们一些指导?我们已尽力回答您的问题,但如果没有任何反馈,我们不太可能提出更好的建议。 这是目前计算机科学中最大的未解决问题之一。祝你好运哥们。 【参考方案1】:一张图片有很多特征,所以除非你把自己缩小到一个,比如平均亮度,你正在处理一个 n 维的问题空间。
如果我让你为世界上的城市分配一个整数,这样我就可以分辨出哪些城市是接近的,结果不会很好。例如,您可以选择时区作为您的单一整数,并在某些城市获得良好的结果。然而,一个靠近北极的城市和另一个靠近南极的城市也可以在同一个时区,即使它们位于地球的两端。如果我让你使用两个整数,你可以得到很好的经纬度结果。图像相似度也是同样的问题。
总而言之,有一些算法会尝试将相似的图像聚集在一起,这实际上就是您所要求的。当您使用 Picasa 进行人脸检测时会发生这种情况。甚至在您识别任何面孔之前,它就会将相似的面孔聚集在一起,以便轻松浏览一组相似的面孔并为其中的大多数面孔赋予相同的名称。
还有一种称为主成分分析的技术,可让您将 n 维数据减少到任何较小的维数。所以一张有n个特征的图片可以简化为一个特征。但是,这仍然不是比较图像的最佳方法。
【讨论】:
这是一个有争议的问题,但您可以使用单个整数来表示任意数量的特征的组合,例如,如果特征 x = 2 和特征 y = 3 和特征 z = 5 并且特征 aa = 7 等等,那么以单个整数的因式分解形式提高该素数基数的幂将是该特定图像的特征值。同样,这是一个有争议的问题,因为数字的大小是荒谬的。虽然这个大小可以进一步减小......我们只是在谈论结构化数据。 是的。但真正的重点是排列数字,使相似的图像在数字上接近。尽管我上面说了,这是可能的。简而言之,您可以解决 Traveling Salesperson 问题,以找到穿过 n 维空间中的图像的最小(或接近最小)路径(其中 n 是您要用于比较图像的特征数)。但这很昂贵。【参考方案2】:例如,使用 IMMI 扩展和 IMMI,您可以检查许多不同的方法来衡量图像之间的相似性: http://spl.utko.feec.vutbr.cz/en/component/content/article/46-image-processing-extension-for-rapidminer-5
通过定义一些阈值并选择一些方法,您可以测量相似度。
【讨论】:
【参考方案3】:Good way to identify similar images?这个问题似乎为你的问题提供了解决方案。
【讨论】:
【参考方案4】:检测近乎重复图像检测的大多数现代方法都使用有趣的点检测和描述这些点周围区域的描述符。通常使用SIFT。然后你可以量化描述符并使用集群作为视觉词汇。
因此,如果我们查看两张图像的常见视觉词与这些图像的所有视觉词的比率,您就会估计图像之间的相似性。有很多有趣的文章。其中之一是Near Duplicate Image Detection: minHash and tf-idf Weighting
【讨论】:
【参考方案5】:我建议考虑不要只使用 RGB 直方图。
如果您对图像进行 2d Haar 小波(它比听起来容易得多,它只是大量平均和一些用于加权系数的平方根)并保留图像,则可以获得更好的图像摘要将小波中的 k 个最大加权系数作为稀疏向量,对其进行归一化,并将其保存以减小其大小。您应该至少事先使用感知权重重新调整 R G 和 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-trees 等以搜索潜在候选人的空间。这可能值得注意。 嗯,我没有指定技术的原因是除了模糊的暗示之外,kd-trees 在你的空间中具有相对较少的维度时工作得很好。在这里,您可能有大约 128 个或更多的维度,这些维度是稀疏的。由于它们是稀疏的,大多数值将为零,因此跨维度循环以 kd 样式进行分区实际上几乎没有用。出于同样的原因,R-trees 崩溃了,最有可能成为您最好的选择:X-trees。不幸的是,当面对这么多维度时,它们也接近了性能的极限。 " 并且只保留小波中的 k 个最大加权系数作为稀疏向量," - 保留每行或整个小波? “您至少应该使用感知权重重新调整 R G 和 B,否则我建议切换到 YIQ(或 YCoCg,以避免量化噪声),以便您可以降低重要性对色度信息进行采样。” - 然后呢?只对 Y 做小波还是对所有通道做小波?如果对所有通道都这样做 - 如何测量具有多个通道的图像的相似性?添加每个通道的点积并将其视为相似性度量还是应该是一些加权相加?【参考方案6】:我为此实现了一个非常可靠的算法,称为Fast Multiresolution Image Querying。我的(古老的、未维护的)代码是here。
快速多分辨率图像查询的作用是根据 YIQ 颜色空间将图像分成 3 块(比 RGB 更适合匹配差异)。然后基本上使用小波算法压缩图像,直到每个颜色空间中只有最突出的特征可用。这些点存储在数据结构中。查询图像经过相同的过程,查询图像中的突出特征与存储数据库中的特征相匹配。匹配越多,图像相似的可能性就越大。
该算法通常用于“按草图查询”功能。我的软件只允许通过 URL 输入查询图像,因此没有用户界面。但是,我发现它非常适合将缩略图与该图像的大版本进行匹配。
比我的软件更令人印象深刻的是retrievr,它可以让您尝试使用 Flickr 图像作为源的 FMIQ 算法。很酷!通过草图或使用源图像进行尝试,您会看到它的效果如何。
【讨论】:
它还能识别旋转的图像吗? 我怀疑它是否能很好地解决这个问题。您可能希望对每次旋转的图像进行编码以最大化相关匹配。 retrievr 的链接似乎已关闭 - 是否已存档?【参考方案7】:在网络服务时代你可以试试http://tineye.com
【讨论】:
tineye 背后的代码似乎正是提问者所追求的,但我不认为作为网络服务它很有用,因为没有(明显的)方法给它两个图像并问“这些都一样吗?” - 第二张图片必须在网页上,并由 tineye 索引 也许是为商业用户提供API?应该就此联系他们。 有一个商业 API 正好提供 services.tineye.com/MatchEngine。【参考方案8】:一种解决方案是对执行冒泡排序所需的每对图片执行RMS/RSS 比较。其次,您可以在每个图像上执行FFT 并进行一些轴平均以检索每个图像的单个整数,您将使用该整数作为索引进行排序。您可以考虑对原始版本的调整大小(25%、10%)进行任何比较,具体取决于您选择忽略的差异有多小以及您需要多少加速。让我知道这些解决方案是否有趣,我们可以讨论或者我可以提供示例代码。
【讨论】:
FFT 只提供颜色信息,不提供位置信息。无论对结果图像的影响如何,调整大小都会忽略给定大小以下的所有特征。在该度量下,灰色图像和棋盘格可以是相同的。小波方法(Daubechies、Haar 等)具有通过权衡每个数据点中位置和颜色信息的比例来提供位置和颜色信息的优点。 不,图像的 FFT 包含原始的所有空间信息。您可以从 FFT 重建原始数据。 homepages.inf.ed.ac.uk/rbf/HIPR2/fourier.htm 但是,直方图可能不是您想的那样。【参考方案9】:您必须决定什么是“相似”。对比?色调?
一张图片是否与同一张图片“相似”上下颠倒?
我敢打赌,您可以通过将图像分成 4x4 块并获得每个网格单元的平均颜色来找到很多“近距离通话”。每张图片有 16 分。要判断相似度,您只需对图像之间的差异进行平方和即可。
我认为单个哈希没有意义,除非它与色调、亮度或对比度等单一概念相对。
这是你的想法:
0299393
0599483
0499994 <- possible dupe
0499999 <- possible dupe
1002039
4995994
6004994
首先,我将假设这些是十进制数,即 R*(2^16)+G*(2^8)+B,或类似的东西。显然这不好,因为红色的权重过高。
Moving into HSV space 会更好。您可以将spread the bits of HSV out 放入哈希中,或者您可以单独设置 H 或 S 或 V,或者您可以为每个图像设置三个哈希。
还有一件事。如果您对 R、G 和 B 进行加权。加权绿色最高,然后是红色,然后是蓝色,以匹配人类的视觉敏感度。
【讨论】:
【参考方案10】:有一个 C 库(“libphash”-http://phash.org/)可以计算图像的“感知散列”,并允许您通过比较散列来检测相似图像(因此您不必直接比较每个图像其他所有图像)但不幸的是,当我尝试它时它似乎不是很准确。
【讨论】:
【参考方案11】:我假设其他重复图像搜索软件对图像执行 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);
【讨论】:
大多数自然图像具有非常相似的频率内容,所以我怀疑这将是一个非常好的指标。【参考方案12】:关于图像搜索和相似性度量的研究已经很多。这不是一个容易的问题。通常,单个int
不足以确定图像是否非常相似。你会有很高的误报率。
但是,由于已经完成了大量研究,您可以看看其中的一些。例如,this paper (PDF) 提供了一种紧凑的图像指纹识别算法,适用于快速查找重复图像且无需存储大量数据。如果您想要一些健壮的东西,这似乎是正确的方法。
如果您正在寻找更简单但绝对更临时的东西,this SO question 有一些不错的想法。
【讨论】:
那篇论文是 2004 年的,不确定这是否仍然是最佳答案?以上是关于近重复图像检测的主要内容,如果未能解决你的问题,请参考以下文章