Hur man skapar en binär mask av en bild

Betrakta en bild (img) som

ange bildbeskrivning här

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

ange bildbeskrivning här

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.

ange bildbeskrivning här

Hur kan jag åtgärda dessa två problem?

Kommentarer

  • Du kan prova MorphologicalBinarize istället för Binarize och även spela med det andra argumentet.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] är en bra utgångspunkt.

Svar

img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10] 

bild

En jämn kontur (tack vare Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

bild

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 

ange bildbeskrivning här

Svar

Med GrowCutComponents[] kan man få detta:

ange bildbeskrivning här

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:

ange bildbeskrivning här

Man kan skapa maskerna med ritverktyg se här

Svar

Här är en annan lösning motiverad av Alexey.

Opening[DeleteSmallComponents[ ColorNegate[ RegionBinarize[img, {{1, 1}}, 0.1, Method -> "MeanEuclidean"]], CornerNeighbors -> False], 1] 

resultatet är:

ange bildbeskrivning här

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *