Regionprops всегда находит один регион - python - PullRequest
0 голосов
/ 01 мая 2020

У меня есть изображение с несколькими шариками, и когда я использую regionprops, чтобы найти центроид и BB для каждого. Тем не менее, он всегда находит только 1 для всех из них. Более конкретно, я получаю результаты на левом изображении, но я хочу получить изображение на правом изображении: region_problem

Мой код:

            regions = regionprops(itk_label)

            fig, ax = plt.subplots()
            ax.imshow(itk_label, cmap=plt.cm.gray)

            i=0
            for props in regions:
                i=i+1
                print(str(i))
                y0, x0 = props.centroid

                ax.plot(x0, y0, '.r', markersize=5)

                minr, minc, maxr, maxc = props.bbox
                bx = (minc, maxc, maxc, minc, minc)
                by = (minr, minr, maxr, maxr, minr)
                ax.plot(bx, by, '-b', linewidth=1.0)

            ax.axis((0, 600, 600, 0))
            plt.show()     

Может кто-нибудь сказать мне что я делаю не так?

Забавно, что изображение справа также было создано мной в прошлом. Однако я не могу сделать это снова.

1 Ответ

0 голосов
/ 04 мая 2020

Вероятно, ваши функции имеют одинаковое значение метки. regionprops требует, чтобы ваши функции были помечены независимо, ie. 1, 2, 3, .... Вот пример:

В этом случае обе функции имеют значение метки 1, поэтому они измеряются так, как если бы они были одним объектом:

import numpy as np
from skimage import measure
from matplotlib import pyplot as plt

im = np.zeros((600, 600), dtype=int)

im[350:400, 350:400] = 1
im[510:530, 200:240] = 1

np.unique(im)
>>> array([0, 1])

plt.matshow(im)

regions = measure.regionprops(im)
for r in regions:
    plt.plot(*r.centroid[::-1], marker='x', color='r')

one feature

Если вы используете функцию measure.label, вы можете пометить отдельные элементы независимо ie. значения меток 1, 2:

plt.matshow(im)

labelled = measure.label(im)
np.unique(labelled)
>>> array([0, 1, 2])

regions = measure.regionprops(labelled)
for r in regions:
    plt.plot(*r.centroid[::-1], marker='x', color='r')

, и это дает желаемый результат.

labelled

...