Método de processamento de imagem para seleção pontiaguda

11

Eu tenho uma entrada como uma imagem binária 3D e a saída preferida abaixo:

Entrada:

ENTRADA

Saída preferida:

RESULTADO

Quais métodos de processamento de imagem devo procurar para que apenas restem os objetos pontiagudos, assim como a saída preferida acima?

Karl
fonte
O que você quer dizer com imagem binária em 3D ? Você pode segmentar facilmente a imagem em partes individuais?
bjoernz
Em 3D, quero dizer, é uma imagem tomográfica.
Karl
1
Você pode explicar o que é spikyobjeto? O que realmente chama de espetado? Quais são as principais características para detectar objetos pontiagudos?
Dipan Mehta
Um objeto pontudo neste caso é uma área 3D que não é lisa e possui essas formas espinhosas por toda parte.
Karl

Respostas:

19

Existem mais cantos nas bordas do seu "objeto pontudo"; portanto, uma abordagem seria ajustar um detector de cantos para isso.

Por exemplo, calculei o determinante do tensor da estrutura (código do Mathematica abaixo) de uma imagem transformada à distância:

insira a descrição da imagem aqui

Binarizar com histerese produz essa imagem, que deve ser um bom ponto de partida para o algoritmo de segmentação de sua escolha:

insira a descrição da imagem aqui

Código do Mathematica ( srcé a imagem de origem que você postou)

Inicialmente, calculo uma transformação de distância da imagem de entrada. Isso cria contrastes em toda a área do objeto (em vez de apenas na borda), para que todo o objeto possa ser detectado.

dist = ImageData[DistanceTransform[src]];

Em seguida, preparo os componentes do tensor da estrutura . O tamanho do filtro para as derivadas gaussianas, se 5, o tamanho da janela é 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 o filtro de canto em cada pixel, basta inseri-los no determinante simbólico do tensor da estrutura:

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

Que é basicamente o mesmo que:

corners = gx2 * gy2 - gxy * gxy;

Convertendo isso em uma imagem e redimensionando-o para o intervalo 0..1, obtém-se a imagem do detector de canto acima.

Finalmente, a binarização com os limites corretos fornece a imagem binária final:

MorphologicalBinarize[Image[corners], {0.025, 0.1}]
Niki Estner
fonte
Resposta muito legal! =)
Phonon
Suas respostas são incríveis, eu aprendo muito com elas.
Andrey Rubshtein 11/11/12