Compter le nombre d'objets coupés par la bordure de l'image dans MATLAB

9

J'ai une image RVB avec divers signes. Mon objectif principal est de compter les signes en contact avec les bordures de l'image.

Approche et problème

J'ai commencé par charger l'image [Fig. 1], puis converti en niveaux de gris et appliqué un filtre médian pour se débarrasser de certains bruits [Fig. 2]. Ensuite, je l'ai binarisé avec un seuil de 0,2, ce qui a donné la figure 3. À ce moment, j'ai obtenu mon image binarisée, mais le problème est que certaines parties qui appartiennent au même signe apparaissent dans différentes régions, au lieu d'une seule. Maintenant, mon objectif est de fusionner les régions qui appartiennent au même objet, donc je pourrais utiliser bwlabelpour compter le nombre de signes dans l'image, et utiliser imclearborderpour se débarrasser de ceux de la frontière, et réutiliser bwlabelpour obtenir la différence entre les deux.

Mon approche était d'utiliser bwmorph, Dilatepour dilater les objets et ensuite essayer de les remplir imfill, holes. Mais le problème est que si je les dilate en petite quantité [Fig. 4], le imfillne semble pas les remplir, si je les dilate beaucoup [Fig 5] tous les objets commencent à fusionner :(

Code

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)

Les figures

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
la source
Ma question est ce qui vous dit exactement que le signe est cassé? Comment voulez-vous vraiment mettre la sortie? je veux dire - voulez-vous simplement coloriser tous les signes qui sont coupés? ou voulez-vous vraiment lister chaque signe et classer les coupés / pleins?
Dipan Mehta

Réponses:

3

À mon avis, l'érosion par dilatation est un outil très basique. Vous disposez d'une base d'informations très solide et d'une image d'entrée assez décente pour prendre de telles décisions.

Voici mon point de vue:

  1. Étant donné un succès raisonnable que vous avez montré pour passer des figures 1 à 3, vous pouvez identifier et segmenter les signes individuels.

  2. En supposant que vous ayez déjà connu des signes, vous pouvez appliquer des algorithmes rapides décents pour effectuer une correspondance de modèle. Dans le cas où les motifs exacts ne sont pas connus, vous pouvez simplement identifier la forme extérieure du motif.

  3. centroje(X)<0centroje(X)>jemunegewjeth-shunepewjeth

  4. Étant donné que vous ne vous préoccupez que de ce qui tombe sur le bord, vous devez commencer par chaque bord uniquement et commencer la correspondance de modèle à cet endroit. Commencez à faire correspondre le motif / la forme partielle et si le motif / la forme partielle correspond à cet objet EST coupé sur le bord.

Voici quelques références qui pourraient vous aider à bien formuler le problème.

Ce document est très utile pour comprendre de nombreuses notions de base sur les signes / jetons avec lesquels vous traitez.

Anil K. Jain et Aditya Vailaya Shape-Based Retrieval: A Case Study with Trademark Image Databases Pattern Recognition 1998, vol. 31, no9, p. 1369-1390

Il existe de nombreux éléments de recherche qui traitent de la correspondance partielle ou occluse des formes et des motifs.

Eli Saber, Yaowu Xu, A. Murat Tekalp Reconnaissance de forme partielle par correspondance de sous-matrice pour l'étiquetage d'image guidée par correspondance partielle Reconnaissance de formes 38 (2005) 1560 - 1573

Développera cette réponse pour des requêtes plus spécifiques si vous adoptez cette approche.

Dipan Mehta
la source
Hey! Je ne peux pas utiliser la correspondance de motifs car cela prendra très longtemps et demandera trop de travail de calcul. L'échelle des objets (signes) peut également être variable (le professeur nous donne des images aléatoires où l'échelle f des signes peut aller de + 30% à -30%, donc une correspondance de motifs est inutile. J'ai besoin d'une approche plus rapide dans afin de résoudre celui-ci.
Rui Trovisco
@RuiTrovisco Je comprends cela. C'est pourquoi j'ai en quelque sorte écrit - j'améliorerais la réponse en fonction de vos commentaires. J'ai mis quelques commentaires sur votre question. Veuillez y revenir.
Dipan Mehta
1

Voici une petite inspiration montrant le contraire de ce que vous recherchez.

Commencez avec 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));

entrez la description de l'image ici

mola
la source