Contando el número de objetos intersecados por el borde de la imagen en MATLAB


9

Tengo una imagen RGB con varios signos. Mi objetivo principal es contar los signos que están en contacto con los bordes de la imagen.

Enfoque y problema

Comencé cargando la imagen [Fig. 1], luego lo convirtió a escala de grises y aplicó un filtro mediano para eliminar el ruido [Fig. 2] Luego lo binaré con un umbral de 0.2, que resultó en la Figura 3. En este momento obtuve mi imagen binarizada, pero el problema es que algunas partes que pertenecen al mismo signo están apareciendo en varias regiones, en lugar de solo una. Ahora mi objetivo es fusionar las regiones que pertenecen al mismo objeto, de modo que pueda usar bwlabelpara contar cuántos signos hay en la imagen, y usar imclearborderpara deshacerme de los que están en el borde, y usar de bwlabelnuevo para obtener la diferencia entre los dos.

Mi enfoque era utilizar bwmorph, Dilatepara dilatar los objetos y luego tratar de llenarlos con imfill, holes. Pero el problema es que si los dilato en una pequeña cantidad [Fig. 4], imfillparece que no los llena, si los dilato en gran cantidad [Fig. 5] todos los objetos comienzan a fusionarse :(

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)

Cifras

Higo 1 :

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

Higo 2 :

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

Higo 3 :

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

Higo 4 :

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

Higo 5 :

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


Mi pregunta es, ¿qué te dice exactamente que el signo está roto? ¿Cómo quieres realmente poner la salida? Quiero decir, ¿solo quieres colorear todas las señales que están cortadas? o realmente quieres enumerar cada signo y clasificar cortar / completo?
Dipan Mehta

Respuestas:


3

En mi opinión, la erosión por dilatación son herramientas muy básicas. Tiene una base de información muy sólida y una imagen de entrada bastante decente para tomar tales decisiones.

Aquí está mi punto de vista:

  1. Dado un éxito razonable que ha demostrado pasar de la figura 1 a la 3, puede identificar y segmentar signos individuales.

  2. Suponiendo que haya conocido signos anteriormente, puede aplicar algoritmos rápidos decentes para hacer la coincidencia de patrones. En caso de que no se conozcan los patrones exactos, simplemente puede identificar la forma externa del patrón.

  3. Según la clasificación, siempre puede definir el centroide de cada patrón coincidente y su ancho y alto respectivos. Si el centroide X, la posición Y está demasiado cerca del borde, es decir, o forma, está fuera del borde, de manera similar también puede solicitar el eje Y.c e n t r o i d ( x ) > i m a g e w i d t h - s h a p e w i d t hcentroid(x)<0centroid(x)>imagewidthshapewidth

  4. Dado que solo le preocupa lo que cae en el borde, debe comenzar solo con cada borde e iniciar la coincidencia de patrones allí. Comienza coincida con el patrón / forma parcial y si el patrón / forma parcial hace partido que objeto SE está cortando en el borde.

Aquí hay algunas referencias que pueden ayudarlo a formular bien el problema.

Este documento es muy bueno para comprender muchos conceptos básicos sobre los signos / tokens con los que está tratando.

Anil K. Jain y Aditya Vailaya Recuperación basada en forma: un estudio de caso con bases de datos de imágenes de marcas Reconocimiento de patrones 1998, vol. 31, no9, págs. 1369-1390

Hay muchos elementos de investigación que se ocupan de la coincidencia parcial o ocluida de formas / patrones.

Eli Saber, Yaowu Xu, A. Murat Tekalp Reconocimiento parcial de forma mediante coincidencia de submatriz para etiquetado guiado parcial de imágenes Reconocimiento de patrones 38 (2005) 1560 - 1573

Expandirá esta respuesta para consultas más específicas si adopta este enfoque.


¡Oye! No puedo usar la coincidencia de patrones porque eso llevará mucho tiempo y demasiado trabajo computacional. Además, la escala de los objetos (signos) puede ser variable (el profesor nos da imágenes aleatorias donde la escala de los signos puede variar entre + 30% y -30%, por lo que una coincidencia de patrones es inútil. Necesito un enfoque más rápido en para resolver este problema.
Rui Trovisco

@RuiTrovisco Entiendo esto. Es por eso que escribí algo: mejoraría la respuesta en función de sus comentarios. He puesto algunos comentarios sobre tu pregunta. Por favor vuelve allí.
Dipan Mehta

1

Aquí hay una pequeña inspiración que muestra lo contrario de lo que está buscando.

Comience con la 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));

ingrese la descripción de la imagen aquí

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.