2012-02-13 26 views
6

Invece del rilevamento del fronte di un'immagine 2D, vorrei rilevare i bordi su ogni singola riga (ad esempio una linea) di un'immagine separatamente. Cioè il rilevamento dei bordi da un vettore 1D ingresso i cui valori sono le intensità dei pixel da 0 a 255 (immagine sotto): enter image description hereRilevamento unidimensionale del bordo

desidero rilevare i bordi principali che appaiono nel ingresso campione (immagine in basso) enter image description here

+0

Grazie a tutti per le risposte. Per favore, se trovi altre nuove idee (1Dimentional edge detect), condividile anche qui. –

risposta

7

Un modo per raggiungere il risultato desiderato è quello di adattare l'Algoritmo di Canny 2D come segue (codice Mathematica):

Innanzitutto, calcolare la derivata spaziale utilizzando un filtro derivato gaussiano, impostando il valore di sigma relativo alla la scala dei bordi che si desidera rilevare. Prendi il valore assoluto del risultato.

d = [email protected][data, {{10, 5}}, 1]; 

Quindi, determinare automaticamente una soglia per raggruppare i valori derivati ​​precedenti in due gruppi (qui utilizzando il metodo di Otsu).

thrd = FindThreshold[d]; 

Quindi, rilevare i passi dei valori derivati ​​(transizioni in/dalla "banda morta").

steps = [email protected]`StepDetect[d, thrd]["NonzeroPositions"]; 

A questo punto si hanno le estremità dei bordi:

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps]}] 

enter image description here

Opzionalmente - sembra che è quello che vuoi - a mantenere solo le estremità più basse della bordi. Il clustering dei punti dati alle estremità dei bordi funziona in questo caso, ma non sono sicuro di quanto sia robusto.

t = [email protected][[steps]]; 
steps2 = Select[steps, data[[#]] <= t &]; 

ListLinePlot[data, Epilog -> {Red, PointSize[Large], Map[Point[{#, data[[#]]}] &, steps2]}] 

enter image description here

2

Quindi stai cercando un particolare cambiamento di pendenza, cioè un certo cambio di Y per campione?

Non è semplicemente guardare la differenza di Y tra due campioni e se il suo valore assoluto è stato modificato da più di un segno di limite come margine?

+0

No davvero, non sarebbe affatto così semplice. Per l'aspetto di refrence: http://en.wikipedia.org/wiki/Edge_detection (Perché il rilevamento dei bordi è un'attività non banale) –

+0

@Cgraphics: Sulle immagini che hai pubblicato una differenza semplice o un derivato dell'operatore gaussiano dovrebbe funzionare bene . Se pensi "non è affatto così semplice", pubblica i dati effettivi con cui hai problemi. – Niki

+0

@nikie che è l'immagine reale, tuttavia non è semplice come applicare una soglia semplice. Abbiamo bisogno di un rilevamento accurato dei bordi non solo, diciamo, contandoli. –

1

Dato il piacevole contrasto di questi bordi, c'è una soluzione facile che funzionerà robustamente: rilevare tutte le sequenze monotone di valori di pixel (strettamente crescente o decrescente). Manterrai le sequenze con un'altezza totale superiore a una soglia (50 nel tuo caso) per respingere i picchi rumorosi.

Come sottoprodotto, otterrai i punti di partenza e di arrivo (non esattamente dove li aspetti, ma può essere migliorato se necessario).

Codici a barre?

+0

Non si esce esattamente, tuttavia si può pensare ad esso come codice a barre colorato –

Problemi correlati