作者|奋发的菜鸟酱@知乎 来源|https://zhuanlan.zhihu.com/p/138107999加入极市专业CV交流群,与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度 等名校名企视觉开发者互动交流!
同时提供每月大咖直播分享、真实项目需求对接、干货资讯汇总,行业技术交流。关注 极市平台 公众号 ,回复 加群,立刻申请入群~
本文整理了常见的距离算法和相似度(系数)算法,并比较了欧氏距离和余弦距离间的不同之处。
1、常见的距离算法
1.1 欧几里得距离(Euclidean Distance) 在数学中,欧几里得距离或欧几里得度量是欧几里得空间中两点间“普通”(即直线)距离。使用这个距离,欧氏空间成为度量空间。相关联的范数称为欧几里得范数。Euclidean Distance是一个通常采用的距离定义,它是在m维空间中两个点之间的真实距离。代码:>>> pdist = nn.PairwiseDistance(p=2)
>>> input1 = torch.randn(100, 128)
>>> input2 = torch.randn(100, 128)
>>> output = pdist(input1, input2)
1.2 Earth Mover's Distance (EMD距离)和欧式距离一样,它们都是一种距离度量的定义、可以用来测量某两个分布之间的距离。EMD主要应用在图像处理和语音信号处理领域。EMD问题通俗解释: Earth Move翻译过来是搬土,指把P位置的m个坑的土,用最小的代价搬到Q位置的n个坑中,dij是pi到qj两个坑的距离,fij是从pi搬到qj的土量,则WORK工作量就是要最小化的目标。线性规划求解出fij后,再用fij对WORK作个归一化,就得到了EMD。EMD 实际上是线性规划中运输问题的最优解。EMD具体定义可参考:http://homepages.inf.ed.ac.uk/rbf/CVonline/LOCAL_COPIES/RUBNER/emd.htm
C代码包: emd.h, emd.c, emd.i
OpenCV:实现了EMD api,
pip install --upgrade setuptools
pip install numpy Matplotlib
pip install opencv-python
import numpy as np
import cv
#p、q是两个矩阵,第一列表示权值,后面三列表示直方图或数量
p=np.asarray([[0.4,100,40,22],
[0.3,211,20,2],
[0.2,32,190,150],
[0.1,2,100,100]],np.float32)
q=np.array([[0.5,0,0,0],
[0.3