5

Sono nuovo alla segmentazione dell'immagine, ma ho bisogno di farlo per ottenere un database per il classificatore di apprendimento automatico.Segmentazione delle immagini impegnativa: lo sfondo e gli oggetti sono simili

Essenzialmente Ho un video simile a questa immagine:

Cow with a rectangle

Il mio compito è quello di identificare le mucche in primo piano, o almeno qualsiasi vaccino a tutti. Mi rendo conto che c'è un problema di occlusione, ma per un antipasto mi piacerebbe segmentare correttamente una mucca solitaria, come quella con il rettangolo rosso attorno ad essa (disegnata a mano).

In problemi meno impegnativi, come questa, sono discriminare aggiungendo una soglia per ogni pixel, che o diventa (0,0,0) per l'oggetto o (255,255,255) per lo sfondo:

Megasteak

Quindi etichetto i pixel con gli stessi valori per ottenere le classi e ottenere il rettangolo per "blob" abbastanza grandi.

Per l'immagine sopra questo approccio non funzionerà come gli oggetti e lo sfondo sono simili + ci sono molte ombre, luci laterali ecc, quindi non sono sicuro di come avvicinarlo. Qualsiasi suggerimento è benvenuto.

+0

Hai considerato di utilizzare un rilevatore di bordi? –

+1

è necessario esaminare la segmentazione semantica – Shai

+0

Problema molto difficile. Hai molte immagini per realizzare un grande sistema di allenamento e utilizzare l'apprendimento profondo? –

risposta

0

Vorrei provare a scattare due foto. Una foto di uno sfondo "statico" senza mucche, quindi una seconda foto con una mucca. Quindi puoi sottrarre queste due immagini. Non ho molta familiarità con Python, ma imagemagick può facilmente cambiare le immagini (http://www.imagemagick.org/Usage/compare/). Idealmente l'immagine "differenziata" isolerà le mucche. Da lì puoi avere fantasia e provare vari algoritmi di rilevamento dei bordi, ecc ...

Spero che ti aiuti.

1

Mi rendo conto che questo è un thread vecchio, ma mi piacerebbe suggerire un approccio per problemi come questo.

Si può provare con una segmentazione basata sulla trama, poiché lo sfondo erboso ha una trama diversa dalla mucca.

Dai uno sguardo allo this link dove le caratteristiche di energia della trama per un'immagine sono definite in base alla tecnica delle leggi.

Ecco una implementazione della tecnica delle leggi in Python. Funziona definendo i kernel 2D utilizzati per estrarre caratteristiche diverse in un'immagine, ad esempio bordi, increspature, blob e loro combinazioni. La funzione sotto restituisce 9 immagini, da cui è possibile estrarre le caratteristiche della trama.

def laws(array): 

    # Define the 1D kernels 
    L5 = np.array([1,4,6,4,1]) # level 
    E5 = np.array([-1,-2,0,2,1]) # edge 
    S5 = np.array([-1,0,2,0,-1]) # spot 
    R5 = np.array([1,-4,6,-4,1]) # ripples 

    # Generate 2D kernels 
    L5E5 = np.outer(L5,E5) 
    E5L5 = np.outer(E5,L5) 

    L5R5 = np.outer(L5,R5) 
    R5L5 = np.outer(R5,L5) 

    E5S5 = np.outer(E5,S5) 
    S5E5 = np.outer(S5,E5) 

    S5S5 = np.outer(S5,S5) 

    R5R5 = np.outer(R5,R5) 

    L5S5 = np.outer(L5,S5) 
    S5L5 = np.outer(S5,L5) 

    E5E5 = np.outer(E5,E5) 

    E5R5 = np.outer(E5,R5) 
    R5E5 = np.outer(R5,E5) 

    S5R5 = np.outer(S5,R5) 
    R5S5 = np.outer(R5,S5) 


    return (0.5*(correlate(array, L5E5) + correlate(array, E5L5)), \ 
      0.5*(correlate(array, L5R5) + correlate(array, R5L5)), \ 
      0.5*(correlate(array, E5S5) + correlate(array, S5E5)), \ 
      correlate(array, S5S5), \ 
      correlate(array, R5R5), \ 
      0.5*(correlate(array, L5S5) + correlate(array, S5L5)), \ 
      correlate(array, E5E5), \ 
      0.5*(correlate(array, E5R5) + correlate(array, R5E5)), \ 
      0.5*(correlate(array, R5S5) + correlate(array, S5R5))) 
+0

Non vedo quelli in molti anni ... –