Consideră o imagine (img
) ca
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
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.
Cum pot rezolva aceste două probleme?
Comentarii
Răspuns
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Un contur neted (datorită Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
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
Răspuns
Cu GrowCutComponents[]
, se poate obține acest lucru:
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:
Se pot crea măștile cu Instrumente de desen vezi aici
MorphologicalBinarize
în loc deBinarize
și, de asemenea, să vă jucați cu al doilea argument.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
este un bun punct de plecare.