Cum se creează o mască binară a unei imagini

Consideră o imagine (img) ca

introduceți descrierea imaginii aici

Vreau să creez o mască binară care va acoperă exact primul plan.

Dacă fac următoarele

b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned] 

primesc

introduceți descrierea imaginii aici

Puteți vedea că capul nu este complet alb așa cum doriți și acest lucru poate fi datorită faptului că fundul capului este conectat la limita imaginii. În al doilea rând, lângă gât (așa cum este indicat de linia verde), unii pixeli sunt negri, care ar trebui să fie albi.

introduceți descrierea imaginii aici

Cum pot rezolva aceste două probleme?

Comentarii

  • Puteți încerca MorphologicalBinarize în loc de Binarize și, de asemenea, să vă jucați cu al doilea argument.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] este un bun punct de plecare.

Răspuns

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

imagine

Un contur neted (datorită Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

imagine

Răspuns

Această abordare utilizează ImageData să lucreze pe linii, mai degrabă decât pe întreaga imagine. După câteva manipulări, detectează primul și ultimul pixel alb pe fiecare linie și întoarce întregul segment la 1 (adică alb).

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 

introduceți descrierea imaginii aici

Răspuns

Cu GrowCutComponents[], se poate obține acest lucru:

introduceți descrierea imaginii aici

Un pic de ridicare cu Dilatare / Eroziune va îmbunătăți probabil rezultatul.

Cum se utilizează GrowCutComponents[]?

trebuie să creați cele 2 măști și să evaluați următoarele:

introduceți descrierea imaginii aici

Se pot crea măștile cu Instrumente de desen vezi aici

Răspuns

Iată o altă soluție motivată de Alexey.

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

The rezultatul este:

introduceți descrierea imaginii aici

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *