Il modo migliore per segmentare le vene nelle foglie?


47

Ho fatto molte ricerche e scoperto metodi come la soglia adattativa, lo spartiacque, ecc. Che possono essere utilizzati per rilevare le vene nelle foglie. Tuttavia la soglia non è buona in quanto introduce molto rumore

Tutte le mie immagini sono grigie, per favore qualcuno potrebbe suggerire quali approcci adottare mentre si considera questo problema in urgente bisogno di aiuto

EDIT: la mia immagine originale

inserisci qui la descrizione dell'immagine

Dopo il limite

inserisci qui la descrizione dell'immagine

Come suggerito dalla risposta, ho provato il seguente rilevamento dei bordi

  1. astuto

Troppo rumore e disturbi indesiderati

inserisci qui la descrizione dell'immagine

  1. Sobel

inserisci qui la descrizione dell'immagine

  1. Roberts

inserisci qui la descrizione dell'immagine

EDIT: Ho provato un'altra operazione per ottenere il seguente risultato è migliore di quello che ho provato con astuto e adattivo Cosa senti?

inserisci qui la descrizione dell'immagine


Potresti per favore mostrarci alcune immagini?
Jonas

Ho aggiunto immagini
vini

@vini Attualmente lo stai facendo come fase di pre-elaborazione per ottenere una buona corrispondenza del modello in un secondo momento? Inoltre, come hai ottenuto la seconda immagine, attraverso un semplice limite?
Spacey,

Il mio obiettivo è quello di ottenere il miglior risultato possibile nel segmentare le vene in modo che la mia produzione non contenga artefatti vaganti, ho usato la soglia adattiva per ottenere la seconda immagine
vini

Dalle immagini che hai dato, sembra che tu stia usando (vari) filtri su un'immagine con soglia. Ciò darà risultati estremamente scarsi. Dovresti usare i filtri sull'immagine originale , quindi mettere in soglia il loro output.
Benjohn,

Risposte:


56

Non stai cercando bordi (= bordi tra aree estese di valore alto e basso grigio), stai cercando creste (linee sottili più scure o più luminose del loro vicinato), quindi i filtri dei bordi potrebbero non essere l'ideale: un filtro per bordi ti dà due fianchi (uno su ciascun lato della linea) e una risposta bassa nel mezzo della linea:

campioni di filtro

AGGIUNGI : se è stato chiesto di spiegare più chiaramente la differenza tra un rilevatore di bordi e un rilevatore di cresta. Mi scuso in anticipo se questa risposta sta diventando molto lunga.

Un rilevatore di bordi è (di solito) un primo operatore derivato: se immagini l'immagine di input come un paesaggio 3D, un rilevatore di bordi misura la pendenza della pendenza in ciascun punto di quel paesaggio:

inserisci qui la descrizione dell'immagine

Se vuoi rilevare il bordo di una regione chiara o scura estesa, va bene. Ma per le vene nell'immagine dell'OP ti darà lo stesso: i contorni sinistro e destro di ogni vena:

inserisci qui la descrizione dell'immagine

Ciò spiega anche il "modello a doppia linea" nei risultati del rilevatore di bordi Canny:

inserisci qui la descrizione dell'immagine

Quindi, come si rilevano queste linee sottili (es. Creste), allora? L'idea è che i valori dei pixel possono essere (localmente) approssimata da una 2a polinomio ordine, cioè se la funzione di immagine è , quindi per piccoli valori di ed :gxy

g(x,y)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

o, sotto forma di matrice:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

Matrice derivata del secondo ordine è chiamato " Matrice dell'Assia ". Descrive la struttura del 2 ° ordine a cui siamo interessati.(2gx22gxy2gxy2gy2)

La parte del 2 ° ordine di questa funzione può essere trasformata nella somma di due parabole ruotate di un angolo, decomprimendo la matrice hessiana sopra a una rotazione per una matrice diagonale dei suoi autovalori ( Decomposizione della matrice ). Non ci interessa la rotazione (vogliamo rilevare le creste in qualsiasi orientamento), quindi siamo interessati solo a eλ1x2+λ2y2λ1λ2

Che tipo di forme può avere questa approssimazione di funzione? In realtà, non così tanti:

inserisci qui la descrizione dell'immagine

Per rilevare le creste, vogliamo trovare aree nell'immagine che assomiglino all'ultima delle trame sopra, quindi stiamo cercando aree in cui l'autovalore principale dell'Assia è grande (rispetto all'autovalore minore). Il modo più semplice per rilevare ciò è solo calcolare l'autovalore principale per ogni pixel - ed è quello che fa il filtro di cresta sottostante.


Un filtro di cresta probabilmente darà risultati migliori. Ho provato il built-in di Mathematica RidgeFilter(che calcola il principale autovalore della matrice hessiana su ciascun pixel) sulla tua immagine:

filtro di cresta

Come puoi vedere, c'è un solo picco per ogni sottile linea scura. Rendimenti binarizzanti e scheletrici:

inserisci qui la descrizione dell'immagine

Dopo aver potato lo scheletro e rimosso i piccoli componenti (rumore) dall'immagine, ottengo questo scheletro finale:

inserisci qui la descrizione dell'immagine

Codice Mathematica completo:

ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]

INSERISCI:

Non sono un esperto di Matlab, non so se abbia un filtro di cresta integrato, ma posso mostrarti come implementarlo "a mano" (di nuovo, usando Matematica). Come ho detto, il filtro di cresta è il principale autovalore della matrice dell'Assia. Posso calcolare quell'autovalore simbolicamente in Mathematica:

eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]

=>12(Hxx+Hyy+Hxx2+4Hxy22HxxHyy+Hyy2)

Quindi, quello che devi fare è calcolare le seconde derivate , , (usando una sobel o una derivata del filtro gaussiano) e inserirle nell'espressione sopra e hai il tuo filtro cresta. H xy H yyHxxHxyHyy


Sì, è esattamente quello che voglio, tuttavia lo sto facendo in Matlab e trovare un equivalente del filtro per cresta è diventato difficile
vini

1
@nikie Risposta molto bella - domanda - puoi per favore approfondire la differenza tra un rilevatore di bordi e un rilevatore di cresta per noi persone che non elaborano immagini? Grazie ancora
Spacey,

@Mohammad: ci ho provato, spero di averlo reso un po 'più chiaro ora, nonostante la matematica
Niki Estner

ho provato che il filtro della cresta non dà risultati soddisfacenti
vini

2
@vini: "non dà risultati soddisfacenti" non mi dice molto. Ottieni la stessa immagine di risultato di quella che ho pubblicato? Cosa è "non soddisfacente"?
Niki Estner

6

Quando utilizzo il rilevamento dei bordi di Canny (in Halcon), con alfa 1 e la soglia bassa 8 e la soglia alta 13 (su una scala di 1-255), ottengo il seguente risultato:

Foglia di rilevamento del bordo canny

Con la modifica dei parametri, il risultato ottenuto da Canny può essere molto più migliorato. Usando questa immagine, puoi saltare i bordi corti per rimuovere il rumore e collegare i bordi lunghi per il risultato finale.

A proposito: un colore diverso indica un bordo diverso.

Posso ottenere un risultato abbastanza simile usando questo rilevatore di bordi Canny online :

  • Scegli immagine I9Pxl.png
  • Sigma 1.2
  • T-basso 0,04
  • T-high 0,07
  • Altre impostazioni predefinite
  • Fare clic su Aggiorna vista per il risultato

Grazie :) Suppongo che Canny sia la migliore;) A proposito, l'applicazione di Canny sul tuo risultato potrebbe produrre risultati ancora migliori ..
Geerten

A proposito: se non l'hai notato: quali sono i limiti di un rilevatore di bordi Canny? Puoi dare le tue opinioni qui!
Dipan Mehta,

Se mi stai dicendo: ho già dato il mio parere alla tua domanda ... Se stai dando un commento in generale: eliminerò questo commento.
Geerten,

Oh sì, non me ne sono reso conto!
Dipan Mehta,

Grazie per la tua risposta, tuttavia canny non conserva i dettagli fini delle vene nelle foglie che non vengono rilevate come hai mostrato ...
vini

6

Seguendo la risposta eccellente sopra, ecco come farlo in Python usando le funzioni di Scikit.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

Cosa imgdovrebbe essere? Ho un pngfile e non funziona.
Sigur,

img dovrebbe essere una matrice numpy 2d.
Matthew Shun-Shin,

In realtà, i1è il più grande degli autovalori, quindi dovresti usarlo.
Rob,

Questa è la spiegazione più chiara che abbia mai visto!
Eureka,

3

Invece di soglia, ho applicato il rilevamento dei bordi semplice.

GIMP usato con differenza di gaussiano - radiante esterno: 3.0 e interno: 1.0.

Ecco come appare.

inserisci qui la descrizione dell'immagine

È inoltre possibile applicare un filtro mediano o erosione / dilatazione in modo da rimuovere parte del rumore sgranato.

Ecco la pagina che spiega l'implementazione di gimp.

Dovresti fare riferimento a diverse tecniche come Laplacian di Gaussian o Difference of Gaussin ecc. Vedi questo: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

E questa risposta Come si usa il Laplaciano per Maschera di contrasto?


GIMP? qual è il rilevatore di bordi?
vini

1
No, è un pacchetto di modifica delle immagini. È stato un rapido controllo - solo per mettere un punto in avanti - utilizzare il rilevamento dei bordi anziché il limite.
Dipan Mehta,

Quale rilevatore di bordi utilizza GIMP? mi dispiace averne ben poca conoscenza
vini

@vini aggiunto riferimento.
Dipan Mehta,

3

Questo argomento ha sempre suscitato molto interesse, eppure non esiste un vero consenso sull'argomento. Pertanto ho deciso di lasciare alcune parole.

Le mie risposte a domande simili in precedenza su stackexchange ( Q1 e Q2 ) riguardavano un algoritmo di estrazione della struttura curvilinea subpixel di Steger. Questo metodo ha funzionato ragionevolmente bene in molti casi e per fortuna, incluso questo. Pertanto pubblico l'immagine di output qui: inserisci qui la descrizione dell'immagine e qui con un'impostazione di parametro diversa e senza colorazione di connessione: inserisci qui la descrizione dell'immagine per i dettagli e i riferimenti corretti, consultare i post di stackexchange a cui ho fatto riferimento.


0

Come parte del mio ultimo anno di studi di ingegneria, ho dovuto studiare i metodi di segmentazione dei vasi sanguigni nelle immagini del fondo oculare. Ho trovato questo metodo di ricostruzione dell'albero (di Cohen, Laurent D. e Mille, Julien particolarmente interessante da usare insieme ai metodi di marcia veloce.

Altri documenti che potresti voler esaminare:

  • Contorni geodetici attivi
  • Sull'implementazione di metodi di marcia rapida per reticoli 3D
  • Multistencil FMM: una soluzione altamente accurata all'equazione eikonale sui domini cartesiani

Link utili: - Propagazione frontale in 2D e 3D

Spero che questo aiuti un po ', anche se non è esattamente lo stato dell'arte.

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.