Método de procesamiento de imagen para selección puntiaguda

11

Tengo una entrada como imagen binaria 3D y la salida preferida a continuación:

Entrada:

ENTRADA

Salida preferida:

SALIDA

¿Qué métodos de procesamiento de imágenes debo buscar si quiero que solo queden los objetos puntiagudos, al igual que el resultado preferido anterior?

Karl
fuente
¿Qué quieres decir con imagen binaria 3D ? ¿Se puede segmentar fácilmente la imagen en partes individuales?
bjoernz
Por 3D quiero decir que es una imagen tomográfica.
Karl
1
¿Puedes explicar qué es el spikyobjeto? ¿Qué lo llama realmente puntiagudo? ¿Cuáles son las características clave para detectar objetos puntiagudos?
Dipan Mehta
Un objeto puntiagudo en este caso es un área 3D que no es suave y tiene estas formas espinosas por todas partes.
Karl

Respuestas:

19

Hay más esquinas en los bordes de su "objeto puntiagudo", por lo que un enfoque sería ajustar un detector de esquinas para esto.

Por ejemplo, calculé el determinante del tensor de estructura (código de Mathematica a continuación) de una imagen transformada a distancia:

ingrese la descripción de la imagen aquí

La binarización con histéresis produce esta imagen, que debería ser un buen punto de partida para el algoritmo de segmentación que elija:

ingrese la descripción de la imagen aquí

Código de Mathematica ( srces la imagen fuente que publicaste)

Al principio, calculo una transformación de distancia de la imagen de entrada. Esto crea contrastes sobre todo el área del objeto (en lugar de solo el borde), por lo que se puede detectar todo el objeto.

dist = ImageData[DistanceTransform[src]];

A continuación preparo los componentes del tensor de estructura . El tamaño del filtro para las derivadas gaussianas es 5, el tamaño de la ventana es 20.

gx = GaussianFilter[dist, 5, {1, 0}];
gy = GaussianFilter[dist, 5, {0, 1}];
gx2 = GaussianFilter[gx^2, 20];
gxy = GaussianFilter[gx*gy, 20];
gy2 = GaussianFilter[gy^2, 20];   

Para calcular el filtro de esquina en cada píxel, simplemente los conecto al determinante simbólico del tensor de estructura:

corners = Det[{{dx2, dxy}, {dxy, dy2}}] /. {dx2 -> gx2, dxy -> gxy, dy2 -> gy2};

Que es básicamente lo mismo que:

corners = gx2 * gy2 - gxy * gxy;

Convirtiendo esto en una imagen y escalando a un rango de 0..1 se obtiene la imagen del detector de esquina de arriba.

Finalmente, binarizarlo con los umbrales correctos da la imagen binaria final:

MorphologicalBinarize[Image[corners], {0.025, 0.1}]
Niki Estner
fuente
Muy buena respuesta! =)
Phonon
Sus respuestas son asombrosas, aprendo mucho de ellas.
Andrey Rubshtein