Моя цель - проследить чертежи, в которых есть много отдельных фигур, и разделить эти фигуры на отдельные изображения. Он черный на белом. Я совершенно новичок в numpy, opencv и amo; co - но вот моя текущая мысль:
- просмотр черных пикселей
- найден черный пиксель → водораздел
- найти границу водораздела (как многоугольник)
- продолжить поиск, но игнорировать точки в уже найденных границах
Я не очень хорошо разбираюсь в таких вещах, есть ли лучший способ?
Сначала я попытался найти прямоугольную ограничительную рамку результатов водораздела (это более или менее коллаж примеров):
from numpy import *
import numpy as np
from scipy import ndimage
np.set_printoptions(threshold=np.nan)
a = np.zeros((512, 512)).astype(np.uint8) #unsigned integer type needed by watershed
y, x = np.ogrid[0:512, 0:512]
m1 = ((y-200)**2 + (x-100)**2 < 30**2)
m2 = ((y-350)**2 + (x-400)**2 < 20**2)
m3 = ((y-260)**2 + (x-200)**2 < 20**2)
a[m1+m2+m3]=1
markers = np.zeros_like(a).astype(int16)
markers[0, 0] = 1
markers[200, 100] = 2
markers[350, 400] = 3
markers[260, 200] = 4
res = ndimage.watershed_ift(a.astype(uint8), markers)
unique(res)
B = argwhere(res.astype(uint8))
(ystart, xstart), (ystop, xstop) = B.min(0), B.max(0) + 1
tr = a[ystart:ystop, xstart:xstop]
print tr
Как-то, когда я использую исходный массив (a), похоже, что argwhere работает, но после водораздела (res) он просто выводит полный массив снова.
Следующим шагом может быть поиск пути многоугольника вокруг фигуры, но ограничивающая рамка будет великолепна на данный момент!
Пожалуйста, помогите!