Cómo crear una máscara binaria de una imagen

Considere una imagen (img) como

ingrese la descripción de la imagen aquí

Quiero crear una máscara binaria que cubrir exactamente el primer plano.

Si hago lo siguiente

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

obtengo

ingrese la descripción de la imagen aquí

Puede ver que la cabeza no es completamente blanca como se desea y esto puede ser debido al hecho de que la parte inferior de la cabeza está conectada al límite de la imagen. En segundo lugar, cerca del cuello (como lo indica la línea verde), algunos píxeles son negros, que deberían ser blancos.

ingrese la descripción de la imagen aquí

¿Cómo puedo solucionar estos dos problemas?

Comentarios

  • Puedes probar MorphologicalBinarize en lugar de Binarize y también jugar con el segundo argumento.
  • MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False] es un buen punto de partida.

Respuesta

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

imagen

Un contorno suavizado (gracias a Rahul ):

Binarize@CurvatureFlowFilter[img2, 3] 

imagen

Respuesta

Este enfoque utiliza ImageData trabajar en las líneas, en lugar de la imagen completa. Después de algunas manipulaciones, detecta el primer y último píxel blanco en cada línea y convierte todo el segmento en 1 (es decir, blanco).

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 

ingrese la descripción de la imagen aquí

Responder

Con GrowCutComponents[], se puede obtener esto:

ingrese la descripción de la imagen aquí

Un poco de elevación con Dilatación / Erosión probablemente mejorará el resultado.

¿Cómo usar GrowCutComponents[]?

tienes que crear las 2 máscaras y evaluar lo siguiente:

ingrese la descripción de la imagen aquí

Se pueden crear las máscaras con las herramientas de dibujo ver aquí

Responder

Aquí hay otra solución motivada por Alexey.

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

El el resultado es:

ingrese la descripción de la imagen aquí

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *