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 bwlabel
para contar quantos sinais existem na imagem e imclearborder
para me livrar dos que estão na borda e usar bwlabel
novamente para obter a diferença entre os dois.
Minha abordagem foi a utilização bwmorph
, Dilate
para 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 imfill
nã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 :
fonte
Respostas:
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:
Dado um sucesso razoável que você demonstrou passar da Figura 1 a 3, é possível identificar e segmentar sinais individuais.
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.
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.c e n t r o i d( x ) < 0 c e n t r o i d( X ) > i m um ge w i dt h - s h a p e w i dt h
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.
fonte
Aqui está uma pequena inspiração mostrando o oposto do que você está procurando.
Comece com a fig3.
fonte