Przepraszam, nie znam OpenCV, a to bardziej etap wstępnego przetwarzania niż pełna odpowiedź:
Po pierwsze, nie chcesz wykrywacza krawędzi. Detektor krawędzi konwertuje przejścia (takie jak ten z ciemności na światło):
w grzbiety (jasne linie na ciemności) w następujący sposób:
Innymi słowy, wykonuje różnicowanie.
Ale na twoich obrazach jest światło padające z jednego kierunku, co pokazuje nam relief powierzchni 3D. Widzimy to jako linie i krawędzie, ponieważ jesteśmy przyzwyczajeni do oglądania rzeczy w 3D, ale tak naprawdę nie są, dlatego detektory krawędzi nie działają, a dopasowywanie szablonów nie będzie łatwo działać z obróconymi obrazami (idealne dopasowanie przy obrocie o 0 stopni faktycznie anuluje się całkowicie przy 180 stopniach, ponieważ światło i ciemność zbiegną się ze sobą).
Jeśli wysokość jednej z tych mętnych linii wygląda z boku tak:
wtedy funkcja jasności po podświetleniu z jednej strony będzie wyglądać następująco:
Oto, co widzisz na swoich obrazach. Powierzchnia czołowa staje się jaśniejsza, a powierzchnia tylna staje się ciemniejsza. Więc nie chcesz różnicować. Musisz zintegrować obraz wzdłuż kierunku oświetlenia, aby uzyskać oryginalną mapę wysokości powierzchni (w przybliżeniu). Wtedy łatwiej będzie dopasowywać różne elementy, niezależnie od tego, czy transformacja Hougha, dopasowanie szablonu lub cokolwiek innego.
Nie jestem pewien, jak zautomatyzować wyszukiwanie kierunku oświetlenia. Jeśli to samo dla wszystkich twoich zdjęć, świetnie. W przeciwnym razie musisz znaleźć największą linię kontrastu i założyć, że światło jest do niej prostopadłe lub coś w tym rodzaju. Na przykład obróciłem obraz ręcznie w kierunku, który uważałem za właściwy, przy świetle padającym z lewej strony:
Musisz jednak również usunąć wszystkie zmiany niskiej częstotliwości na obrazie, aby podświetlić tylko szybko zmieniające się funkcje podobne do linii. Aby uniknąć artefaktów dzwonienia, użyłem rozmycia Gaussa 2D, a następnie odjąłem go od oryginału:
Integracja (suma skumulowana) może łatwo ulec ucieczce, co powoduje powstawanie poziomych smug. Usunąłem je za pomocą kolejnego górnoprzepustowego gaussowskiego, ale tym razem tylko w kierunku poziomym:
Teraz aparaty szparkowe są dookoła białymi elipsami, zamiast białych w niektórych miejscach i czarnych w innych.
Oryginalny:
Zintegrowany:
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)
Hough przekształcać może być stosowana do wykrywania elipsy grzbiet jak ten, wykonany z „pikseli krawędzi”, choć jest to bardzo drogie w obliczeniach i pamięci, i nie są one doskonałe elipsy tak musiałby to być trochę „niechlujstwa” detektora. Nigdy tego nie robiłem, ale istnieje wiele wyników Google dotyczących „ wykrywania elipsy ”. Powiedziałbym, że jeśli wykryjesz jedną elipsę w drugiej, w obrębie określonej przestrzeni poszukiwań, należy ją zaliczyć do stomii.
Zobacz także: