Contando o número de objetos cruzados pela borda da imagem no MATLAB

9

Eu tenho uma imagem RGB com vários sinais. Meu principal objetivo é contar os sinais que estão em contato com as bordas da imagem.

Abordagem e problema

Comecei carregando a imagem [Fig. 1], depois o converteu em escala de cinza e aplicou um filtro mediano para eliminar algum ruído [Fig. 2] Então eu o binarizei com um limite de 0,2, o que resultou na Figura 3. Nesse momento, obtive minha imagem binarizada, mas o problema é que algumas partes que pertencem ao mesmo sinal estão aparecendo em várias regiões, em vez de apenas uma. Agora, meu objetivo é mesclar as regiões que pertencem ao mesmo objeto, para que eu possa usar bwlabelpara contar quantos sinais existem na imagem e imclearborderpara me livrar dos que estão na borda e usar bwlabelnovamente para obter a diferença entre os dois.

Minha abordagem foi a utilização bwmorph, Dilatepara dilatar os objetos e, em seguida, tentar preenchê-los com imfill, holes. Mas o problema é que, se eu os dilatar em pequena quantidade [Fig. 4], eles imfillnão parecem preenchê-los, se eu os dilatar bastante [Fig 5] todos os objetos começam a se fundir :(

Código

img=im2double(imread('image.png')); figure, imshow(img) 
img_gray=rgb2gray(img); imshow(img_gray);                                 
img_mediana=medfilt2(img_gray, [3 3]); figure, imshow(img_mediana);       
img_bin=im2bw(img_mediana, 0.2); imshow(img_bin)
img_dilate=bwmorph(img_bin, 'Dilate', 10); imshow(img_dilate)
img_fill=imfill(img_dilate, 'Holes'); figure, imshow(img_fill)

Figuras

Fig 1 :

Fig 1 http://dl.dropbox.com/u/5272012/1.png

Fig 2 :

fig 2 http://dl.dropbox.com/u/5272012/2.png

Fig 3 :

fig 3 http://dl.dropbox.com/u/5272012/3.png

Fig 4 :

fig 4 http://dl.dropbox.com/u/5272012/4.png

Fig 5 :

fig 5 http://dl.dropbox.com/u/5272012/5.png

Rui Trovisco
fonte
Minha pergunta é o que exatamente diz que o sinal está quebrado? Como você deseja realmente colocar a saída? Quero dizer - você só quer Colorir todos os sinais que são cortados? ou você realmente deseja listar cada sinal e classificar corte / cheio?
Dipan Mehta

Respostas:

3

Na minha opinião, a erosão por dilatação é uma ferramenta muito básica. Você tem uma base de informações muito forte e uma imagem de entrada bastante decente para tomar essas decisões.

Aqui está a minha opinião:

  1. Dado um sucesso razoável que você demonstrou passar da Figura 1 a 3, é possível identificar e segmentar sinais individuais.

  2. Supondo que você já conheceu sinais anteriormente, você pode aplicar algoritmos rápidos decentes para fazer a correspondência de padrões. Caso os padrões exatos não sejam conhecidos, você pode apenas identificar a forma externa do padrão.

  3. Com base na classificação, você sempre pode definir o centróide de cada padrão correspondente e sua respectiva largura e altura. Se a posição X, Y do centróide estiver muito próxima da borda - ou seja, ou forma estiver fora da borda, da mesma forma, você também poderá aplicar o eixo Y.centroEud(x)<0 0centroEud(x)>EumumageWEudth-shumapeWEudth

  4. Dado que você está preocupado apenas com o que cai na borda - você deve começar apenas com cada borda e iniciar a correspondência de padrões lá. Comece combinando o padrão / forma parcial e se o padrão / forma parcial faz jogo esse objeto ESTÁ sendo cortado no limite.

Aqui estão algumas referências que podem ajudá-lo a formular bem o problema.

Este documento é muito bom para entender muitos conceitos básicos sobre sinais / tokens com os quais você está lidando.

Recuperação baseada em formas de Anil K. Jain e Aditya Vailaya : um estudo de caso com bancos de dados de imagens de marcas registradas Reconhecimento de padrões 1998, vol. 31, no9, pp. 1369-1390

Existem muitos elementos de pesquisa que tratam da correspondência parcial / ocluída de forma / padrão.

Eli Saber, Yaowu Xu, A. Murat Tekalp Reconhecimento parcial de forma por correspondência sub-matricial para identificação de imagem guiada por correspondência parcial Reconhecimento de Padrão 38 (2005) 1560 - 1573

Expandirá esta resposta para consultas mais específicas se você seguir essa abordagem.

Dipan Mehta
fonte
Ei! Não posso usar a correspondência de padrões porque isso levará muito tempo e muito trabalho computacional. Além disso, a escala dos objetos (sinais) pode ser variável (o professor nos fornece imagens aleatórias em que a escala dos sinais pode variar de + 30% a -30%, portanto, uma correspondência de padrões é inútil. para resolver este.
Rui Trovisco
@RuiTrovisco Eu entendo isso. É por isso que eu meio que escrevi - eu melhoraria a resposta com base nos seus comentários. Eu coloquei alguns comentários sobre sua pergunta. Por favor, volte aqui.
Dipan Mehta
1

Aqui está uma pequena inspiração mostrando o oposto do que você está procurando.

Comece com a fig3.

% Find background
labels = bwlabel(~fig3);
[n,idx] = hist(labels(:),0:max(labels(:)));
[bgrSize bgrLableIdx] = max(n);
bgr = (labels == idx(bgrLableIdx));
bgr = imopen(bgr,strel('disk',3));

% Remove border objects and cleanup
borderCleared = imclearborder(~bgr);
borderCleared = imopen(borderCleared,strel('disk',3));

insira a descrição da imagem aqui

mola
fonte