我想使用地球移动距离(Earth Movers Distance)来比较多张图片。
我比较了
鉴于这两种方法使用相同的直方图,它们应该提供相同或至少类似的结果。
问题在于,这两种方法提供的结果非常不同。但是,如果我在这两种方法中都传递我的图像的扁平版本,则结果非常相似。
上面的例子对于 emd_s 和 swd2 产生了类似的结果,对于 emd_s2 和 swd 也产生了类似的结果,尽管最后一组仍然有很大的不同,因为从技术上讲,emd_samples 应该基于直方图制作直方图。请保留 HTML 标记。
我比较了
scipy.stats.wasserstein_distance()
和 pyemd.emd_samples()
两种方法。据我所知,wasserstein_distance()
接受两个分布(即直方图),而 emd_samples()
接受一个1D值数组并为您计算直方图。鉴于这两种方法使用相同的直方图,它们应该提供相同或至少类似的结果。
问题在于,这两种方法提供的结果非常不同。但是,如果我在这两种方法中都传递我的图像的扁平版本,则结果非常相似。
是我的问题还是其中一种实现存在问题?
cat1 = skimage.io.imread("./cat1.jpg", as_grey=True).flatten().astype('float64')
cat2 = skimage.io.imread("./cat2.jpg", as_grey=True).flatten().astype('float64')
shuttle = skimage.io.imread("./shuttle.jpg", as_grey=True).flatten().astype('float64')
emd_s = np.array([[emd_samples(cat1, cat1, bins="fd"), emd_samples(cat1, cat2, bins="fd"), emd_samples(cat1, shuttle, bins="fd")],
[emd_samples(cat2, cat1, bins="fd"), emd_samples(cat2, cat2, bins="fd"), emd_samples(cat2, shuttle, bins="fd")],
[emd_samples(shuttle, cat1, bins="fd"), emd_samples(shuttle, cat2, bins="fd"), emd_samples(shuttle, shuttle, bins="fd")]])
pmf_cat1, bins_cat1 = np.histogram(cat1 , bins="fd")
pmf_cat2, bins_cat2 = np.histogram(cat2 , bins="fd")
pmf_shuttle, bins_shuttle = np.histogram(shuttle , bins="fd")
emd_s2 = np.array([[emd_samples(pmf_cat1, pmf_cat1, bins="fd"), emd_samples(pmf_cat1, pmf_cat2, bins="fd"), emd_samples(pmf_cat1, pmf_shuttle, bins="fd")],
[emd_samples(pmf_cat2, pmf_cat1, bins="fd"), emd_samples(pmf_cat2, pmf_cat2, bins="fd"), emd_samples(pmf_cat2, pmf_shuttle, bins="fd")],
[emd_samples(pmf_shuttle, pmf_cat1, bins="fd"), emd_samples(pmf_shuttle, pmf_cat2, bins="fd"), emd_samples(pmf_shuttle, pmf_shuttle, bins="fd")]])
swd = np.array([[wasserstein_distance(pmf_cat1, pmf_cat1), wasserstein_distance(pmf_cat1, pmf_cat2), wasserstein_distance(pmf_cat1, pmf_shuttle)],
[wasserstein_distance(pmf_cat2, pmf_cat1), wasserstein_distance(pmf_cat2, pmf_cat2), wasserstein_distance(pmf_cat2, pmf_shuttle)],
[wasserstein_distance(pmf_shuttle, pmf_cat1), wasserstein_distance(pmf_shuttle, pmf_cat2), wasserstein_distance(pmf_shuttle, pmf_shuttle)]])
swd2 = np.array([[wasserstein_distance(cat1, cat1), wasserstein_distance(cat1, cat2), wasserstein_distance(cat1, shuttle)],
[wasserstein_distance(cat2, cat1), wasserstein_distance(cat2, cat2), wasserstein_distance(cat2, shuttle)],
[wasserstein_distance(shuttle, cat1), wasserstein_distance(shuttle, cat2), wasserstein_distance(shuttle, shuttle)]])
上面的例子对于 emd_s 和 swd2 产生了类似的结果,对于 emd_s2 和 swd 也产生了类似的结果,尽管最后一组仍然有很大的不同,因为从技术上讲,emd_samples 应该基于直方图制作直方图。请保留 HTML 标记。
emd_samples()
函数来自哪里? - duhaime