Calcolo preciso di una lunghezza del contorno dell'immagine raster

5

Ho un'immagine rasterizzata che contiene due colori: bianco e nero. La porzione nera è completamente connessa e sembra un grosso blob. C'è un buon modo per stimare la lunghezza del confine tra le regioni?

Un metodo che ho considerato è quello di contare semplicemente quanti "bordi" della griglia rasterizzata hanno un colore diverso su ciascun lato. Tuttavia, ad es. una linea puramente diagonale, ciò sovrastimerà la distanza del confine di un fattore di sqrt (2). C'è un metodo migliore per stimare la lunghezza del confine che non ha questo problema?

    
posta Jim Garrison 06.08.2013 - 02:30
fonte

3 risposte

1

Il post del blog " Misurazione della lunghezza del confine " di Cris Luengo discute proprio questo problema e descrive diverse soluzioni di crescente sofisticazione. Nel caso in cui il blog cada, ecco un riferimento permanente al migliore discusso nel post:

Vossepoel and Smeulders, "Vector code probability and metrication error in the representation of straight lines of finite length" (Computer Graphics and Image Processing 20(4):347-364, 1982).

    
risposta data 24.07.2014 - 08:44
fonte
3

Il problema con la sovrastima della lunghezza per le linee diagonali deriva interamente dall'approccio che stai prendendo, vale a dire contare "i bordi della griglia di pixel che hanno colori diversi su ciascun lato" e dichiarare la somma come una lunghezza del contorno. Questi due non sono equivalenti in generale.

Essenzialmente ti stai limitando a calcolare le distanze "sulla griglia" anziché le distanze Euclide ("diretta") o "spianata per più punti" tra i bordi reali del contorno (non i "bordi" della griglia). La ragione per cui ritieni che il tuo approccio sia impreciso per le linee diagonali è perché i tuoi criteri di accuratezza hanno a che fare con la precisione sub-pixel, mentre nel tuo algoritmo stai operando su un livello di precisione dei pixel ("bordi" della griglia rasterizzata).

Perché non applicare prima il rilevamento dei bordi e ottenere un elenco di bordi con le coordinate dei sub-pixel (è possibile applicare qualsiasi algoritmo di rilevamento dei bordi sub-pixel). Il risultato di questo passaggio sarà una lista di coppie di doppi. Questo passaggio trasformerà il tuo problema in un dominio sub-pixel, in cui puoi calcolare le distanze e soddisfare i tuoi criteri di precisione.

Dopo aver eseguito il drill down fino ai bordi a livello sub-pixel, abbiamo due opzioni principali:

  • per calcolare la somma delle distanze euclidee tra i bordi successivi. Ci darà una lunghezza accettabile di countour dato che abbiamo scelto un algoritmo di rilevamento dei bordi decente;
  • per collegare i bordi in modo uniforme (ad esempio B-spline) e calcolare una somma di lunghezze arco tra i bordi successivi in base alla funzione interpolante che hai selezionato.

UPDATE L'approccio semplificato per il primo passo sarebbe quello di scegliere un punto medio sub-pixel dei tuoi "bordi" idonei della griglia rasterizzata e dichiararlo al centro del bordo. Da lì si procede con il calcolo delle distanze - anche con le distanze euclidee tra i punti centrali si otterrà un risultato molto accurato quindi contando i "bordi" eludibili della griglia rasterizzata. Almeno il problema "sovrastima per fattore di sqrt (2)" per le linee diagonali sarà risolto. Spero che ti aiuti.

    
risposta data 01.03.2014 - 08:56
fonte
-1

Come ha scritto rwong, puoi usare findContours per ottenere i countours, se non li hai già. Quindi puoi utilizzare arcLength per calcolare la lunghezza del contorno .

    
risposta data 18.08.2013 - 02:04
fonte

Leggi altre domande sui tag