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 :