Betrakta en bild (img
) som
Jag vill skapa en binär mask som täck exakt förgrunden.
Om jag gör följande
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
får jag
Du kan se att huvudet inte är helt vitt som önskat och detta kan vara på grund av att huvudets botten är ansluten till bildens gräns. För det andra, nära halsen (som anges med den gröna linjen), är vissa pixlar svarta som ska vara vita.
Hur kan jag åtgärda dessa två problem?
Kommentarer
Svar
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
En jämn kontur (tack vare Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Svar
Denna metod använder ImageData
att arbeta på linjerna snarare än hela bilden. Efter några manipuleringar detekterar den första och sista vita pixeln på varje rad och vrider hela segmentet till 1
(dvs. vit).
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
Svar
Med GrowCutComponents[]
kan man få detta:
Lite lyft med Dilation / Erosion kommer troligen att förbättra resultatet.
Hur man använder GrowCutComponents[]
?
du måste skapa de två maskerna och utvärdera följande:
Man kan skapa maskerna med ritverktyg se här
MorphologicalBinarize
istället förBinarize
och även spela med det andra argumentet.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
är en bra utgångspunkt.