什么样的算法可用来确定如果图像是"相同"或类似的,无论大小?
-
05-07-2019 - |
解决方案
这些算法通常是基于指纹的。指纹是一种相当小的数据结构,类似于长哈希码。但是,指纹功能的目标与哈希函数的目标相反。一个好的哈希函数应该为非常相似(但不相等)的对象生成非常不同的代码。相反,指纹功能应该为类似图像生成相同的指纹。
举个例子,这是一个(不是特别好)指纹功能:将图片大小调整为32x32平方,对颜色进行标准化和量化,将颜色数量减少到256个。然后,你有1024个图像的字节指纹。只需保留一张指纹表=> [图片网址列表]。当您需要查看与给定图像类似的图像时,只需计算其指纹值并找到相应的图像列表。容易。
有什么不容易 - 在实践中有用,指纹功能需要对作物,仿射变换,对比度变化等具有强大的功能。良好指纹功能的构建是一个单独的研究课题。通常他们是手动调整并使用大量的启发式(即使用关于典型照片内容的知识,关于EXIF中的图像格式/附加数据等)。
另一种变体是使用多个指纹功能,尝试应用每个指纹功能并组合结果。实际上,它类似于找到类似的文本。而不是“包词”图像相似性搜索使用“指纹袋”。并发现一个包中的元素与另一个包中的元素相同。如何提高搜索效率是另一个话题。
现在,关于文章/论文。我找不到一篇能够概述不同方法的好文章。我所知道的大多数公开文章都讨论了具体方法的具体改进。我可以建议检查这些:
“使用小波进行内容指纹识别”。本文是关于使用小波的音频指纹识别,但同样的方法可以适用于图像指纹识别。
PERMUTATION GROUPING: 音频智能哈希功能设计图像检索。关于地方敏感哈希的信息。
捆绑大规模部分重复Web图像搜索的功能。一篇非常好的文章,讨论了SIFT和捆绑功能以提高效率。它最后还有一个很好的参考书目
其他提示
FotoForensics网站的创建者发布了关于此主题的博客文章,它对我非常有用,并且显示的算法可能对您来说足够好,并且需要比小波和特征提取少得多的工作。
http:// www .hackerfactor.com /博客/的index.php?/archives/529-Kind-of-Like-That.html
aHash (也称为平均哈希值或平均哈希值)。这种方法将图像压缩为灰度8x8图像并设置64位 哈希基于像素的值是否大于 图像的平均颜色。
pHash (也称为“Perceptive Hash”)。该算法类似于aHash,但使用离散余弦变换(DCT)并基于比较 在频率而不是颜色值上。
dHash 与aHash和pHash一样,dHash实现起来非常简单,并且比任何权利都要准确得多。作为一个 实现,dHash几乎与aHash相同,但它执行 好多了。虽然aHash专注于平均值和pHash评估 频率模式,dHash跟踪渐变。
霍夫变换是一种非常古老的特征提取算法,您会发现它很有趣。我怀疑它是tinyeye使用的,但它是学习特征提取的一个好的,简单的起点。
还有滑动到一个简洁的谈话来自多伦多大学的一些人关于他们在 astrometry.net 上的工作。他们开发了一种算法,用于将夜空的伸缩图像与星形目录中的位置相匹配,以识别图像中的特征。这是一个比tinyeye试图解决的更具体的问题,但我希望他们谈论的很多基本想法都适用于更普遍的问题。
基于此, Igor Krivokon的答案似乎已经出现了。
他们可能正在进行傅立叶变换来表征图像的复杂性,以及用于表征色度分布的直方图,与区域分类算法配对,以确保类似的复杂和彩色图像不会错误地配对。不知道这是不是他们正在使用的东西,但似乎可以做到这一点。
查看此博文(不是我的)对于一个非常容易理解的算法的描述非常容易理解,这个算法看起来很简单。它基本上将相应的图片划分为非常粗糙的网格,按红色:蓝色和绿色:蓝色比例对网格进行排序,并检查排序是否相同。这自然只适用于彩色图像。
使用更高级的算法,专业人士最有可能获得更好的结果。正如该博客评论中所提到的,一种领先的方法似乎是小波。
如何将图片大小调整为标准小尺寸并检查SSIM或仅限亮度的PSNR值?这就是我要做的。