Como criar uma máscara binária de uma imagem

Considere uma imagem (img) como

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui

Como posso corrigir esses dois problemas?

Comentários

  • Você pode tentar MorphologicalBinarize em vez de Binarize e também brincar com o segundo argumento.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] é um bom ponto de partida.

Resposta

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

imagem

Um contorno suavizado (graças a Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

imagem

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 

insira a descrição da imagem aqui

Resposta

Com GrowCutComponents[], pode-se obter isto:

insira a descrição da imagem aqui

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:

insira a descrição da imagem aqui

É possível criar as máscaras com Ferramentas de Desenho veja aqui

Resposta

Aqui está outra solução motivada por Alexey.

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

O o resultado é:

insira a descrição da imagem aqui

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *