Получить список значений пикселей RGB каждого суперпикселя

У меня есть RGB-изображение размера (224,224,3). Я применил к нему суперпиксельную сегментацию с использованием алгоритма SLIC.

Следующим образом:

img= skimageIO.imread("first_image.jpeg")
print('img shape', img.shape) # (224,224,3)
segments_slic = slic(img, n_segments=1000, compactness=0.01, sigma=1) # Up to 1000 segments
segments_slic.shape
(224,224)

Количество возвращаемых сегментов:

np.max(segments_slic)
Out[49]: 595

От 0 до 595. Итак, у нас 596 суперпикселей (регионов).

Давайте посмотрим на segments_slic[0]

segments_slic[0]
Out[51]: 
array([ 0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,  1,
        1,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  2,  3,  3,  3,  3,  3,
        3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,  5,  5,
        5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,
        8,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9,
       10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 12, 12,
       12, 12, 12, 12, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14,
       14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 16, 16, 16,
       16, 16, 16, 16, 17, 17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18,
       18, 18, 18, 18, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 20, 20,
       20, 20, 20, 20, 20, 20, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21,
       21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23,
       23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 25, 25, 25, 25,
       25, 25, 25])

Что я хотел бы получить?

для каждой суперпиксельной области создайте два массива следующим образом:

1) Массив: содержит индексы пикселей, принадлежащих одному и тому же суперпикселю.

Например

superpixel_list[0] содержит все индексы пикселей, принадлежащих суперпикселю 0 .

superpixel_list[400] содержит все индексы пикселей, принадлежащих суперпикселю 400

2) superpixel_pixel_values ​​[0]: содержит значения пикселей (в RGB) пикселей, принадлежащих суперпикселю 0 .

Например, предположим, что пиксели 0, 24, 29, 53 принадлежат суперпикселю 0 . Тогда мы получим

superpixel[0]= [[223,118,33],[245,222,198],[98,17,255],[255,255,0]]# RGB values of pixels belonging to superpixel 0

Каков эффективный / оптимизированный способ сделать это? (Потому что у меня есть l набор данных изображений для зацикливания)

EDIT-1

def sp_idx(s, index = True):
     u = np.unique(s)
         if index:
     return [np.where(s == i) for i in u]
         else:
     return [s[s == i] for i in u]
     #return [s[np.where(s == i)] for i in u] gives the same but is slower
superpixel_list = sp_idx(segments_slic)
superpixel      = sp_idx(segments_slic, index = False)

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

Однако я получаю следующее:

superpixel_list[0]
Out[73]: 
(array([ 0,  0,  0,  0,  0,  1,  1,  1,  1,  1,  1,  2,  2,  2,  2,  2,  2,
         3,  3,  3,  3,  3,  3,  3,  4,  4,  4,  4,  4,  4,  4,  5,  5,  5,
         5,  5,  5,  5,  5,  6,  6,  6,  6,  6,  6,  6,  6,  7,  7,  7,  7,
         7,  7,  7,  8,  8,  8,  8,  8,  8,  8,  9,  9,  9,  9,  9,  9, 10,
        10, 10, 10, 10, 11, 11, 11, 11, 12, 12, 12, 12, 13, 13, 13]),
 array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5,
        6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6,
        7, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 0, 1,
        2, 3, 4, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2]))

Почему два массива?

Например, в суперпикселе [0] мы должны получить значения пикселей RGB каждого пикселя, на который воздействует суперпиксель 0, следующим образом: например, на пиксели 0, 24, 29, 53 воздействуют на суперпиксель 0, тогда:

superpixel[0]= [[223,118,33],[245,222,198],[98,17,255],[255,255,0]]

Однако когда я использую вашу функцию, я получаю следующее:

superpixel[0]
Out[79]: 
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, 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, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Спасибо за помощь

1 ответ

Решение

Может быть сделано с помощью np.where и результирующие показатели.

def sp_idx(s, index = True):
     u = np.unique(s)
     return [np.where(s == i) for i in u]

superpixel_list = sp_idx(segments_slic)
superpixel      = [img[idx] for idx in superpixel_list]
Другие вопросы по тегам