Использование regionprops в Python

1

Я пытаюсь анализировать полутоновую TIFF стеку, в которых данный кадр будет выглядеть как это. Я фильтрую его (используя размытие по Гауссу), а затем бинаризую его (используя метод Otsu для порога).

MATLAB, который отлично работает:

image_conncomp = bwconncomp(image_binary); # entire stack is held in image_binary

for i=1:image_conncomp.NumObjects
    object_size = length(image_conncomp.PixelIdxList{i});
end

Каждое белое пятно в примере изображения подбирается, а его объем (в пикселях) довольно точно задается object_size.

Код Python:

from skimage import measure

labels = measure.label(image_binary, background=1) # same image_binary as above
propsa = measure.regionprops(labels)

for label in propsa:
    object_size = len(label.coords)

Кажется, что код Python работает прилично... кроме того, что большинство обнаруженных объектов будут иметь object_size от 1 до 200, а затем пара будет иметь размер в несколько тысяч пикселей.

Каковы эти функции по-разному? Я был бы счастлив попробовать другой подход в Python, чтобы получить размеры вычислений, но я изо всех сил пытался найти еще один. Было бы здорово иметь версию этого кода на Python, если бы я мог найти хорошую замену функции Matlab bwconncomp.

Изображение 174551

  • 0
    Вы смотрели на результат measure.label ?
  • 0
    Я, честно говоря, не понимаю вывод в его сыром виде. Он должен маркировать объекты, которые он распознает, но не уверен точно, как он это делает
Показать ещё 1 комментарий
Теги:
image-processing
scikit-image

1 ответ

1

Что-то вроде этого?

from skimage.io import imread, imshow
from skimage.filters import gaussian, threshold_otsu
from skimage import measure
import matplotlib.pyplot as plt

original = imread('https://i.stack.imgur.com/nkQpj.png')
blurred = gaussian(original, sigma=.8)
binary = blurred > threshold_otsu(blurred)
labels = measure.label(binary)

plots = {'Original': original, 'Blurred': blurred, 
         'Binary': binary, 'Labels': labels}
fig, ax = plt.subplots(1, len(plots))
for n, (title, img) in enumerate(plots.items()):
    cmap = plt.cm.gnuplot if n == len(plots) - 1 else plt.cm.gray
    ax[n].imshow(img, cmap=cmap)
    ax[n].axis('off')
    ax[n].set_title(title)
plt.show(fig)

props = measure.regionprops(labels)
for prop in props:
    print('Label: {} >> Object size: {}'.format(prop.label, prop.area))

Выход:

Изображение 174551

Label: 1 >> Object size: 37
Label: 2 >> Object size: 66
Label: 3 >> Object size: 1
  • 0
    Это прекрасно работает для измерения площади. Тем не менее, я ищу объем. Как правило, стек будет иметь 34 кадра, аналогичных приведенному выше образцу изображения. Объекты будут отображаться более чем в одном кадре, но не во всех - так что мне нужно смотреть на весь стек одновременно, чтобы получить объем. Чтобы измерить объем, я просто хочу посчитать количество пикселей, найденных в объекте
  • 0
    В этом случае вам нужно зациклить стек и вычислить объем как сумму площадей областей, которые соответствуют одному и тому же объекту.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню