Reconocimiento de formas con adormecimiento / sifón (quizás cuenca)

Mi objective es trazar dibujos que tengan muchas formas separadas y dividir estas formas en imágenes individuales. Es negro sobre blanco. Soy bastante nuevo en numpy, opencv & co, pero aquí está mi pensamiento actual:

  • escanear en busca de píxeles negros
  • pixel negro encontrado -> cuenca
  • Encontrar el límite de la cuenca (como camino poligonal)
  • continuar buscando, pero ignorar puntos dentro de los límites ya encontrados

No soy muy bueno en este tipo de cosas, ¿hay alguna manera mejor?

Primero traté de encontrar el cuadro delimitador rectangular de los resultados de la cuenca (esto es más o menos un collage de ejemplos):

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 

De alguna manera, cuando uso la matriz original (a), entonces el lugar donde parece funcionar, pero después de la cuenca hidrográfica (resolución), vuelve a generar la matriz completa.

El siguiente paso podría ser encontrar la ruta del polígono alrededor de la forma, ¡pero el cuadro delimitador sería excelente por ahora!

¡Por favor ayuda!

@Hooked ya ha respondido la mayor parte de tu pregunta, pero estaba en medio de escribir esto cuando respondió, así que lo publicaré con la esperanza de que aún sea útil …

Estás tratando de saltar a través de demasiados aros. Usted no necesita watershed_ift .

Utiliza scipy.ndimage.label para diferenciar objetos separados en una matriz booleana y scipy.ndimage.find_objects para encontrar el cuadro delimitador de cada objeto.

Vamos a romper las cosas un poco.

 import numpy as np from scipy import ndimage import matplotlib.pyplot as plt def draw_circle(grid, x0, y0, radius): ny, nx = grid.shape y, x = np.ogrid[:ny, :nx] dist = np.hypot(x - x0, y - y0) grid[dist < radius] = True return grid # Generate 3 circles... a = np.zeros((512, 512), dtype=np.bool) draw_circle(a, 100, 200, 30) draw_circle(a, 400, 350, 20) draw_circle(a, 200, 260, 20) # Label the objects in the array. labels, numobjects = ndimage.label(a) # Now find their bounding boxes (This will be a tuple of slice objects) # You can use each one to directly index your data. # Eg a[slices[0]] gives you the original data within the bounding box of the # first object. slices = ndimage.find_objects(labels) #-- Plotting... ------------------------------------- fig, ax = plt.subplots() ax.imshow(a) ax.set_title('Original Data') fig, ax = plt.subplots() ax.imshow(labels) ax.set_title('Labeled objects') fig, axes = plt.subplots(ncols=numobjects) for ax, sli in zip(axes.flat, slices): ax.imshow(labels[sli], vmin=0, vmax=numobjects) tpl = 'BBox:\nymin:{0.start}, ymax:{0.stop}\nxmin:{1.start}, xmax:{1.stop}' ax.set_title(tpl.format(*sli)) fig.suptitle('Individual Objects') plt.show() 

introduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquíintroduzca la descripción de la imagen aquí

Esperemos que eso haga un poco más claro cómo encontrar los cuadros delimitadores de los objetos.

Utilice la biblioteca ndimage de scipy. La label función coloca una etiqueta única en cada bloque de píxeles que están dentro de un umbral. Esto identifica los clusters únicos (formas). Comenzando con su definición de a :

 from scipy import ndimage image_threshold = .5 label_array, n_features = ndimage.label(a>image_threshold) # Plot the resulting shapes import pylab as plt plt.subplot(121) plt.imshow(a) plt.subplot(122) plt.imshow(label_array) plt.show() 

introduzca la descripción de la imagen aquí