Considere uma imagem (img
) como
Eu quero criar uma máscara binária que irá cobrir exatamente o primeiro plano.
Se eu fizer o seguinte
b = DeleteSmallComponents@FillingTransform@Binarize[img]; skeleton = SkeletonTransform[b]; pruned = Pruning[skeleton, 1, 1]; mask = InverseDistanceTransform[pruned]
Eu entendo
Você pode ver que a cabeça não é completamente branca como desejado e isso pode ser devido ao fato de que a parte inferior da cabeça está conectada ao limite da imagem. Em segundo lugar, perto do pescoço (conforme indicado pela linha verde), alguns pixels são pretos, que deveriam ser brancos.
Como posso corrigir esses dois problemas?
Comentários
Resposta
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Um contorno suavizado (graças a Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
Resposta
Esta abordagem usa ImageData
trabalhar nas linhas, em vez de na imagem inteira. Após algumas manipulações, ele detecta o primeiro e o último pixel branco em cada linha e transforma todo o segmento em 1
(ou seja, branco).
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
Resposta
Com GrowCutComponents[]
, pode-se obter isto:
Um pouco de elevação com Dilatação / Erosão provavelmente melhorará o resultado.
Como usar GrowCutComponents[]
?
você deve criar as 2 máscaras e avaliar o seguinte:
É possível criar as máscaras com Ferramentas de Desenho veja aqui
MorphologicalBinarize
em vez deBinarize
e também brincar com o segundo argumento.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
é um bom ponto de partida.