Sie sind nicht auf der Suche nach Kanten (= Grenzen zwischen ausgedehnten Gebieten mit hohem und niedrigem Grauwert), sind Sie auf der Suche nach Stegen (dünne Linien , die dunkler oder heller als ihre Umgebung), so Kantenfilter nicht ideal sein könnte: Ein Kantenfilter wird Gib dir zwei Flanken (eine auf jeder Seite der Linie) und eine niedrige Reaktion in der Mitte der Linie:
ADD : If've gebeten worden , den Unterschied zwischen einem Kantendetektor und ein Grat Detektor deutlicher zu erklären. Ich entschuldige mich im Voraus, wenn diese Antwort sehr lang wird.
Ein Kantendetektor ist (normalerweise) ein Operator der ersten Ableitung: Wenn Sie sich das Eingabebild als 3D-Landschaft vorstellen, misst ein Kantendetektor die Steilheit der Steigung an jedem Punkt dieser Landschaft:
Wenn Sie den Rand eines erweiterten hellen oder dunklen Bereichs erkennen möchten, ist dies in Ordnung. Aber für die Venen im OP-Bild erhalten Sie genau das Gleiche: die Umrisse links und rechts von jeder Vene:
Das erklärt auch das "doppelte Linienmuster" in den Ergebnissen des Canny-Kantendetektors:
Wie erkennt man dann diese dünnen Linien (dh Grate)? Die Idee ist, dass die Pixelwerte (lokal) durch ein Polynom 2. Ordnung angenähert werden können, dh wenn die Bildfunktion , dann für kleine Werte von und :gxy
g(x,y)≈12x2∂2g∂x2+xy∂2g∂x∂y+12y2∂2g∂y2+x∂g∂x+y∂g∂y+g(0,0)
oder in Matrixform:
g(x,y)≈12(xy).⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟.(xy)+(xy).(∂g∂x∂g∂y)+g(0,0)
Die Ableitungsmatrix zweiter Ordnung heißt " Hessische Matrix ". Es beschreibt die Struktur 2. Ordnung, an der wir interessiert sind.⎛⎝⎜∂2g∂x2∂2g∂x∂y∂2g∂x∂y∂2g∂y2⎞⎠⎟
Der Teil 2. Ordnung dieser Funktion kann in die Summe von zwei um einen bestimmten Winkel gedrehten Parabeln werden, indem die obige hessische Matrix in eine Rotation mal einer diagonalen Matrix ihrer Eigenwerte zerlegt wird ( Matrixzerlegung ). Wir kümmern uns nicht um die Rotation (wir möchten Kanten in jeder Ausrichtung erkennen), also sind wir nur an und interessiertλ1x2+λ2y2λ1λ2
Welche Formen kann diese Funktionsnäherung haben? Eigentlich nicht so viele:
Um Grate zu erkennen, möchten wir Bereiche im Bild finden, die wie der letzte der obigen Diagramme aussehen. Daher suchen wir nach Bereichen, in denen der Haupteigenwert des Hessischen (im Vergleich zum Nebeneigenwert) groß ist. Der einfachste Weg, dies zu erkennen, besteht darin, den Haupteigenwert für jedes Pixel zu berechnen - und genau das macht der Ridge-Filter unten.
Ein Firstfilter liefert wahrscheinlich bessere Ergebnisse. Ich habe Mathematics eingebaute Methode RidgeFilter
(die den Haupteigenwert der Hessischen Matrix für jedes Pixel berechnet) in Ihrem Bild ausprobiert :
Wie Sie sehen, gibt es für jede dünne dunkle Linie nur einen einzigen Peak. Ausbeuten binarisieren und skelettieren:
Nachdem ich das Skelett beschnitten und kleine Komponenten (Rauschen) aus dem Bild entfernt habe, erhalte ich das folgende endgültige Skelett:
Vollständiger Mathematica-Code:
ridges = RidgeFilter[ColorNegate@src];
skeleton = SkeletonTransform[Binarize[ridges, 0.007]];
DeleteSmallComponents[Pruning[skeleton, 50], 50]
HINZUFÜGEN:
Ich bin kein Matlab-Experte, ich weiß nicht, ob es einen eingebauten Kantenfilter gibt, aber ich kann Ihnen zeigen, wie Sie ihn "von Hand" implementieren (ebenfalls mit Matematica). Wie gesagt, der Gratfilter ist der Haupteigenwert der Hessischen Matrix. Diesen Eigenwert kann ich in Mathematica symbolisch berechnen:
eigenvalue=Last[Eigenvalues[(HxxHxyHxyHyy)]]
=>12(Hxx+Hyy+H2xx+4H2xy−2HxxHyy+H2yy−−−−−−−−−−−−−−−−−−−−−−−√)
Sie müssen also die zweiten Ableitungen , , (mit einem Sobel oder einer Ableitung des Gaußschen Filters) berechnen und einfügen Geben Sie den Ausdruck oben ein und Sie haben Ihren Kantenfilter. H xy H yyHxxHxyHyy