2010-11-20 12 views
6

Supponiamo di avere un'immagine con, diciamo, un cerchio e un quadrato. C'è un modo per trovare il quadrato data la matrice dell'immagine? (c'è solo un quadrato, e il tempo non è davvero un problema). Grazie.Algoritmo per trovare una forma quadrata in un'immagine?

+1

È un quadrato perfetto, o "quadrato"? –

+1

Rettangolo, per la precisione. Ma è piuttosto una vaniglia. Supponiamo che sia stato disegnato con lo strumento "quadrato" di MS Paint e quindi salvato come gif. –

+1

Il quadrato è allineato agli assi o è ruotato? – thejh

risposta

3

Dividiamo tutti i punti in "illuminato" e "scuro".

Cercare i punti che sono illuminati e anche i punti sopra e sotto sono accesi. È probabile che questi siano parte di un vantaggio.

Analogamente: se un punto (x, y) è acceso e punti (x + 1, y), (x + 2, y) sono anche accesi, ma (x-1, y) e (y-1 , y) sono scuri e, analogamente nella direzione Y, probabilmente hai trovato un angolo in alto a sinistra. E così via. In questo modo puoi trovare gli angoli e poi trovare il quadrato da loro - sembra essere un approccio semplice.

0

Se il quadrato nell'immagine è perfetto, controllare che vi sia un bordo nella posizione prevista. Lo pseudocodice nella risposta di jh dovrebbe funzionare correttamente.

+0

Grazie, Gintautas. Mi spiace di chiederti questo, ma potresti essere un po 'più formale? Qualche matematica o pseudo-codice forse? Ho problemi ad analizzare la frase. Grazie. –

+0

Sì, la mia prima frase è stata interrotta, mi dispiace. Fissaggio. –

+0

Ho frainteso la tua domanda, ho pensato che stavi cercando un rettangolo pieno anziché solo il countour, come previsto dallo strumento "Rettangolo" di Paint. In questo caso la soluzione è molto più semplice. –

3

Qualcosa di simile?

for (x,y of every black pixel) { 
#those methods should return true if the lines length is more than one pixel 
if (hasLineToRight(x,y)&&hasLineToBottom(x,y)) { 
    otherx=highestXOfLineToRight(); 
    othery=highestYOfLineToBottom(); 
    if (isLine(x,y,x,othery)&&isLine(x,y,otherx,y)) { 
    addBoxToList(x,y,otherx,othery); 
    } 
} 
} 

box image

È propably desidera utilizzare la scatola con i più alti valori di larghezza e altezza.

0

E a proposito di flood filling a partire da punti casuali fino a quando non hai trovato il tuo rettangolo?

Problemi correlati