我目前正在将一个执行图像分析的Matlab程序转换为Python。程序的一个特定部分使用bwlabeln以顺序递增的标签标记3D矩阵中的各种组件。我在skimage.measure包中找到了一个非常相似的函数,叫做label,它本质上做着完全相同的事情。然而,我发现,当在两个程序之间使用相同大小和数据类型的输入矩阵时,Matlab上的bwlabeln运行速度明显快于Python中的label(几乎快4倍(。
我想知道这是什么原因,是否有任何方法可以加快Python代码或提高性能?
在这两个函数中,我都使用了26个连通邻域,这两个邻域似乎都是默认的,但为了确定起见,我进一步指定了一个参数。
scikit图像算法能够标记整数数组,即值大于0和1的数组。因此,它与仅限于0和1(False和True(的Matlab算法不同。你可以使用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)