Mi sono imbattuto in un algoritmo, che trova il contorno di una figura, ma ho difficoltà a dimostrare perché funziona, ho una specie di capito perché funziona, ma non riesco a ricavare le formule usate lì dentro .Come posso dimostrare che questo algoritmo di attraversamento dei bordi funziona?
Questo è l'algoritmo:
Supponiamo che abbiamo un'immagine binaria (con la figura di essere nero e sfondo bianco di essere). Tutti i pixel sono memorizzati in una matrice binaria con 1 bianco e 0 nero.
0) Trova il primo pixel nero (ad esempio se è un quadrato, si trova nell'angolo in alto a sinistra).
1) Impostare Lx = x e Ly = y (coordinate di quel primo pixel) e Rx = x - 1 e Ry = y. Inoltre mantieni 2 costanti firstX = x e firstY = y (ne avremo bisogno in seguito).
2) Calcolare Tx = Rx + Ly - Ry e Ty = Ry + Rx - Lx.
3) Eseguire il seguente ciclo:
do {
if (m[Tx][Ty] == 0) {
Lx = Tx;
Ly = Ty;
m2[Tx][Ty] = 0;
} else {
Rx = Tx;
Ry = Ty;
}
if (Lx == Rx || Ly == Ry) {
Tx = Rx + Ly - Ry;
Ty = Ry + Rx - Lx;
} else {
Ty = (Ly + Ry - Lx + Rx)/2;
Tx = (Lx + Rx + Ly - Ry)/2;
}
} while (Tx != firstX || Ty != firstY);
Nel codice precedente m è l'immagine originale e m2 è l'immagine contenente solo il contorno.
ho cercato di visualizzare come funziona e questo è quello che ho ottenuto:
Quindi a quanto pare sta facendo una sorta di movimenti a zig-zag per ottenere quei zeri sui bordi e determinare il contorno.
Quindi, la mia domanda è, è un algoritmo noto? E come esattamente sono state queste formule derivate:
Tx = Rx + Ly - Ry;
Ty = Ry + Rx - Lx;
e
Ty = (Ly + Ry - Lx + Rx)/2;
Tx = (Lx + Rx + Ly - Ry)/2;
?
Intersting, non l'ho mai visto. Possiamo avere il riferimento? Potrebbe essere simile alla strategia della "mano destra sul muro" per attraversare un labirinto. I metodi classici sono descritti qui: http://www.imageprocessingplace.com/downloads_V3/root_downloads/tutorials/contour_tracing_Abeer_George_Ghuneim/index.html. –
Non ho ancora guardato da vicino, ma le formule Tx/Ty sono certamente basate sul fatto che i punti L e R si trovano in una zona vicina a T e sono usati per calcolare un altro punto nel vicinato, come trovare il prossimo vicino in senso orario o simile. –
@YvesDaoust Purtroppo, non ho alcun riferimento, mi è stato inviato questo algoritmo da qualcuno che l'ha preso da qualcun altro, che l'ha preso da qualcun altro, ecc., Ma ti chiederò se hanno qualche derivazione! Grazie mille per il collegamento. – Pavel