Распознавание форм с помощью numpy/scipy (возможно, водораздел)

Моя цель — отследить рисунки, в которых много отдельных фигур, и разбить эти фигуры на отдельные изображения. Это черное на белом.Я новичок в numpy, opencv & 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) он просто снова выводит полный массив.

Следующим шагом может быть нахождение многоугольника вокруг фигуры, но на данный момент ограничительная рамка будет отличной!

Пожалуйста, помогите!

12
задан user978250 13 March 2012 в 17:39
поделиться