我最初在cstheory.stackexchange.com上提出了这个问题,但建议将其移至stats.stackexchange.com。
是否有现有的算法可以返回两个位图图像之间的相似性度量?通过“相似”,我的意思是人们会说这两幅图像是从同一张照片中改变的。例如,算法应该说以下3个图像是相同的(原始,位置偏移,收缩)。
我不需要检测扭曲或翻转的图像。我也不需要检测它是否是不同方向的同一个对象。
我想使用此算法来阻止我网站上的垃圾邮件。我注意到垃圾邮件发送者懒得改变他们的垃圾邮件图像。它不仅限于面孔。我已经知道那里已经有很多很棒的面部识别算法了。垃圾邮件图像可以是从URL到足球场到裸体的任何东西。
答案 0 :(得分:16)
在堆栈溢出时讨论image similarity algorithms。由于您不需要检测扭曲或翻转图像,因此直方图方法可能已足够,因为图像裁剪不会太严重。
答案 1 :(得分:6)
您可以使用现有的深度学习架构(如VGG)从图像生成要素,然后使用相似性度量(如余弦相似度)来查看两个图像是否基本相同。
整个管道很容易设置,你不需要了解神经网络架构(你可以像对待黑盒一样对待它)。此外,这些功能非常通用,可用于查找任何类型的对象之间的相似性,而不仅仅是面部。
以下是一些博客,引导您完成整个过程。 http://blog.ethanrosenthal.com/2016/12/05/recasketch-keras/ https://erikbern.com/2015/09/24/nearest-neighbor-methods-vector-models-part-1.html
答案 2 :(得分:4)
亚马逊有一个名为Rekognition的新API,它允许您比较两个图像的面部相似度。 api返回每个面相互之间的相似百分比以及每个面的边界框。
Rekognition还包括面部分析的api(返回性别,大致年龄和其他相关的面部细节)和对象场景检测(返回图像内的对象的标签)。
答案 3 :(得分:2)
如果你只想要图像相似性是一回事,那么面部相似性则是另一回事。两个非常不同的个体可能出现在相同的背景中,并且图像相似性的分析显示它们是相同的,而同一个人可以在两个不同的设置中拍摄并且相似性分析显示它们是不同的。
如果您需要进行面部分析,则应搜索特定于此的算法。通常在这种分析中计算相对的眼睛,鼻子和嘴巴的大小和位置。
答案 4 :(得分:2)
强大的哈希函数这样做。但是在该领域仍有很多研究正在进行中。我不确定是否已有可用的原型。
希望有所帮助。
答案 5 :(得分:2)
使用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
答案 6 :(得分:0)
“ 平均结构相似度”是计算图像相似度的一项很棒的技术。
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))