Betrachten Sie ein Bild (img
) als
Ich möchte eine binäre Maske erstellen, die dies ermöglicht Decken Sie den Vordergrund genau ab.
Wenn ich Folgendes tue
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
Ich erhalte
Sie können sehen, dass der Kopf nicht wie gewünscht vollständig weiß ist aufgrund der Tatsache, dass die Unterseite des Kopfes mit der Bildgrenze verbunden ist. Zweitens sind in der Nähe des Halses (wie durch die grüne Linie angezeigt) einige Pixel schwarz, die weiß sein sollten.
Wie kann ich diese beiden Probleme beheben?
Kommentare
- Sie können
MorphologicalBinarize
anstelle vonBinarize
versuchen und auch mit dem zweiten Argument spielen. -
MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
ist ein guter Ausgangspunkt.
Antwort
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Eine geglättete Kontur (dank Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Antwort
Dieser Ansatz verwendet ImageData
an den Linien arbeiten und nicht am ganzen Bild. Nach einigen Manipulationen erkennt es das erste und letzte weiße Pixel in jeder Zeile und dreht das gesamte Segment auf 1
(dh weiß).
img = Import["https://i.stack.imgur.com/Mw1iJ.png"] edges = EdgeDetect[img, 2] data = ImageData@edges; Table[line = data[[j]]; pos = Flatten@Position[line, 1]; If[Length[pos] > 1, data[[j, pos[[1]] ;; pos[[-1]]]] = 1]; , {j, Length@data}]; Image@data
Antwort
Mit GrowCutComponents[]
kann man Folgendes erhalten:
Ein wenig Heben mit Dilatation / Erosion wird wahrscheinlich das Ergebnis verbessern.
Wie verwende ich GrowCutComponents[]
?
Sie müssen die 2 Masken erstellen und Folgendes auswerten:
Sie können die Masken mit den Zeichenwerkzeugen siehe hier