如何衡量两张图片之间的相似度?

数据挖掘 机器学习 k-均值 相似 图片
2021-10-14 08:18:48

我有猫和狗的两组图像。每组分别包含 2000 张猫和狗的图像。

我的目标是尝试使用 k-means 对图像进行聚类。

假设 image1 是x,而 image2 是 。y这里我们需要测量任意两个图像之间的相似度。测量两个图像之间的常用方法是什么?

1个回答

检查这个讲义!

好吧,有一些……让我们走吧:

给定两张图片 J[x,y]I[x,y](x,y)NN×M...

A - 用于模板匹配:

模板匹配是线性的,并且对旋转不是不变的(实际上甚至对它不具有鲁棒性),但它非常简单且对噪声(例如在低照度下拍摄的摄影中的噪声)具有鲁棒性。

您可以使用OpenCV 模板匹配轻松实现这些下面是定义 cv2.matchTemplate 使用的一些相似性度量(适用于比较 2 个相同大小的图像)的数学方程:

1 - 和平方差

Ssq=(n,m)NM×N(J[n,m]I[n,m])2

这可以归一化为

SsqJ[n,m]2×I[n,m]2

2 - 互相关

Ccrr=(n,m)NM×N(J[n,m]×I[n,m])2

这可以归一化为

CcrrJ[n,m]2×I[n,m]2

B - 图像描述符/特征检测器:

为图像开发了许多描述符,它们的主要用途是注册图像/对象并在其他场景中搜索它们。但是,它们仍然提供有关图像的大量信息,并用于瞳孔检测(用于同时进行眼睛检测和眼睛状态估计的联合级联框架),甚至似乎用于唇读(因为我无法引导您使用它)我不确定它是否已经发布)

它们检测图像中可以被视为特征的点(相关点),这些点的局部纹理甚至它们彼此之间的几何位置都可以用作特征。

您可以在斯坦福的图像处理课程中了解更多信息(查看 12,13 和 14 课程的讲义,如果您想继续研究计算机视觉,我建议您查看整个课程,也许还可以查看有关数字图像处理和计算机视觉的Rich Radke课程对于视觉效果,那里有很多信息对您尝试采用的这种辛勤工作的计算机视觉风格很有用)

1 - 筛选和冲浪:

这些是 Scale Invariant 方法,SURF 是 SIFT 的加速和开放版本,SIFT 是专有的。

2 - 简短、轻快和快速:

这些是二进制描述符,速度非常快(主要在带有 pop_count 指令的处理器上),并且可以以类似于 SIFT 和 SURF 的方式使用。此外,我使用简要特征作为面部地标检测模板匹配的替代品,在IPDKIPD分类器的速度和准确性上都没有损失,尽管我还没有发布任何它(这是只是对未来文章的增量观察,所以我认为分享没有害处)。

3 - 定向梯度直方图(HoG):

这是旋转不变的,用于人脸检测...

C - 卷积神经网络:

我知道您不想使用 NN,但我认为可以公平地指出它们非常强大,使用Triplet Loss训练 CNN对于学习用于聚类(和分类)的代表性特征空间非常有用。

查看Wesley 的 GitHub,了解它在面部识别中的强大功能,使用 Triplet Loss 获取特征,然后使用 SVM 进行分类。

此外,如果您的深度学习问题是计算成本,您可以轻松找到带有猫狗的预训练层

D - 检查以前的工作:

这场猫狗大战已经持续了很长时间...你可以在 Kaggle Competitions (Forum and Kernels) 上查看解决方案,猫和狗上有 2 个This OneThat One

E - 著名措施:

  • SSIM结构相似性指数
  • L2 范数(或欧几里得距离)
  • 马氏距离

F - 检查其他类型的功能

  • 猫和狗可以很容易通过耳朵和鼻子来识别......尺寸也是如此,但我的猫和狗一样大......所以使用尺寸并不是那么安全。

  • 但是您可以尝试将图像分割成动物和背景,然后尝试进行区域属性分析...

  • 另外,请检查此图像相似度指标工具包页面,它位于 C 语言中,但...

  • 检查这篇关于图像相似性的论文

  • 看看这个Stack Overflow 问题和这个Research Gate one

  • 如果你有时间,这本书在这里:Mark S. Nixon 的计算机视觉的特征提取和图像处理有很多关于这种过程的信息

  • 您可以尝试使用 Fisher 判别分析和 PCA 创建映射并使用 Mahalanobis 距离或 L2 范数进行评估