Bildverarbeitungsmethode für die stachelige Auswahl

11

Ich habe eine Eingabe als 3D-Binärbild und die bevorzugte Ausgabe unten:

Eingang:

EINGANG

Bevorzugte Ausgabe:

AUSGABE

Nach welchen Bildverarbeitungsmethoden sollte ich suchen, wenn nur die stacheligen Objekte übrig bleiben sollen, genau wie bei der obigen bevorzugten Ausgabe?

Karl
quelle
Was meinst du mit 3D-Binärbild ? Können Sie das Bild einfach in einzelne Teile unterteilen?
Bjoernz
Mit 3D meine ich, dass es ein tomographisches Bild ist.
Karl
1
Können Sie erklären, was spikyObjekt ist? Was nennt es wirklich stachelig? Was sind die Schlüsselmerkmale, um stachelige Objekte zu erkennen?
Dipan Mehta
Ein stacheliges Objekt ist in diesem Fall ein 3D-Bereich, der nicht glatt ist und überall diese dornartigen Formen aufweist.
Karl

Antworten:

19

Es gibt mehr Ecken an den Grenzen des „stacheligen Objekts“, so ein Ansatz zur Melodie sein , würde Ecke Detektor für diesen.

Zum Beispiel habe ich die Determinante des Strukturtensors (Mathematica-Code unten) eines entfernungstransformierten Bildes berechnet:

Geben Sie hier die Bildbeschreibung ein

Das Binarisieren mit Hysterese ergibt dieses Bild, das ein guter Ausgangspunkt für den Segmentierungsalgorithmus Ihrer Wahl sein sollte:

Geben Sie hier die Bildbeschreibung ein

Mathematica-Code ( srcist das Quellbild, das Sie gepostet haben)

Zuerst berechne ich eine Entfernungstransformation des Eingabebildes. Dies erzeugt Kontraste über den gesamten Objektbereich (anstatt nur über den Rand), sodass das gesamte Objekt erkannt werden kann.

dist = ImageData[DistanceTransform[src]];

Als nächstes bereite ich die Komponenten des Strukturtensors vor . Die Filtergröße für die Gaußschen Ableitungen beträgt bei 5 die Fenstergröße 20.

gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];   

Um den Eckfilter für jedes Pixel zu berechnen, füge ich diese einfach in die symbolische Determinante des Strukturtensors ein:

corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};

Welches ist im Grunde das gleiche wie:

corners = gx2 * gy2 - gxy * gxy;

Wenn Sie dies in ein Bild konvertieren und auf den Bereich 0..1 skalieren, erhalten Sie das obige Eckendetektorbild.

Wenn Sie es schließlich mit den richtigen Schwellenwerten binärisieren, erhalten Sie das endgültige binäre Bild:

MorphologicalBinarize[Image[corners], {0.025, 0.1}]
Niki Estner
quelle
Sehr coole Antwort! =)
Phonon
Ihre Antworten sind erstaunlich, ich lerne viel von ihnen.
Andrey Rubshtein