图像相似度比较

45

我最初在cstheory.stackexchange.com 上问了这个问题,但被建议将其移动到stats.stackexchange.com

是否存在一种算法可以返回两幅位图图像之间的相似度度量?通过“类似”,我指的是人们会说这两个图像是从同一张照片中修改而来。例如,该算法应该告诉我们以下三幅图像是相同的(原始图像、位置移动、缩小)。

相同

enter image description here enter image description here enter image description here

我不需要检测扭曲或翻转的图像。我也不需要检测是否为不同方向的同一对象。

不同

enter image description here enter image description here

我想使用此算法来防止我的网站上的垃圾邮件。我注意到垃圾邮件发送者懒得更改其垃圾邮件图像。它不仅限于脸部。我已经知道已经有许多出色的面部识别算法。垃圾邮件图像可以是任何东西,从URL到足球场到裸体身体。


2
这给了我一个非常好的反图灵测试的想法(我讨厌CAPTCHA)。 - pathikrit
总是有实心黑边吗? - meaning-matters
我一直在使用https://rapidapi.com/apigeek/api/image-diff4来检查重复上传。您可以传递两个URL以检查两个图像是否相似。 - Learning C
7个回答

25

在stackoverflow上有一篇关于图像相似算法的讨论。如果不需要检测扭曲或翻转的图像,则直方图方法可能足够,只要图像裁剪不太严重。


11
您可以使用现有的深度学习架构(如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生成特征的参考资料? - Sundeep Pidugu
这应该会对你有所帮助 https://github.com/kanvesh/DataMining/blob/master/image_similarity.ipynb - Anvesh K

5

亚马逊推出了一个名为 Rekognition 的新API,它可以比较两张图片的面部相似度。该API返回每张脸与其他脸的相似度百分比以及每个脸的边界框。

Rekognition还包括人脸分析API(返回性别、近似年龄和其他相关的面部细节)和对象场景检测API(返回图像中物体的标签)。


4

计算图像相似度的一种优秀技术是"平均结构相似度"。

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))

3
如果你只是想进行图像相似度比较,那么这是一件事情;但如果要进行面部相似度比较,则不同。两个非常不同的人可能出现在相同的背景中,而图像相似度分析显示它们是相同的,而同一个人可能在两个不同的场景中被拍摄,相似度分析却显示它们是不同的。
如果您需要进行面部分析,您应该搜索特定于此的算法。计算相对眼睛、鼻子和嘴巴的大小和位置通常在这种类型的分析中完成。

3

使用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

参考资料:如何在Ubuntu上从JPEG或其他图像创建YUV422帧


1
强大的哈希函数可以做到这一点。但是在这个领域仍然有很多研究正在进行中。我不确定是否已经有可用的原型。

希望能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接