图像相似度比较

Posted

技术标签:

【中文标题】图像相似度比较【英文标题】:Image similarity comparison 【发布时间】:2011-08-09 11:50:26 【问题描述】:

我最初在 cstheory.stackexchange.com 上提出了这个问题,但被建议将其移至 stats.stackexchange.com。

是否有现有算法可以返回两个位图图像之间的相似性度量?所谓“相似”,我的意思是人类会说这两张图片是从同一张照片中修改而来的。例如,算法应该说以下 3 张图像是相同的(原始的、位置偏移的、缩小的)。

相同

我不需要检测扭曲或翻转的图像。我也不需要检测它是否是不同方向的同一个物体。

不同

我想使用此算法来防止我网站上的垃圾邮件。我注意到垃圾邮件发送者懒得更改他们的垃圾邮件图片。它不仅限于面孔。我已经知道那里已经有很多很棒的面部识别算法了。垃圾图片可以是任何东西,从 URL 到足球场再到裸体。

【问题讨论】:

这给了我一个反向图灵测试的好主意(我讨厌验证码) 总是有纯黑色边框吗? 我一直在使用 rapidapi.com/apigeek/api/image-diff4 检查重复上传。您可以传递两个 URL 来检查两个图像是否相似。 【参考方案1】:

在堆栈溢出时讨论了image similarity algorithms。由于您不需要检测扭曲或翻转的图像,因此如果图像裁剪不太严重,直方图方法可能就足够了。

【讨论】:

【参考方案2】:

您可以使用 VGG 等现有深度学习架构从图像中生成特征,然后使用余弦相似度等相似度度量来查看两张图像是否本质上相同。

整个管道非常容易设置,您无需了解神经网络架构(您可以将其视为黑匣子)。此外,这些特征非常通用,可用于查找任何类型的对象之间的相似性,而不仅仅是面部。

这里有几个博客可以引导您完成整个过程。 http://blog.ethanrosenthal.com/2016/12/05/recasketch-keras/ https://erikbern.com/2015/09/24/nearest-neighbor-methods-vector-models-part-1.html

【讨论】:

任何参考 VGG 来生成特征? 这应该可以帮助你github.com/kanvesh/DataMining/blob/master/…【参考方案3】:

亚马逊有一个名为 Rekognition 的新 API,可让您比较两张图像的面部相似性。该 api 返回每个人脸彼此之间的相似度百分比以及每个人脸的边界框。

Rekognition 还包括一个用于面部分析(返回性别、大致年龄和其他相关面部细节)和对象场景检测(返回图像内对象的标签)的 api。

【讨论】:

【参考方案4】:

计算图像相似度的重要技术之一是“mean structuresimilarity”。

import cv2
from skimage import compare_ssim


img = cv2.imread('img_1.png')
img_2 = cv2.imread('img_2.png')

print(compare_ssim(img, img_2))

【讨论】:

【参考方案5】:

如果您只想要图像相似度,那是一回事,而面部相似度则是另一回事。两个非常不同的人可能出现在同一背景中,图像相似性分析表明他们是相同的,而同一个人可能在两种不同的环境中被拍摄,相似性分析表明他们是不同的。

如果您需要进行面部分析,您应该搜索特定的算法。计算相对眼睛、鼻子和嘴巴的大小和位置通常在这种分析中完成。

【讨论】:

【参考方案6】:

使用https://github.com/Netflix/vmaf比较两组图像。

首先使用ffmpeg将图像转换为yuv422p,然后运行测试。注意分数差异。这可以用来判断图像是相似还是不同。对于这个示例,它们看起来都非常相似......

ffmpeg -i .\different-pose-1.jpg  -s 1920x1080 -pix_fmt yuv422p different-pose-1.yuv
ffmpeg -i .\different-pose-2.jpg  -s 1920x1080 -pix_fmt yuv422p different-pose-2.yuv
.\vmafossexec.exe yuv422p 1920 1080 different-pose-1.yuv different-pose-2.yuv vmaf_v0.6.1.pkl --ssim --ms-ssim --log-fmt json --log different.json
Start calculating VMAF score...
Exec FPS: 0.772885
VMAF score = 2.124272
SSIM score = 0.424488
MS-SSIM score = 0.415149

ffmpeg.exe -i .\same-pose-1.jpg  -s 1920x1080 -pix_fmt yuv422p same-pose-1.yuv
ffmpeg.exe -i .\same-pose-2.jpg  -s 1920x1080 -pix_fmt yuv422p same-pose-2.yuv
.\vmafossexec.exe yuv422p 1920 1080 same-pose-1.yuv same-pose-2.yuv vmaf_v0.6.1.pkl --ssim --ms-ssim --log-fmt json --log same.json
Start calculating VMAF score...
Exec FPS: 0.773098
VMAF score = 5.421821
SSIM score = 0.285583
MS-SSIM score = 0.400130

参考How can I create a YUV422 frame from a JPEG or other image on Ubuntu

【讨论】:

【参考方案7】:

稳健的哈希函数做到了。但在该领域仍有大量研究正在进行。我不确定是否已经有可用的原型。

希望对您有所帮助。

【讨论】:

以上是关于图像相似度比较的主要内容,如果未能解决你的问题,请参考以下文章

iOS图片相似度比较

文本、语音相似度算法

OpenCV进行图像相似度对比的几种办法

自动化:图像相似度比较,并标记不一样的地方

列举一些算法对照片图像进行相似度对比分析比较

计算两个数组之间余弦相似度的正确方法?