2016-04-22 2 views
2

Я уже некоторое время был в тупике по этой проблеме и задавался вопросом, сможет ли кто-нибудь помочь. Итак, скажем, у меня есть двоичное изображение, как показано ниже, и я хотел бы подсчитать черные элементы (zero). Проблема в том, что я хочу знать количество элементов, связанных с «фоном» и «трапецией» в середине по отдельности, поэтому выведите два значения. Каким будет самый простой способ приблизиться к этому? Я пытался сделать это, не используя mask, но это возможно? У меня есть библиотеки numpy и scipy, если это помогает.Вычислите область двух отдельных геометрий в Python

enter image description here

+0

ручной работы NumPy решение будет зависеть от предположений о форме/число регионов ... – Benjamin

ответ

2

Вы можете использовать две функции из scipy.ndimage.measurements: label и find_objects.

Сначала вы инвертируете массив, потому что функция label считает ноль фоном.

inverted = 1 - binary_image_array 

Тогда вы называете label найти различные регионы:

labeled_array, num_features = scipy.ndimage.measurements.label(inverted) 

Таким образом, для этих конкретного массива, где вы уже знаете есть exactely два черные пятна, у вас есть два регионов в labeled_array.

+0

Так как доступ будет размер каждого сгустка? Использую ли я 'find_objects'? –

+1

Вы можете использовать что-то вроде этого: 'count = labeled_array [labeled_array == label_number] .astype (int) .sum()'. Это создаст логический массив, преобразует его в int и суммирует каждое событие. – heltonbiker

1

Очевидно, что быстрый подход является хорошим ответом.

Я думал, что вы можете работать с numpy.cumsum и numpy.diff, чтобы найти закрытую область.

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

Разница второго порядка затем находит места, где происходят прыжки, и вы остаетесь с «классифицированной» картой. Никакой гарантии, что это обобщает, просто идея.

a = numpy.zeros((10,10)) 
a[3:7,3:7] = 1 
a[4:6, 4:6] = 0 

y = numpy.cumsum(a, axis=0) 
x = numpy.cumsum(a, axis=1) 

yy= numpy.diff(y, n=2, axis=0) 
xx = numpy.diff(x, n=2, axis=1) 

numpy.dot(xx,yy) 

array([[ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 2., 2., 2., 2., 0., 0., 0.], 
     [ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.], 
     [ 0., 0., 0., 2., 4., 4., 2., 0., 0., 0.], 
     [ 0., 0., 0., 2., 2., 2., 2., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]) 
Смежные вопросы