Различия в производительности между bwlabeln на Matlab и skimage.measure.label на Python? - PullRequest
0 голосов
/ 09 июля 2020

В настоящее время я преобразую программу Matlab, которая выполняет анализ изображений, в Python. Одна из специальных c частей программы использует bwlabeln для маркировки различных компонентов в трехмерной матрице с последовательно увеличивающимися метками. Мне удалось найти очень похожую функцию в пакете skimage.measure под названием label, которая, по сути, делает то же самое. Однако я обнаружил, что при использовании входных матриц одинакового размера и типа данных в обеих программах bwlabeln в Matlab работает значительно быстрее (почти в 4 раза быстрее), чем метка в Python.

Мне было интересно, что за причина в этом, и есть ли способ ускорить код Python или улучшить производительность?

В обеих функциях я использую 26 подключенных окрестностей, которые, похоже, работают по умолчанию, но я дополнительно указал в качестве аргумента на всякий случай.

1 Ответ

0 голосов
/ 11 июля 2020

алгоритм scikit-image может маркировать массивы целых чисел ie с большим количеством значений, чем 0 и 1. Следовательно, это другой алгоритм, чем алгоритм Matlab, который ограничен только 0 и 1 (False и True ). Вы можете использовать алгоритм label из scipy.ndimage, который действительно в 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)
...