Matlab 上的 bwlabeln 和 Python 上的 skimage.measure.label 之间的性能差异?

Performance differences between bwlabeln on Matlab and skimage.measure.label on Python?

我目前正在将执行图像分析的 Matlab 程序转换为 Python。该程序的一个特定部分利用 bwlabeln 来标记 3D 矩阵中的各个组件,标签顺序递增。我能够在名为 label 的 skimage.measure 包中找到一个非常相似的函数,它基本上做完全相同的事情。但是,我发现当在两个程序之间使用相同大小和数据类型的输入矩阵时,Matlab 上的 bwlabeln 运行速度明显快于标签 Python.

(几乎快 4 倍)

我想知道这是什么原因,是否有任何方法可以加快 Python 代码或提高性能?

在这两个函数上,我都使用了 26 个相连的社区,这两个社区似乎都是默认情况下使用的,但我进一步指定为一个参数只是为了确定。

scikit-image 算法能够标记整数数组,即具有比 0 和 1 更多的值。因此,它是一种不同于 Matlab 算法的算法,后者仅限于 0 和 1(假和真).您可以使用 scipy.ndimage 中的 label 算法,它在下面定义的二进制图像上确实快 4 倍,因此您应该能够将 Matlab 的速度与此函数相匹配。

In [1]: from scipy import ndimage                                               

In [2]: from skimage import measure                                             

In [3]: from skimage import data                                                                                             

In [5]: img = data.binary_blobs(length=256, blob_size_fraction=0.25, n_dim=3)   

In [6]: %timeit labels = ndimage.label(img)                                     
161 ms ± 2.08 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [7]: %timeit labels = measure.label(img)                                     
629 ms ± 6.07 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)