Я работаю над скриптом сегментации, который фильтрует сегменты на основе размера сегмента (площади) и общей интенсивности пикселей в каждом сегменте.

Я понял, как удалить сегменты в зависимости от площади, следуя ответу в этом посте:

Возврат определенных индексов меток numpy для изображения

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

Надеюсь, этот пример показывает, чего я пытаюсь достичь:

import numpy as np
from scipy import ndimage
A = np.array([

      [0, 0, 0, 0, 0, 0, 2, 2, 0, 0],
      [0, 2, 7, 3, 0, 0, 0, 0, 0, 0],
      [0, 0, 4, 2, 0, 0, 0, 0, 0, 0],
      [0, 0, 2, 0, 0, 0, 0, 1, 0, 0],
      [0, 0, 0, 0, 0, 0, 2, 3, 0, 0],
      [0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
      [0, 0, 0, 5, 0, 0, 0, 0, 0, 0],
      [0, 0, 4, 9, 3, 0, 0, 4, 0, 0],
      [0, 0, 0, 6, 0, 0, 0, 5, 3, 0],
      [0, 3, 0, 0, 0, 0, 0, 0, 0, 0],
])

Я могу получить сумму каждого сегмента, используя:

label_A, nb_labels = ndimage.label(A)
seg_sum = ndimage.sum(A, label_A, range(nb_labels + 1))
seg_sum

Output: array([ 0.,  4., 20.,  7., 27., 12.,  3.])`

Я хотел бы иметь возможность преобразовывать любые сегменты с суммой меньше 10 в нули. Любая помощь очень ценится. Спасибо

1
Landy 15 Апр 2020 в 21:19

1 ответ

Лучший ответ

Работая с seg_sum, вы можете проверить, какие компоненты в сумме меньше, чем 10, и использовать np.in1d, чтобы проверить, какие значения установить в ноль в A:

labels_to_zero = np.arange(1,len(seg_sum))[seg_sum[1:]>=10]
# array([2, 4, 5])

ix = np.in1d(label_A, labels_to_zero)

np.where(ix, A.ravel(), 0).reshape(A.shape)

array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 2, 7, 3, 0, 0, 0, 0, 0, 0],
       [0, 0, 4, 2, 0, 0, 0, 0, 0, 0],
       [0, 0, 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, 5, 0, 0, 0, 0, 0, 0],
       [0, 0, 4, 9, 3, 0, 0, 4, 0, 0],
       [0, 0, 0, 6, 0, 0, 0, 5, 3, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
1
yatu 15 Апр 2020 в 18:35