2013-06-05 7 views
8

Ho un'immagine png graysacle e voglio estrarre tutti i componenti collegati dalla mia immagine. Alcuni componenti hanno la stessa intensità ma voglio assegnare un'etichetta univoca a ogni oggetto. qui è la mia immagineEstrazione di oggetti connessi da un'immagine in Python

enter image description here

ho provato questo codice:

img = imread(images + 'soccer_cif' + str(i).zfill(6) + '_GT_index.png') 
labeled, nr_objects = label(img) 
print "Number of objects is %d " % nr_objects 

ma ottengo solo tre oggetti che utilizzano questo. Per favore dimmi come ottenere ogni oggetto.

+0

Da dove viene la funzione 'etichetta'? –

+0

Soluzione possibile: http://stackoverflow.com/a/5304140/190597 – unutbu

+0

Sto usando qualcosa di simile in realtà. La funzione label proviene da scipy.ndimage Ma ottenendo il risultato che ho postato – Khushboo

risposta

8

J.F. Sebastian shows a way per identificare gli oggetti in un'immagine. Si richiede di scegliere manualmente un raggio di sfocatura e valore di soglia gaussiana, tuttavia:

import scipy 
from scipy import ndimage 
import matplotlib.pyplot as plt 

fname='index.png' 
blur_radius = 1.0 
threshold = 50 

img = scipy.misc.imread(fname) # gray-scale image 
print(img.shape) 

# smooth the image (to remove small objects) 
imgf = ndimage.gaussian_filter(img, blur_radius) 
threshold = 50 

# find connected components 
labeled, nr_objects = ndimage.label(imgf > threshold) 
print "Number of objects is %d " % nr_objects 

plt.imsave('/tmp/out.png', labeled) 
plt.imshow(labeled) 

plt.show() 

enter image description here

Con blur_radius = 1.0, questo trova 4 oggetti. Con blur_radius = 0.5, 5 oggetti si trovano:

enter image description here

+0

Hmm, non ho provato la sfocatura gaussiana in precedenza. Questo metodo funziona meglio. Grazie :) – Khushboo

0

Se il bordo di oggetti sono completamente chiari e si ha un'immagine binaria img, si può evitare il filtraggio gaussiano e basta fare questa linea:

labeled, nr_objects = ndimage.label(img)