Méthode de traitement d'image pour la sélection hérissée

11

J'ai une entrée sous forme d'image binaire 3D et la sortie préférée ci-dessous:

Contribution:

CONTRIBUTION

Sortie préférée:

PRODUCTION

Quelles méthodes de traitement d'image devrais-je rechercher si je ne souhaite conserver que les objets hérissés, tout comme la sortie préférée ci-dessus?

Karl
la source
Qu'entendez-vous par image binaire 3D ? Pouvez-vous facilement segmenter l'image en parties individuelles?
bjoernz
Par 3D, je veux dire que c'est une image tomographique.
Karl
1
Pouvez-vous expliquer ce qu'est un spikyobjet? Qu'est-ce qui l'appelle vraiment épineux? quelles sont les principales caractéristiques pour repérer les objets hérissés?
Dipan Mehta
Un objet hérissé dans ce cas est une zone 3D qui n'est pas lisse et a ces formes épineuses partout.
Karl

Réponses:

19

Il y a plus de coins sur les bords de votre "objet hérissé", donc une approche serait de régler un détecteur de coin pour cela.

Par exemple, j'ai calculé le déterminant du tenseur de structure (code Mathematica ci-dessous) d'une image transformée en distance:

entrez la description de l'image ici

La binarisation avec hystérésis donne cette image, qui devrait être un bon point de départ pour l'algorithme de segmentation de votre choix:

entrez la description de l'image ici

Code Mathematica ( srcest l'image source que vous avez publiée)

Dans un premier temps, je calcule une transformation de distance de l'image d'entrée. Cela crée des contrastes sur toute la zone de l'objet (au lieu de simplement la bordure), de sorte que l'objet entier peut être détecté.

dist = ImageData[DistanceTransform[src]];

Je prépare ensuite les composants du tenseur de structure . La taille du filtre pour les dérivées gaussiennes si 5, la taille de la fenêtre est 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];   

Pour calculer le filtre d'angle à chaque pixel, je les branche simplement au déterminant symbolique du tenseur de structure:

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

Ce qui est essentiellement le même que:

corners = gx2 * gy2 - gxy * gxy;

La conversion en une image et sa mise à l'échelle dans une plage de 0..1 donne l'image du détecteur de coin ci-dessus.

Enfin, la binariser avec les bons seuils donne l'image binaire finale:

MorphologicalBinarize[Image[corners], {0.025, 0.1}]
Niki Estner
la source
Réponse très cool! =)
Phonon
Vos réponses sont incroyables, j'apprends beaucoup d'eux.
Andrey Rubshtein