Domanda

Usando le immagini di articoli di abbigliamento scattate su uno sfondo coerente, vorrei rendere trasparenti tutti i pixel dell'immagine ad eccezione dell'abbigliamento. Qual è il modo migliore per farlo? Ho studiato gli algoritmi comuni per questo e la libreria open source opencv . Oltre a fare il mio o usare Opencv, c'è un modo semplice per farlo? Sono aperto a qualsiasi lingua o piattaforma.

Grazie

È stato utile?

Soluzione

Se lo sfondo è coerente in un'immagine ma incoerente tra le immagini, potrebbe diventare complicato, ma ecco cosa farei:

  1. Separa l'immagine in una forma di intensità / colore come YUV o Lab.
  2. Crea un istogramma sulla parte colorata. Trova il colore più occulto, questo è (molto probabilmente) il tuo sfondo (aggiorna), forse un trucco migliore qui sarebbe quello di trovare il colore più occulto di tutti i pixel entro uno o due pixel dal bordo dell'immagine.
  3. Partendo dai bordi dell'immagine, imposta tutti i pixel che hanno quel colore e sono collegati al bordo attraverso i pixel di quel colore su trasparenti.
  4. Il bordo del capo d'abbigliamento ora sembrerà un po 'brutto perché è costituito da pixel che ottengono il loro colore sia dallo sfondo che dal capo d'abbigliamento. Per combattere questo è necessario fare un po 'più di lavoro:

    1. Trova il bordo del capo attraverso un meccanismo rilevamento dei bordi .
    2. Sostituisci il colore dei pixel del bordo con una fusione del colore solo "dentro". il pixel del bordo (ovvero il colore dell'abbigliamento in quella regione) e trasparente (se il formato dell'immagine di output lo supporta).
    3. Se vuoi diventare davvero fantasioso, aumenti la trasparenza a seconda di quanto " mi piace " il colore di sfondo è il colore di quel pixel.

Altri suggerimenti

Fondamentalmente, trova il colore dello sfondo e sottralo, ma suppongo tu lo sapessi. È un po 'complicato farlo automaticamente, ma sembra possibile.

Innanzitutto, dai un'occhiata a rilevamento BLOB con OpenCV e vedi se questo è sostanzialmente fatto per te.

Per farlo da soli:

trova lo sfondo : ci sono diverse opzioni. Probabilmente il più semplice è istogramma dell'immagine e il gran numero di pixel con valori simili sono lo sfondo, e se ci sono due grandi raccolte, lo sfondo sarà quello con un grande buco nel mezzo. Un altro approccio è quello di prendere una banda attorno al perimetro come colore di sfondo, ma questo sembra inferiore poiché, ad esempio, il riflesso di un flash potrebbe schiarire notevolmente i pixel di sfondo situati più centralmente.

rimuovi lo sfondo : una prima cosa da fare è sradicare l'immagine in base al colore di sfondo, quindi eseguire " apri " o " chiudi " algoritmi su questo, e quindi usalo come maschera per selezionare il tuo articolo di abbigliamento. (Il punto di apertura / chiusura è di non rimuovere piccoli oggetti colorati sullo sfondo sull'abbigliamento, come bottoni neri su una camicetta bianca o, per esempio, riflessi luminosi sugli indumenti neri.)

OpenCV è un ottimo strumento per questo.

La parte più delicata di questo sarà probabilmente all'ombra intorno all'oggetto (ad esempio una giacca nera su uno sfondo bianco avrà un'ombra grigia continua su alcuni dei bordi e dove effettuare questo taglio?), ma se ottieni fino ad ora, pubblica un'altra domanda.

se conosci l'esatta intensità del colore dello sfondo e non cambierà mai e gli articoli di abbigliamento non coincideranno mai con questo colore, allora questa è una semplice applicazione della sottrazione dello sfondo, cioè tutto ciò che non è una particolare intensità di colore è considerato " su " pixel, uno di interesse. È quindi possibile utilizzare l'etichettatura dei componenti collegati ( http://en.wikipedia.org/wiki/Connected_Component_Labeling) per capire raggruppamenti separati di oggetti.

per un'immagine a colori, con lo stesso sfondo su ogni immagine:

  • converti la tua immagine in HSV o HSL
  • determina il valore della tonalità dello sfondo (+/- 10): esegui questo passaggio una volta, usando Photoshop ad esempio, quindi usa lo stesso valore su tutte le tue foto.
  • esegue una soglia di colore: sul canale della tonalità esclude la tonalità dello sfondo ([0, tonalità [+] tonalità, 255] in genere), per tutti gli altri canali include l'intero intervallo di valori (da 0 a 255 in genere). questo selezionerà i pixel che NON sono lo sfondo.
  • esegue un "riempimento fori" operazione (che si trova normalmente lungo l'analisi dei blob o le funzioni di etichettatura) per completare la parte dei vestiti che potrebbe essere stata dello stesso colore dello sfondo.
  • ora hai un'immagine che è una "maschera" degli abiti: pixel diversi da zero rappresentano gli abiti, 0 pixel rappresentano lo sfondo.
  • questo passaggio dell'elaborazione dipende da come si desidera rendere trasparenti i pixel: in genere, se si salva l'immagine come PNG con un canale alfa (trasparenza), utilizzare un'operazione logica AND (detta anche "mascheratura") tra canale alfa dell'immagine originale e creazione della maschera nel passaggio precedente.
  • voilà, lo sfondo è scomparso, salva l'immagine risultante.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top