Die beste Methode zur Segmentierung von Adern in Blättern?


47

Ich habe viel recherchiert und Methoden wie adaptives Thresholding, Wasserscheide usw. herausgefunden, mit denen sich Venen in Blättern nachweisen lassen. Die Schwellenwerte sind jedoch nicht gut, da sie viel Lärm verursachen

Alle meine Bilder sind Graubilder, bitte könnte jemand vorschlagen, welche Ansätze zu übernehmen sind, während ich dieses Problem in Betracht ziehe, das dringend Hilfe benötigt

EDIT: Mein Originalbild

Bildbeschreibung hier eingeben

Nach dem Schwellenwert

Bildbeschreibung hier eingeben

Wie in der Antwort vorgeschlagen, habe ich die folgende Kantenerkennung versucht

  1. Canny

Zu viel Lärm und unerwünschte Störungen

Bildbeschreibung hier eingeben

  1. Sobel

Bildbeschreibung hier eingeben

  1. Roberts

Bildbeschreibung hier eingeben

BEARBEITEN: Versuchte eine weitere Operation, ich erhalte das folgende Ergebnis, das besser ist als das, was ich mit schlau und anpassungsfähig versucht habe. Was fühlst du?

Bildbeschreibung hier eingeben


Könnten Sie uns bitte einige Bilder zeigen?
Jonas

Ich habe Bilder hinzugefügt
vini

@vini Tun Sie dies derzeit als Vorverarbeitungsschritt, um später eine gute Vorlagenübereinstimmung zu erhalten? Wie haben Sie das zweite Bild durch einfaches Schwellenwertverfahren erhalten?
Spacey

Mein Ziel ist es, das bestmögliche Ergebnis bei der Segmentierung der Adern zu erzielen, sodass meine Ausgabe keine Streuartefakte enthält. Ich habe Adaptive Thresholding verwendet, um das zweite Bild zu erhalten
vini

Aus den von Ihnen angegebenen Bildern geht hervor, dass Sie (verschiedene) Filter für ein Bild mit Schwellenwerten verwenden. Dies führt zu äußerst schlechten Ergebnissen. Sie sollten die Filter für das Originalbild verwenden und dann die Ausgabe eingrenzen.
Benjohn

Antworten:


56

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:

Proben filtern

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:

Bildbeschreibung hier eingeben

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:

Bildbeschreibung hier eingeben

Das erklärt auch das "doppelte Linienmuster" in den Ergebnissen des Canny-Kantendetektors:

Bildbeschreibung hier eingeben

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)12x22gx2+xy2gxy+12y22gy2+xgx+ygy+g(0,0)

oder in Matrixform:

g(x,y)12(xy).(2gx22gxy2gxy2gy2).(xy)+(xy).(gxgy)+g(0,0)

Die Ableitungsmatrix zweiter Ordnung heißt " Hessische Matrix ". Es beschreibt die Struktur 2. Ordnung, an der wir interessiert sind.(2gx22gxy2gxy2gy2)

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:

Bildbeschreibung hier eingeben

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 :

Firstfilter

Wie Sie sehen, gibt es für jede dünne dunkle Linie nur einen einzigen Peak. Ausbeuten binarisieren und skelettieren:

Bildbeschreibung hier eingeben

Nachdem ich das Skelett beschnitten und kleine Komponenten (Rauschen) aus dem Bild entfernt habe, erhalte ich das folgende endgültige Skelett:

Bildbeschreibung hier eingeben

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+Hxx2+4Hxy22HxxHyy+Hyy2)

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


Ja, das ist genau das, was ich will, aber ich mache es in Matlab und es ist schwierig, ein Äquivalent des Firstfilters zu finden
vini

1
@nikie Sehr nette Antwort - Frage - können Sie bitte den Unterschied zwischen einem Kantendetektor und einem Kantendetektor für uns Nicht-Bildverarbeiter erläutern?
Spacey

@Mohammad: Ich habe es versucht, ich hoffe, ich habe es jetzt etwas klarer gemacht, trotz der Mathematik
Niki Estner

Ich habe versucht, Kantenfilter gibt keine zufriedenstellenden Ergebnisse
Vini

2
@vini: "gibt keine zufriedenstellenden Ergebnisse" sagt mir nicht wirklich viel. Erhalten Sie dasselbe Ergebnisbild wie das, das ich gepostet habe? Was ist "nicht zufriedenstellend"?
Niki Estner

6

Bei Verwendung der Canny-Kantenerkennung (in Halcon) mit Alpha = 1 und der unteren Schwelle 8 und der oberen Schwelle 13 (auf einer Skala von 1 bis 255) erhalte ich das folgende Ergebnis:

Canny Kantenerkennungsblatt

Durch die Optimierung der Parameter können Sie das Ergebnis von Canny deutlich verbessern. Mit diesem Bild können Sie die kurzen Kanten überspringen, um das Rauschen zu beseitigen, und die langen Kanten verbinden, um das Endergebnis zu erzielen.

Übrigens: Eine andere Farbe zeigt eine andere Kante an.

Mit diesem Online-Canny-Kantendetektor kann ich ein ziemlich ähnliches Ergebnis erzielen :

  • Wähle Bild I9Pxl.png
  • Sigma 1.2
  • T-low 0,04
  • T-hoch 0,07
  • Andere Einstellungen sind Standard
  • Klicken Sie auf Ansicht aktualisieren, um das Ergebnis anzuzeigen

Danke :) Ich denke, Canny ist einfach das Beste;) Übrigens, wenn Sie Canny auf Ihr Ergebnis anwenden, werden Sie möglicherweise noch bessere Ergebnisse erzielen.
Geerten

Übrigens: Wenn Sie nicht bemerkt haben: Was sind die Einschränkungen eines Canny-Kantendetektors? Hier können Sie Ihre Meinung abgeben!
Dipan Mehta

Wenn Sie mir sagen: Ich habe bereits meine Meinung zu Ihrer Frage abgegeben. Wenn Sie einen allgemeinen Kommentar abgeben: Ich werde diesen Kommentar löschen.
Geerten

Oh ja, das habe ich nicht gemerkt!
Dipan Mehta

Vielen Dank für Ihre Antwort, aber canny bewahrt keine feinen Details von Adern in Blättern, die nicht erkannt werden, wie Sie gezeigt haben ...
vini

6

In Anlehnung an die obige hervorragende Antwort erfahren Sie hier, wie Sie mit Hilfe von Scikit-Funktionen in Python vorgehen.

from skimage.feature import hessian_matrix, hessian_matrix_eigvals

#assume you have an image img

hxx, hxy, hyy = hessian_matrix(img, sigma=3)
i1, i2 = hessian_matrix_eigvals(hxx, hxy, hyy)

#i2 is the variable you want.

#Visualise the result
import matplotlib.pyplot as plt
plt.imshow(i2)

Was imgsoll sein Ich habe eine pngDatei und es funktioniert nicht.
Sigur

img sollte ein 2d numpy Array sein.
Matthew Shun-Shin

Ist tatsächlich i1der größere der Eigenwerte, so sollten Sie diesen verwenden.
Rob

Dies ist die klarste Erklärung, die ich je gesehen habe!
Eureka,

3

Anstelle von Schwellenwerten habe ich eine einfache Kantenerkennung angewendet.

Verwendetes GIMP mit Gaußscher Differenz - Radious Outer: 3.0 und Inner: 1.0.

Hier sieht es so aus.

Bildbeschreibung hier eingeben

Sie können außerdem einen Medianfilter oder eine Erosion / Dilatation anwenden, um körnige Geräusche zu entfernen.

Hier ist die Seite , die die Implementierung von gimp erklärt.

Sie sollten sich auf verschiedene Techniken beziehen, z. B. Laplace nach Gauß oder Differenz nach Gauß usw. Siehe hierzu: http://homepages.inf.ed.ac.uk/rbf/HIPR2/log.htm#7

Und diese Antwort. Wie wird der Laplace für die Unscharfe Maske verwendet?


GIMP? ist welcher Kantendetektor?
Vini

1
Nein - es ist ein Bildbearbeitungspaket. Es war eine schnelle Überprüfung - nur um einen Punkt vorzustellen. - Verwenden Sie die Kantenerkennung im Gegensatz zur Schwellenwertermittlung.
Dipan Mehta

Welchen Kantendetektor verwendet GIMP? Es tut mir leid, dass ich sehr wenig darüber weiß
vini

@vini hat einen Verweis hinzugefügt.
Dipan Mehta

3

Dieses Thema hat seit jeher großes Interesse auf sich gezogen, und dennoch besteht kein wirklicher Konsens zu diesem Thema. Deshalb habe ich beschlossen, ein paar Worte fallen zu lassen.

Meine Antworten auf zuvor gestellte ähnliche Fragen zum Stapelaustausch ( Q1 und Q2 ) enthielten einen Subpixel-Algorithmus zur Extraktion krummliniger Strukturen von Steger. Diese Methode hat in vielen Fällen einigermaßen gute Ergebnisse erzielt, zum Glück auch diese. Deshalb poste ich das Ausgabebild hier: Bildbeschreibung hier eingeben und hier mit einer anderen Parametereinstellung und ohne Bildbeschreibung hier eingebenVerknüpfungsfarbe : Für die Details und korrekten Verweise siehe bitte die Stapelwechselpfosten, auf die ich verwiesen habe.


0

Im Rahmen meines letzten Studienjahres musste ich Segmentierungsmethoden für Blutgefäße in Augenhintergrundbildern untersuchen. Ich fand diese Baumrekonstruktionsmethode (von Cohen, Laurent D. und Mille, Julien) besonders interessant, um sie zusammen mit Fast-Marching-Methoden zu verwenden.

Weitere Artikel, die Sie möglicherweise lesen möchten:

  • Geodätische aktive Konturen
  • Zur Implementierung schneller Marschmethoden für 3D-Gitter
  • Multistencils FMM: Eine hochpräzise Lösung für die Eikonal-Gleichung für kartesische Domänen

Nützliche Links: - Frontausbreitung in 2D und 3D

Ich hoffe, das hilft ein bisschen, obwohl es nicht gerade auf dem neuesten Stand der Technik ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.