Как я могу подсчитать количество черных пробелов в изображении scikit или mahotas?

у меня есть такое изображение:

звезда

после того, как я скелетонизирую его с помощью функции скелетонирования изображения scikit

from skimage import morphology
out = morphology.skeletonize(gray>0)

введите здесь описание изображения

Есть ли способ подсчета количества черных пробелов? (на этой картинке шесть) кроме фона в scikit-image или mahotas?


person postgres    schedule 06.01.2014    source источник


Ответы (2)


С этим вводом:

введите сюда код

Ты можешь сделать:

>>> from skimage import morphology
>>> import numpy as np
>>> from scipy.misc import imread
>>> im = imread("Bju1h.png")
>>> im = im > 0
>>> np.unique(morphology.label(im))
array([0, 1, 2, 3, 4, 5, 6, 7])
>>> num_components = len(np.unique(morphology.label(im))) - 2
>>> num_components
6

Я вычитаю 2, чтобы игнорировать компонент фона и компонент переднего плана/линии. Из вашего исходного изображения вы можете пропустить шаг скелетирования и просто запустить его с помощью im = gray > 0, так как широкий передний план/линия все равно будет помечен как один компонент.

person YXD    schedule 06.01.2014
comment
Есть ли у вас какие-либо предложения, почему я получаю: [0 1], num_components: 2; Я пробовал и с другими изображениями. Я скелетонизировал изображение, потому что оно мне нужно для других вещей. - person postgres; 07.01.2014
comment
Я не понимаю, что вы имеете в виду под У вас есть какие-либо предложения, почему я получаю: [0 1], num_components: 2;. - person YXD; 07.01.2014
comment
Я не понимаю, почему после скелетонизации я получаю всегда [0 1], num_components: 2, а до этого работает хорошо! Мне нужен номер компонентов после скелетонирования! - person postgres; 07.01.2014
comment
правильно Проблема в соединении пикселей. Если вы посмотрите, как label определяет, связаны ли пиксели, если вы выберете 8-соединенные области, они будут перетекать через тонкие зубчатые границы, а если вы выберете 4-соединенные области, вы получите слишком много областей, так как для переднего плана будет несколько меток. Эта проблема не проявлялась во входных данных, которые я использовал выше, поскольку изначально изображение было увеличено и сжато в формате jpeg. Я могу опубликовать выдумку, чтобы обойти это, но... - person YXD; 07.01.2014
comment
...вы должны просто посчитать компоненты перед операцией скелетирования, чтобы избежать хлопот. - person YXD; 07.01.2014
comment
Кроме того, на опубликованном вами изображении большинство черных пикселей не полностью черные, что вызывает проблемы на этапе пороговой обработки/скелетирования. Я думаю, что это вызвано, по крайней мере частично, сжатием jpeg - лучше всего сохранять в формате PNG. - person YXD; 07.01.2014
comment
Если я использую фоновое вычитание для решения шага пороговой/скелетонизации вместо изменения файла формата? Имеет ли это смысл? scikit-image.org/docs/dev/auto_examples/ - person postgres; 09.01.2014
comment
Вы также можете выполнить обнаружение краев (Собеля с соответствующей сигмой) + пороговое значение краев + расширение, а затем подсчитать области меток - это может быть немного более надежным. - person Stefan van der Walt; 13.01.2014

Решение только с scipy.ndimage

from  scipy import ndimage as nd
from matplotlib import pyplot as plt

star = nd.imread('/home/jeanpat/Images/star.jpg')
star = star[:,:,0]
thr = star < 120
anti = star >119
mask = nd.morphology.binary_fill_holes(thr)

lab, n = nd.label(anti*mask)
plt.title(str(n)+' objects detected')
plt.imshow(lab)
plt.show()

введите здесь описание изображения

person Jean-Pat    schedule 19.03.2014