Considera unimmagine (img
) come
Voglio creare una maschera binaria che coprire esattamente il primo piano.
Se eseguo quanto segue
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
ottengo
Puoi vedere che la testa non è completamente bianca come desiderato e potrebbe essere a causa del fatto che la parte inferiore della testa è collegata al confine dellimmagine. In secondo luogo, vicino al collo (come indicato dalla linea verde), alcuni pixel sono neri, che dovrebbero essere bianchi.
Come posso risolvere questi due problemi?
Commenti
Risposta
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Una struttura smussata (grazie a Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Risposta
Questo approccio utilizza ImageData
lavorare sulle linee, piuttosto che sullintera immagine. Dopo alcune manipolazioni, rileva il primo e lultimo pixel bianco su ogni riga e trasforma lintero segmento in 1
(cioè bianco).
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
Risposta
Con GrowCutComponents[]
, si può ottenere questo:
Un po di sollevamento con Dilatazione / Erosione probabilmente migliorerà il risultato.
Come usare GrowCutComponents[]
?
devi creare le 2 maschere e valutare quanto segue:
Si possono creare le maschere con gli strumenti di disegno vedi qui
MorphologicalBinarize
invece diBinarize
e giocare anche con il secondo argomento.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
è un buon punto di partenza.