近乎重复的图像检测
根据它们的相似性来sorting给定的一组图像是一种快速的方法。
目前我有一个系统可以在两幅图像之间进行直方图分析,但是这是一个非常昂贵的操作,看起来太过矫枉过正。
最佳的,我正在寻找一种algorithm,可以给每个图像得分(例如,整数分数,如RGB平均值),我可以按该分数sorting。 彼此相同的分数或分数是可能的重复。
0299393 0599483 0499994 <- possible dupe 0499999 <- possible dupe 1002039 4995994 6004994
RGB每个图像的平均值很糟糕,是否有类似的东西?
在图像search和相似度测量方面进行了大量的研究。 这不是一个简单的问题。 一般来说,单个int
不足以确定图像是否非常相似。 你会有很高的假阳性率。
但是,由于已经做了大量的研究,你可以看看其中的一些。 例如, 本文 (PDF)提供了一种紧凑的图像指纹识别algorithm,适用于快速查找重复图像,而不需要存储太多的数据。 如果你想要一些健壮的东西,这似乎是正确的方法。
如果你正在寻找更简单的东西,但肯定更特别, 这个问题有一些体面的想法。
我会build议考虑从使用RGB直方图移开。
如果您拍摄图像的二维哈尔小波(它比听起来容易很多,它只是很多平均和一些平方根用于加权系数),可以获得更好的图像摘要,并保留最大的k将小波中的加权系数作为稀疏vector,对其进行归一化,并将其保存以减小其大小。 您应该至less事先使用感知权重重新调整RG和B,或者我build议切换到YIQ(或YCoCg,以避免量化噪声),以便您可以减less重要性的色度信息。
您现在可以使用这些稀疏归一化向量中的两个的点积作为相似性度量。 具有最大点积的图像对在结构上会非常相似。 这具有稍微抵抗resize,色调移位和水印的益处,并且实际上很容易实现和紧凑。
您可以通过增加或减lessk来折衷存储和准确性。
对于这种分类问题,通过单个数字分数进行sorting将是棘手的。 如果你仔细想想,它将需要图像只能沿着一个坐标轴“改变”,但是不能。 这就是为什么你需要一个向量的function。 在Haar小波情况下,其大约在图像中最尖锐的不连续处发生。 你可以计算两个图像之间的距离,但是因为你拥有的只是一个距离度量,所以线性sorting无法expression三个图像的“三angular形”,这三个图像的距离都是相等的。 (即想象一下全是绿色的图像,全是红色的图像和全是蓝色的图像)。
这意味着,对于您的问题的任何真正的解决scheme将需要O(n ^ 2)操作您的图像的数量。 而如果可以线性化度量,则可以只需要O(n log n),或者如果该度量适合于例如基数sorting,则可以是O(n)。 也就是说,你不需要花O(n ^ 2),因为在实践中你不需要筛选整个集合,你只需要find比某个阈值更近的东西。 因此,通过应用多种技术之一来划分稀疏向量空间,您可以获得更快的渐进性,以find比每个图像天真地比较每个图像更“类似于给定阈值”问题的图像,从而为您提供你可能需要…如果不是你所要求的。
无论如何,我在几年前使用这个function时,尽量减less我存储的不同纹理的数量,但在这个空间中也有很多研究噪音显示其功效(在这种情况下比较它更直观的直方图分类forms):
如果你需要更好的检测精度,minHash和tf-idfalgorithm可以和Haar小波(或直方图)一起使用,以更强大地处理编辑:
http://cmp.felk.cvut.cz/~chum/papers/chum_bmvc08.pdf
最后,斯坦福有一个基于这种方法更奇特的变体的图像search,基于从小波更多的特征提取来find图像的旋转或缩放部分等,但这可能超出了你的工作量我想做。
http://wang14.ist.psu.edu/cgi-bin/zwang/regionsearch_show.cgi
我实现了一个非常可靠的algorithm,称为快速多分辨率图像查询 。 我的(古老的,无人维护的)代码就在这里 。
快速多分辨率图像查询所做的是根据YIQ色彩空间将图像分成3个部分(匹配差异比RGB更好)。 然后使用小波algorithm对图像进行本质压缩,直到只有每个颜色空间中最显着的特征可用。 这些点存储在一个数据结构中。 查询图像经历相同的过程,查询图像中的突出特征与存储数据库中的特征相匹配。 越匹配,图像越相似。
该algorithm通常用于“通过草图查询”function。 我的软件只允许通过URLinput查询图像,所以没有用户界面。 不过,我发现它非常适合将缩略图与大图像进行匹配。
比我的软件更令人印象深刻的是检索器 ,它可以让你尝试使用Flickr图像作为源的FMIQalgorithm。 很酷! 尝试通过草图或使用源图像,你可以看到它的工作。
一张图片有很多特征,所以除非你把自己缩小到一个平均亮度,否则你正在处理一个n维问题空间。
如果我要求你给世界上的城市分配一个整数,那么我可以判断哪一个是接近的,结果不会很好。 例如,您可以select时区作为您的单个整数,并在某些城市获得良好的效果。 然而,北极附近的城市和南极附近的另一个城市即使位于地球的两端,也可能处于同一时区。 如果我让你使用两个整数,你可以得到很好的经纬度的结果。 问题是相同的图像相似性。
总而言之,有algorithm试图将相似的图像聚集在一起,这实际上是你要求的。 这是当您使用Picasa进行面部检测时发生的情况。 即使在识别任何脸部之前,它也会将相似的脸部聚拢在一起,以便通过一组相似的脸部并使其大部分具有相同的名称。
还有一种称为“主成分分析”的技术,可以将n维数据减less到任何较小的维数。 所以具有n个特征的图片可以被缩减为一个特征。 但是,这仍然不是比较图像的最佳方法。
有一个C库(“libphash” – http://phash.org/ ),它将计算图像的“感知哈希”,并通过比较哈希来检测相似的图像(所以您不必比较每个图像直接对付其他图像),但不幸的是,当我尝试它时,似乎并不是很准确。
你必须决定什么是“相似的”。 对比? 色调?
是一幅“相似”的图片颠倒了吗?
我敢打赌,你可以find很多“closures电话”,将图像分解成4×4块,并获得每个网格单元的平均颜色。 你每个图像有十六个分数。 要判断相似性,你只需要做一个图像差异的平方和。
我不认为一个单一的散列是有意义的,除非它是针对像色调,亮度或对比度这样的单一概念。
这是你的想法:
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.重量绿色最高,然后红色,然后蓝色匹配人类的视觉敏感度。
在networking服务的时代,你可以尝试http://tineye.com
问题好的方法来识别相似的图像? 似乎为您的问题提供了一个解决scheme。
我假设其他重复图像search软件对图像执行FFT,并将不同频率的值存储为vector:
Image1 = (u1, u2, u3, ..., un) Image2 = (v1, v2, v3, ..., vn)
然后可以通过计算两个图像的权重向量之间的距离来比较两个图像的相等性 :
distance = Sqrt( (u1-v1)^2 + (u2-v2)^2 + (u2-v3)^2 + ... (un-vn)^2);
一种解决scheme是对执行气泡分类所需的每一对图片执行RMS / RSS比较。 其次,您可以对每个图像执行一次FFT ,并执行一些轴平均,以检索每个图像的单个整数,您将用作索引进行sorting。 您可以考虑在原始版本(25%,10%)上进行任何比较,具体取决于您select忽略的差异多less以及您需要多less加速。 让我知道这些解决scheme是否有趣,我们可以讨论或者我可以提供示例代码。
大多数现代的方法来检测近邻重复图像检测使用有趣的点检测和描述这些点周围的描述符。 通常使用SIFT 。 然后,可以将描述符进行细分,并将群集用作视觉词汇词汇表。
因此,如果我们看到两幅图像的常见视觉词汇与这些图像的所有视觉词汇的比例,则可以估计出图像之间的相似性。 有很多有趣的文章。 其中之一是近乎重复的图像检测:minHash和tf-idf加权
例如,使用IMMI扩展和IMMI,可以检查如何测量图像之间的相似度的许多不同方法: http : //spl.utko.feec.vutbr.cz/en/component/content/article/46-image-processing-extension-换rapidminer -5-
通过定义一些阈值并select一些方法可以测量相似度。