python - 如何使用 opencv 计算 2 个 numpy 数组的 "EMD",即 "histogram"?

标签 python opencv numpy histogram earthdistance

由于我是 opencv 新手,我不知道如何使用 cv.CalcEMD2使用 numpy 数组的函数。
我有两个数组:

a=[1,2,3,4,5]  
b=[1,2,3,4]

如何将 numpy array 传输到 CVhistogram 以及从 Cvhistogram 传输到函数参数 signature

我希望任何回答问题的人都能通过提供的解决方案解释任何使用过的 opencv 函数。

“EMD”== earth mover's distance .

更新:-
另外,如果有人能告诉我如何设置 cv.CalcEMD2 将会很有帮助参数即 "signature" 使用 numpy 数组!!

注:-
* 对于那些可能对此问题感兴趣的人,这个答案需要更多的测试。

最佳答案

您必须根据权重和坐标来定义数组。如果你有两个数组 a = [1,1,0,0,1] 和 b = [0,1,0,1] 表示一维直方图,那么 numpy 数组应该如下所示:

a = [[1 1]
     [1 2]
     [0 3]
     [0 4]
     [1 5]]

b = [[0 1]
     [1 2]
     [0 3]
     [1 4]]

请注意,行数可以不同。列数应为维度 + 1。第一列包含权重,第二列包含坐标。

下一步是将数组转换为 CV_32FC1 Mat,然后再将 numpy 数组作为签名输入到 CalcEMD2 函数。代码如下所示:

from cv2 import *
import numpy as np

# Initialize a and b numpy arrays with coordinates and weights
a = np.zeros((5,2))

for i in range(0,5):
    a[i][1] = i+1

a[0][0] = 1
a[1][0] = 1
a[2][0] = 0
a[3][0] = 0
a[4][0] = 1

b = np.zeros((4,2))

for i in range(0,4):
    b[i][1] = i+1

b[0][0] = 0
b[1][0] = 1
b[2][0] = 0
b[3][0] = 1    

# Convert from numpy array to CV_32FC1 Mat
a64 = cv.fromarray(a)
a32 = cv.CreateMat(a64.rows, a64.cols, cv.CV_32FC1)
cv.Convert(a64, a32)

b64 = cv.fromarray(b)
b32 = cv.CreateMat(b64.rows, b64.cols, cv.CV_32FC1)
cv.Convert(b64, b32)

# Calculate Earth Mover's
print cv.CalcEMD2(a32,b32,cv.CV_DIST_L2)

# Wait for key
cv.WaitKey(0)

注意 CalcEMD2 的第三个参数是欧氏距离 CV_DIST_L2。第三个参数的另一个选项是曼哈顿距离 CV_DIST_L1。

我还想提一下,我用 Python 编写了计算两个 2D 直方图的 Earth Mover 距离的代码。您可以找到此代码 here .

关于python - 如何使用 opencv 计算 2 个 numpy 数组的 "EMD",即 "histogram"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15706339/

相关文章:

python - 在 MATLAB 中进行这种 pythonic 向量化赋值的等效方法是什么?

c++ - 使用 emcc 将 C++ 代码编译为 WASM 的问题

python - Python 中的 FFT : formatting 1-D diffraction Fourier transform

python - 生成分布在单位球体表面的点的随机样本

python - 平滑离散数据集

python - 通过重用代码和传递成员名称来运行测试来减少行数

python - 如何使用 scikit-image 和/或 PIL 将 ProPhoto RGB 色彩空间转换为 RGB?

python - OpenCV TypeError:参数 'src' 的预期 cv::UMat - 这是什么?

python - 由于一维尺寸更好,程序会吐出轴错误,是因为我最终混合了吗?

Python:函数执行后不保存变量的值