Die Umsetzung einer Harris-corner-Detektor
Ich die Umsetzung einer Harris-corner-Detektor für pädagogische Zwecke, aber ich bin stecken in der harris-Antwort-Teil. Im Grunde, was ich Tue, ist:
- Compute Bild Intensität Gradienten in x - und y-Richtung
- Blur-Ausgang (1)
- Berechnen Harris Reaktion über Ausgabe von (2)
- Unterdrücken nicht-maximas in der Ausgabe von (3) in einer 3x3-Nachbarschaft und grenzleistung
1 und 2 scheinen gut zu funktionieren; allerdings bekomme ich nur sehr kleine Werte, wie der Harris-Antwort und keinen Punkt hat erreichen der Schwelle. Eingang ist eine standard-outdoor-Fotografie.
[...]
[Ix, Iy] = intensityGradients(img);
g = fspecial('gaussian');
Ix = imfilter(Ix, g);
Iy = imfilter(Iy, g);
H = harrisResponse(Ix, Iy);
[...]
function K = harrisResponse(Ix, Iy)
max = 0;
[sy, sx] = size(Ix);
K = zeros(sy, sx);
for i = 1:sx,
for j = 1:sy,
H = [Ix(j,i) * Ix(j,i), Ix(j,i) * Iy(j,i)
Ix(j,i) * Iy(j,i), Iy(j,i) * Iy(j,i)];
K(j,i) = det(H) / trace(H);
if K(j,i) > max,
max = K(j,i);
end
end
end
max
end
Für das Beispiel-Bild, max endet als 6.4163 e-018, die scheint viel zu gering.
InformationsquelleAutor Etan | 2010-10-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer Ecke in der Harris corner detection ist definiert als "der höchste Wert der pixel in einer region" (in der Regel
3X3
oder5x5
), so Ihr Kommentar zu kein Punkt erreichen eines "threshold" scheint mir seltsam. Nur sammeln Sie alle Pixel, die einen höheren Wert als alle anderen Pixel des5x5
Nachbarschaft um Sie herum.Abgesehen davon, dass:
Ich bin mir nicht 100% sicher, aber ich denke, Sie sollten haben:
K(j,i) = det(H) - lambda*(trace(H)^2)
Wo die lambda ist eine positive Konstante, die funktioniert in deinem Fall (und Harris vorgeschlagene Wert ist 0.04).
Im Allgemeinen nur dann sinnvoll, moment filtern Sie Ihre Eingabe, bevor Sie an dieser Stelle:
[Ix, Iy] = intensityGradients(img);
Filterung
Ix2
,Iy2
undIxy
macht nicht viel Sinn für mich.Außerdem denke ich, dass dein Beispiel-code ist hier falsch (funktioniert
harrisResponse
haben zwei oder drei input-Variablen?):Das problem war, dass ich nicht die Summe aller Pixel in dem 3x3-Quadrat zu finden, aus der Ix2 etc; stattdessen habe ich nur die entsprechenden pixel. Nach der änderung von H in einer Weise, dass es fasst alle Ix2, Ixy und Iy2 für alle 9 Pixel, es sehr schön aussieht.
det(H)/Spur(H) ist ein ofen-verwendete Näherung in dem Fall, wo Sie nicht haben einen lambda-Ausdruck.
Ich wusste nicht, über, der den letzten Stich. Schön. Es scheint, Sie lösen das problem selbst, nice!!! (und der alte trick funktioniert immer noch: einfach zu erklären, das problem auf jemanden, der dir hilft, auf die Lösung), ist dies den funktionierenden code ?
InformationsquelleAutor jilles de wit
Vorgeschlagen, die Umsetzung ist furchtbar ineffizient.
Können' start nach der Berechnung von Gradienten (optimiert):
Kein Schleifen erforderlich, da Matlab hasst Schleifen.
C = (Ix.*Iy).^4
statt einfachC = (Ix.*Iy)
?InformationsquelleAutor Piotr
Grundsätzlich Harris corner detection wird in 5 Schritten:
Wenn Sie die Umsetzung in MATLAB, es wird einfach zu verstehen, die der Algorithmus und die Ergebnisse bekommen.
Den folgenden code von MATLAB kann helfen, Sie zu lösen Ihre Zweifel:
InformationsquelleAutor Megha Billure
Die Lösung, die ich umgesetzt mit python, es funktioniert für mich, ich hoffe, Sie finden, was Sie suchen
InformationsquelleAutor Walid Bousseta
Gibt es eine Funktion, für die, die in der Computer Vision System Toolbox genannt
detectHarrisFeatures
.InformationsquelleAutor Dima