Bonjour a tous ,
mon problème est d'extraire les immeubles (par exemple en les binarisant) a partir d'une image (RGB) de type carte Mappy,
et donc polluée par un certain nombre d'informations (le texte recouvrant les bâtiments).
Sachant que certains endroits seraient de toute façon a reprendre a la main (typiquement là où un panneau recouvre un immeuble sur la carte).
A partir d'une certaine suite de traitements (morphologie mathématique : érosions, ouvertures, additions, squelettisation etc...)
je parviens a un résultat qui est pas trop trop mal mais qui n'est pas encore top notamment au niveau des zones ou le texte chevauche des bordures d'immeubles.
Je me demande si ce que ce genre de traitement a déjà ete fait ? ou bien qui pourrait me donner des conseils sur le traitement a appliquer ?
Par rapport a mon algo, Je pense qu'un axe d'amélioration pourrait être lors de la reconstruction de ligne rectiligne brisée (dans une image binaire avec les trames des immeubles, rejoindre les 2 bouts d'une ligne à l'endroit ou il y avait du texte).
Est ce que quelqu'un aurait un algo la dessus, ou mieux un code en C?
Je joins 2 images à titre d'exemple de données d'entrée.
Merci !
-----------------------------------------------------------------------
un petit rajout :
Quelques détails sur la démarche que je suis :
(méthode globale, même si je ne detaille pas l'application d'un filtre median ou d'une ouverture de temps a autre pour améliorer le rendu)
extraction uniquement du texte sur l'image d'origine et binarisation (à partir d'un seuillage)
-> imagenoms
extraction sur l'image d'origine de la zone en jaune correspondant uniquement aux bâtiments (grâce a un seuillage sur l'image RGB) et binarisation.
Donc on a des "trous" sur ces batiments (a l'interieur et/ou sur les bords) aux endroits où le texte etait present.
-> image1
rebouchage de ces trous :
pour cela je crée un masque correspondant a la zone bâtiments :
3 érosions sur l'image d'origine, puis seuillage sur l'image RGB de la zone en jaune correspondant aux bâtiments, et binarisation (sur ce masque il n'y a plus les petites séparations entre les immeubles).
je fais un NOR entre ce masque et l'image comprenant uniquement le texte (imagenoms), afin d'obtenir :
une image (binaire) avec le texte présent seulement au niveau des bâtiments.
Puis j'ajoute cette image dans le but de reboucher les trous
-> image2
J'ai maintenant une image binaire où sont présents les immeubles, mais aussi :
- des raccordements entre les immeubles,a l'endroit ou le texte était présent entre 2 immeubles
- des petites excroissances, a l'endroit ou le texte était a cheval entre 1 immeuble et la rue.
pour faire disparaitre les raccordements entre les immeubles, je vais tenter d'isoler ces raccordements, puis de les soustraire a image2 :
dans un premier temps, je me débrouille pour obtenir une image comprenant seulement les lignes entourant les immeubles (s'obtient facilement a partir d'un seuillage sur l'image RGB)
-> image3
J'obtiens cette image, mais un certain nombre de lignes ne sont pas fermées (là ou il y avait du texte), alors pour les fermer au mieux je :
- fais 5 dilate pour allonger les lignes (nombre choisi 1 peu a la louche, assez grand pour qu'il y ait un effet visible mais pas trop pour ne pas mixer plusieurs lignes proches)
- squeletise l'image autant que possible
le résultat est l'image binaire contenant les contours des immeubles, où un certains nombre de segments "troués" se sont recollés. Ce n'est pas le cas des segments où le trou était trop large.
-> image3'
Je multiplie cette image binaire (image3') par l'image binaire contenant les noms, donc le résultat est une image qui contient uniquement les zones où le texte se superpose aux bordures d'immeubles.
Je soustrais cette dernière image à image2 afin de faire disparaitre tant que possible les raccordements entre immeubles.
Partager