Leider kenne ich OpenCV nicht und dies ist eher ein Vorverarbeitungsschritt als eine vollständige Antwort:
Erstens möchten Sie keinen Kantendetektor. Ein Kantendetektor konvertiert Übergänge (wie diese von Dunkel nach Hell):
in Grate (helle Linien auf dunkel) wie folgt:
Es führt also eine Differenzierung durch.
In Ihren Bildern scheint jedoch ein Licht aus einer Richtung nach unten, das uns das Relief der 3D-Oberfläche zeigt. Wir nehmen dies als Linien und Kanten wahr, da wir es gewohnt sind, Dinge in 3D zu sehen, dies ist jedoch nicht der Fall, weshalb Kantendetektoren nicht funktionieren und der Vorlagenabgleich bei gedrehten Bildern nicht einfach funktioniert (perfekt) Eine Übereinstimmung bei einer Drehung um 0 Grad würde sich tatsächlich bei 180 Grad vollständig aufheben, da Licht und Dunkelheit in einer Linie zueinander liegen würden.
Wenn die Höhe einer dieser mazy lines von der Seite so aussieht:
dann sieht die Helligkeitsfunktion bei einseitiger Beleuchtung so aus:
Das sehen Sie in Ihren Bildern. Die zugewandte Fläche wird heller und die nachlaufende Fläche dunkler. Sie wollen also nicht differenzieren. Sie müssen sich integrieren das Bild entlang der Richtung der Beleuchtung, und es wird Ihnen die ursprüngliche Höhe Karte der Oberfläche (ungefähr) geben. Dann ist es einfacher, Dinge abzugleichen, ob durch Hough-Transformation oder Template-Matching oder was auch immer.
Ich bin mir nicht sicher, wie ich das Ermitteln der Beleuchtungsrichtung automatisieren soll. Wenn es für alle Ihre Bilder gleich ist, ist es großartig. Andernfalls müssten Sie die größte Kontrastlinie finden und davon ausgehen, dass das Licht senkrecht dazu ist oder so. In meinem Beispiel habe ich das Bild manuell in die richtige Richtung gedreht, wobei das Licht von links kommt:
Sie müssen jedoch auch alle niederfrequenten Änderungen im Bild entfernen, um nur die sich schnell ändernden linienartigen Funktionen hervorzuheben. Um Ringing-Artefakte zu vermeiden, habe ich 2D-Gauß-Unschärfe verwendet und diese dann vom Original subtrahiert:
Die Integration (kumulative Summe) kann leicht durchgehen, was horizontale Streifen erzeugt. Ich habe diese mit einem anderen Gaußschen Hochpass entfernt, diesmal jedoch nur in horizontaler Richtung:
Jetzt sind die Stomata ringsum weiße Ellipsen, statt an einigen Stellen weiß und an anderen schwarz.
Original:
Integriert:
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)
Die Hough-Transformation kann verwendet werden, um Ridge-Ellipsen wie diese zu erkennen, die aus "Randpixeln" bestehen. Sie sind jedoch sehr rechen- und speicherintensiv und keine perfekten Ellipsen. Es müsste sich also um einen etwas "schlampigen" Detektor handeln. Ich habe es noch nie gemacht, aber es gibt viele Google-Ergebnisse für " Hough Ellipse Detection ". Ich würde sagen, wenn Sie eine Ellipse in der anderen innerhalb eines bestimmten Suchraums erkennen, sollte diese als Stoma gezählt werden.
Siehe auch: