# cv2.EMD() 简单解读

https://samvankooten.net/2018/09/25/earth-movers-distance-in-python/

https://gist.github.com/svank/6f3c2d776eea882fd271bba1bd2cc16d

https://blog.csdn.net/wangdonggg/article/details/32329879

## 函数定义：

float cv::EMD	(
InputArray	signature1,	# 特征1 size1
InputArray	signature2,	# 特征2 size2
int 		distType,
# 使用的度量方式：
# cv2.DIST_USER : 用户自定义距离（即下一个参数，cost_matrix）
# cv2.DIST_L1: distance = |x1-x2| + |y1-y2|
# cv2.DIST_L2: 欧式距离
# cv2.DIST_C: distance = max(|x1-x2|,|y1-y2|)
# cv2.DIST_L12: L1-L2 metric: distance = 2(sqrt(1+x*x/2) - 1))
InputArray 	cost_matrix,	# 用户自定义度量方式 size1 * size2
float		lowerBound = 0,	# 一般来说不用，没搞懂
OutputArray	flow	# 流矩阵 size1 * size2
Return		cost	# cost = flow * cost_matrix.sum()
)

import cv2
import numpy
import torch

a = torch.Tensor([1, 2, 3, 4, 5]).view(-1, 1).numpy()
b = torch.Tensor([2, 3, 4, 5, 1]).view(-1, 1).numpy()

# 归一化，有无归一，结果都一样。
# a = a/a.sum(0)
# b = b/b.sum(0)

cost_matrix = torch.ones([5,5]).numpy()
print(a)
print(b)
print(cost_matrix)

cost, _, flow = cv2.EMD(a, b, cv2.DIST_USER, cost_matrix)
print(cost)
print(flow)
posted @ 2021-12-02 10:57  SethDeng  阅读(776)  评论(0编辑  收藏  举报