94

什么是通过它们彼此的相似性对给定图像集进行排序的快速方法。

目前,我有一个系统可以在两个图像之间进行直方图分析,但这是一项非常昂贵的操作,而且似乎太过分了。

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

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

每张图像的 RGB 平均值很糟糕,有类似的东西吗?

4

12 回答 12

71

关于图像搜索和相似性度量的研究已经很多。这不是一个容易的问题。通常,单个int不足以确定图像是否非常相似。你会有很高的误报率。

但是,由于已经完成了很多研究,您可能会看一下其中的一些。例如,本文(PDF) 给出了一种紧凑的图像指纹识别算法,适用于快速查找重复图像且无需存储大量数据。如果你想要一些健壮的东西,这似乎是正确的方法。

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

于 2009-06-23T20:59:57.790 回答
50

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

如果您采用图像的 2d 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

于 2009-07-02T20:23:59.203 回答
15

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

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

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

比我的软件更令人印象深刻的是retrievr,它可以让你尝试使用 Flickr 图像作为源的 FMIQ 算法。很酷!通过草图或使用源图像进行尝试,您会看到它的效果如何。

于 2009-07-02T07:20:38.483 回答
10

一张图片有很多特征,所以除非你把自己缩小到一个,比如平均亮度,否则你正在处理一个 n 维的问题空间。

如果我让你为世界上的城市分配一个整数,这样我就可以分辨出哪些城市是接近的,结果不会很好。例如,您可以选择时区作为您的单一整数,并在某些城市获得良好的结果。然而,一个靠近北极的城市和另一个靠近南极的城市也可以在同一个时区,即使它们位于地球的两端。如果我让你使用两个整数,你可以得到很好的经纬度结果。图像相似度的问题也是一样的。

综上所述,有一些算法试图将相似的图像聚集在一起,这实际上就是您所要求的。当您使用 Picasa 进行人脸检测时会发生这种情况。甚至在您识别任何面孔之前,它就会将相似的面孔聚集在一起,以便轻松浏览一组相似的面孔并为其中的大多数面孔赋予相同的名称。

还有一种称为主成分分析的技术,它可以让您将 n 维数据减少到任何较小的维数。所以一张有n个特征的图片可以简化为一个特征。但是,这仍然不是比较图像的最佳方法。

于 2009-06-30T23:23:09.813 回答
8

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

于 2009-06-24T00:33:58.467 回答
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 进行权重。将绿色权重最高,然后是红色,然后是蓝色,以匹配人类的视觉敏感度。

于 2009-06-23T21:34:07.767 回答
5

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

于 2009-07-02T06:16:39.800 回答
2

问题识别相似图像的好方法?似乎为您的问题提供了解决方案。

于 2010-07-10T00:03:57.600 回答
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);
于 2009-06-23T21:25:11.373 回答
1

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

于 2009-06-26T11:55:29.783 回答
1

大多数检测近重复图像检测的现代方法使用有趣的点检测和描述这些点周围区域的描述符。通常使用SIFT。然后你可以量化描述符并使用集群作为视觉词汇。

因此,如果我们查看两张图像的常见视觉词与这些图像的所有视觉词的比率,您就会估计图像之间的相似性。有很多有趣的文章。其中之一是 近乎重复的图像检测:minHash 和 tf-idf 加权

于 2010-01-17T17:34:06.143 回答
1

例如,使用 IMMI 扩展和 IMMI,您可以检查如何测量图像之间相似性的许多不同方法:http: //spl.utko.feec.vutbr.cz/en/component/content/article/46-image-processing-extension- for-rapidminer-5

通过定义一些阈值并选择一些方法,您可以测量相似度。

于 2012-01-24T14:31:31.987 回答