Ritaglio automatico di forme arbitrarie


14

Ho una forma arbitraria definita da una maschera binaria (grigio = forma, nero = sfondo).

Vorrei trovare un rettangolo più grande possibile contenente solo pixel grigi (tale rettangolo è rappresentato in giallo):

inserisci qui la descrizione dell'immagine

La forma è sempre "un pezzo unico" ma non è necessariamente convessa (non tutte le coppie di punti sul contorno della forma possono essere collegate da una linea retta che passa attraverso la forma).

A volte esistono molti di questi "rettangoli massimi" e quindi possono essere introdotti ulteriori vincoli, come:

  • Prendendo il rettangolo con il suo centro più vicino al centro di massa della forma (o al centro dell'immagine)
  • Prendendo il rettangolo con le proporzioni più vicine a un rapporto predefinito (cioè 4: 3)

inserisci qui la descrizione dell'immagine

Il mio primo pensiero sull'algoritmo è il seguente:

  1. Calcola la trasformazione della distanza della forma e trova il suo centro di massa
  2. Fai crescere l'area quadrata mentre contiene solo i pixel della forma
  3. Fai crescere il rettangolo (originariamente un quadrato) in larghezza o altezza mentre contiene solo i pixel della forma.

Tuttavia, penso che tale algoritmo sarebbe lento e non porterebbe a una soluzione ottimale.

Eventuali suggerimenti?



@AtulIngle Extactly! Grazie. Potresti aggiungere la risposta in modo che io possa accettarla? Cercherò quindi di modificare la risposta per elaborare di più sull'algoritmo, ma non voglio solo rispondere alla mia domanda usando il link che hai fornito ...
Libor

Grande! Non vedo l'ora di leggere la tua risposta elaborata poiché non ho letto il codice.
Atul Ingle

@AtulIngle OK, ho aggiunto alcune discussioni nella risposta e il link a un mio articolo completo.
Libor

Risposte:


10

Esiste un codice su Matlab Fileexchange rilevante per il tuo problema: http://www.mathworks.com/matlabcentral/fileexchange/28155-inscriptionrectangle/content/html/Inscribed_Rectangle_demo.html

Aggiornare

Ho scritto questo articolo tutorial sul calcolo dei più grandi rettangoli inscritti in base al link sopra di Atul Ingle.

L'algoritmo cerca innanzitutto i quadrati più grandi su una maschera binaria. Questo viene fatto usando un semplice algoritmo di programmazione dinamica. Ogni nuovo pixel viene aggiornato utilizzando i tre vicini già noti:

squares[x,y] = min(squares[x+1,y], squares[x,y+1], squares[x+1,y+1]) + 1

inserisci qui la descrizione dell'immagine

La maschera binaria di esempio e la mappa calcolata si presentano così:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

Prendendo il massimo nella mappa si rivela il quadrato più grande inscritto:

inserisci qui la descrizione dell'immagine

L'algoritmo di ricerca del rettangolo esegue la scansione della maschera altre due volte cercando due classi di rettangoli:

  • larghezza maggiore della dimensione del quadrato (e altezza eventualmente inferiore)
  • altezza maggiore della dimensione del quadrato (e larghezza eventualmente inferiore)

Entrambe le classi sono delimitate dai quadrati più grandi poiché nessun rettangolo in un determinato punto può avere entrambe le dimensioni maggiori del quadrato inscritto (sebbene una dimensione possa essere più grande).

Bisogna scegliere alcune metriche per le dimensioni del rettangolo, come area, circonferenza o somma ponderata delle dimensioni.

Ecco la mappa risultante per i rettangoli:

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

È conveniente memorizzare la posizione e le dimensioni del miglior rettangolo trovato finora in una variabile invece di costruire mappe e quindi cercare i massimi.

inserisci qui la descrizione dell'immagine

L'applicazione pratica di questo algoritmo è il ritaglio di immagini non rettangolari. Ho usato questo algoritmo nella mia libreria di punti immagine SharpStitch :

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.