В opencv как получить список сегментированных регионов



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

  col = cv2.imread("in.jpg",1)
  col=cv2.resize(col,(width,height),interpolation=cv2.INTER_CUBIC)
  res=cv2.pyrMeanShiftFiltering(col,20,45,3)

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

1 1 0 2 1 
1 0 0 2 1
0 0 2 2 1

Я хотел бы получить такой результат, как

1 1 0 0 0
1 0 0 0 0
0 0 0 0 0
,
0 0 1 0 0 
0 1 1 0 0
1 1 0 0 0
,
0 0 0 1 0 
0 0 0 1 0
0 0 1 1 0
,
0 0 0 0 1 
0 0 0 0 1
0 0 0 0 1

Таким образом, это маска для каждой группы одинаковых значений, которые связаны. Может быть, это как-то связано с функцией засыпки? Я могу видеть это, возможно, путем циклического перебора каждого пикселя, а затем заливки и сравнения, чтобы увидеть, если этот набор пикселей уже установлен, может работать, но это кажется очень дорогим способом, так что есть что-то быстрее? О И вот пример изображения res после запуска кода здесь

147   1  

1 ответ:

Вот один подход с cv2.connectedComponents -

def list_seg_regs(a): # a is array
    out = []
    for i in np.unique(a):
        ret, l = cv2.connectedComponents((a==i).astype(np.uint8))
        for j in range(1,ret):
            out.append((l==j).astype(int)) #skip .astype(int) for bool
    return out

Пробный прогон -

In [53]: a = np.array([
    ...:    [1, 1, 0, 2, 1],
    ...:    [1, 0, 0, 2, 1],
    ...:    [0, 0, 2, 2, 1]])

In [54]: out = list_seg_regs(a)

In [55]: out[0]
Out[55]: 
array([[0, 0, 1, 0, 0],
       [0, 1, 1, 0, 0],
       [1, 1, 0, 0, 0]])

In [56]: out[1]
Out[56]: 
array([[1, 1, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0]])

In [57]: out[2]
Out[57]: 
array([[0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1],
       [0, 0, 0, 0, 1]])

In [58]: out[3]
Out[58]: 
array([[0, 0, 0, 1, 0],
       [0, 0, 0, 1, 0],
       [0, 0, 1, 1, 0]])
    Ничего не найдено.

Добавить ответ:
Отменить.