Considere una imagen (img
) como
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
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.
¿Cómo puedo solucionar estos dos problemas?
Comentarios
Respuesta
img2 = FillingTransform@ GeodesicClosing[MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False], 10]
Un contorno suavizado (gracias a Rahul ):
Binarize@CurvatureFlowFilter[img2, 3]
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
Responder
Con GrowCutComponents[]
, se puede obtener esto:
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:
Se pueden crear las máscaras con las herramientas de dibujo ver aquí
MorphologicalBinarize
en lugar deBinarize
y también jugar con el segundo argumento.MorphologicalBinarize[img, {.1, .5}, CornerNeighbors -> False]
es un buen punto de partida.