Spiacente, non conosco OpenCV, e questa è più una fase di pre-elaborazione che una risposta completa:
Innanzitutto, non vuoi un rilevatore di bordi. Un rilevatore di bordi converte le transizioni (come questo da scuro a chiaro):
in creste (linee luminose sul buio) in questo modo:
Esegue una differenziazione, in altre parole.
Ma nelle tue immagini, c'è una luce che brilla da una direzione, che ci mostra il rilievo della superficie 3D. Lo percepiamo come linee e spigoli, perché siamo abituati a vedere le cose in 3D, ma non lo sono davvero, motivo per cui i rilevatori di spigoli non funzionano e la corrispondenza dei modelli non funzionerà facilmente con le immagini ruotate (un perfetto la corrispondenza con una rotazione di 0 gradi si annullerebbe completamente a 180 gradi, poiché la luce e il buio si allineavano tra loro).
Se l'altezza di una di queste linee mazy si presenta così dal lato:
quindi la funzione di luminosità quando illuminata da un lato sarà simile a questa:
Questo è ciò che vedi nelle tue immagini. La superficie frontale diventa più luminosa e la superficie finale diventa più scura. Quindi non vuoi differenziarti. Devi integrare l'immagine lungo la direzione dell'illuminazione e ti darà la mappa dell'altezza originale della superficie (approssimativamente). Quindi sarà più facile abbinare le cose, attraverso la trasformazione di Hough o la corrispondenza dei modelli o altro.
Non sono sicuro di come automatizzare la ricerca della direzione dell'illuminazione. Se è lo stesso per tutte le tue immagini, fantastico. Altrimenti dovresti trovare la più grande linea di contrasto e supporre che la luce sia perpendicolare ad essa o qualcosa del genere. Per il mio esempio, ho ruotato l'immagine manualmente in quella che pensavo fosse la giusta direzione, con la luce proveniente da sinistra:
Tuttavia, devi anche rimuovere tutte le modifiche a bassa frequenza nell'immagine per evidenziare solo le caratteristiche lineari che cambiano rapidamente. Per evitare artefatti da squillo, ho usato la sfocatura gaussiana 2D e poi l'ho sottratta dall'originale:
L'integrazione (somma cumulativa) può fuggire facilmente, producendo strisce orizzontali. Ho rimosso questi con un altro passaggio alto gaussiano, ma questa volta solo in direzione orizzontale:
Ora gli stomi sono ellissi bianche tutt'intorno, anziché bianche in alcuni punti e nere in altri.
Originale:
integrato:
from pylab import *
import Image
from scipy.ndimage import gaussian_filter, gaussian_filter1d
filename = 'rotated_sample.jpg'
I = Image.open(filename).convert('L')
I = asarray(I)
# Remove DC offset
I = I - average(I)
close('all')
figure()
imshow(I)
gray()
show()
title('Original')
# Remove slowly-varying features
sigma_2d = 2
I = I - gaussian_filter(I, sigma_2d)
figure()
imshow(I)
title('2D filtered with %s' % sigma_2d)
# Integrate
summed = cumsum(I, 1)
# Remove slowly-changing streaks in horizontal direction
sigma_1d = 5
output = summed - gaussian_filter1d(summed, sigma_1d, axis=1)
figure()
imshow(output)
title('1D filtered with %s' % sigma_1d)
La trasformazione di Hough può essere utilizzata per rilevare ellissi di cresta come questa, fatte di "pixel di bordo", sebbene sia molto costosa in termini di calcolo e memoria, e non sono ellissi perfette, quindi dovrebbe essere un po 'un rivelatore "sciatto". Non l'ho mai fatto, ma ci sono molti risultati di Google per il " rilevamento dell'ellisse ". Direi che se rilevi un'ellisse all'interno dell'altra, all'interno di uno spazio di ricerca di una certa dimensione, dovrebbe essere conteggiata come una stomia.
Vedi anche: