В 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 после запуска кода
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]])
Comments