Le but de cette application est de numériser le contenu d'un tableau blanc pris avec un appareil photo ou un téléphone portable. La numérisation inclut le recentrage sur le tableau, la rectification de la distorsion géométrique due à la perspective et la correction de la non-uniformité de l'illumination.
Capture d'un tableau blanc. | Image numérisée. |
La méthode est composée de 5 étapes :
La détection de contours utilise l'opérateur Shen-Castan qui donne une bonne sélection et une bonne localisation des contours et qui permet ensuite d'utiliser une binarisation sans paramètre (la valeur de seuil est fixée à 2 pour toutes les images).
pany2pan whiteboard.png whiteboard.pan prgb2gray 0.299 0.587 0.114 whiteboard.pan tmp3.pan pgaussianfiltering 1 tmp3.pan tmp18.pan pshen 1.3 tmp18.pan tmp6.pan pbinarization 2 255 tmp6.pan whiteboard1.pan | |
Image de contours. |
La détection utilise la transformée de Hough pour repérer parmi les contours extraits les lignes approximativement droites les plus longues. La détection procède séparément pour les lignes horizontales entre -20° et 20°, et les lignes verticales entre 70° et 110°. Pour chacune, une érosion initiale permet de supprimer les petites lignes qui ne sont pas dans la direction étudiée, suivie d'une fermeture par reconstruction. La transformée de Hough permet de conserver les plus grandes lignes droites (ici les 6 plus grandes lignes verticales et les 6 plus grandes lignes horizontales).
# Horizontal plinearerosion 0 0 1 whiteboard1.pan tmp7.pan pdilatationreconstruction 8 tmp7.pan whiteboard1.pan tmp9.pan phoughlines 6 -20 20 10 tmp9.pan tmp19.pan pdilatation 0 1 tmp19.pan tmp25.pan # Vertical plinearerosion 90 0 1 whiteboard1.pan tmp10.pan pdilatationreconstruction 8 tmp10.pan whiteboard1.pan tmp11.pan phoughlines 6 70 110 4 tmp11.pan tmp20.pan pdilatation 0 1 tmp20.pan tmp26.pan por tmp25.pan tmp26.pan whiteboard2.pan | |
Superposition des lignes trouvées sur l'image initiale. |
Détecter le tableau blanc consiste à repérer tous les quadrilatères composés des 4 lignes qui satisfont aux conditions suivantes :
Le quadrilatère retenu est celui qui possède le meilleur rapport périmètre sur le nombre de points sous le bord (avec 3 pixels d'épaisseur).
La sélection du quadrilatère est faite par l'opérateur pgetquandragle.cpp qui retourne une image avec les quatre coins du quadrilatère sélectionné.
pand whiteboard2.pan whiteboard1.pan tmp41.pan pgetquadrangle tmp41.pan whiteboard2.pan whiteboard3.pan | |
Le quadrilatère retenu. |
La correction de l'effet de perspective nécessite le calcul de la matrice 3x3 de transformation des coordonnées de l'image d'entrée dans l'image corrigée. La matrice est calculée à partir de la distance focale estimée de la prise de vue sachant qu'un tableau blanc est un rectangle pur alors que dans l'image il se présente sous la forme d'un quadrilatère. Il suffit de trouver la transformation nécessaire pour passer du quadrilatère au rectangle équivalent.
La transformation est faite par l'opérateur pquadrangle2rectangle.cpp.
pquadrangle2rectangle whiteboard.pan whiteboard3.pan whiteboard4.pan | |
L'image redressée. |
La correction de l'illumination procède par soustraction du fond. Le fond du tableau correspond aux basses-fréquences alors que les caractères d'écriture correspondent aux hautes-fréquences. Le fond est approximé par une fermeture avec un grand élément structurant. L'opération ne s'applique que sur la composante luminosité de l'espace HSL (bande n°2 de l'image HSL). Il est ensuite soustrait de l'image initiale. Il suffit d'ajouter la moyenne des niveaux de gris de l'image du fond estimé pour retrouver les niveaux de gris initiaux.
prgb2hsl whiteboard4.pan tmp34.pan pgetband 0 tmp34.pan tmp44.pan pgetband 1 tmp34.pan tmp45.pan pgetband 2 tmp34.pan tmp36.pan pdilatation 1 5 tmp36.pan tmp37.pan perosion 1 5 tmp37.pan tmp38.pan pmeanvalue tmp38.pan tmp41.pan psub tmp36.pan tmp38.pan tmp40.pan paddval tmp41.pan tmp40.pan tmp42.pan pimg2imc 4 tmp44.pan tmp45.pan tmp42.pan tmp43.pan phsl2rgb tmp43.pan whiteboard5.pan ppan2png whiteboard5.pan result.png | |
L'image retenue. |
Ce script nécessite les 2 opérateurs (pgetquadrangle, pquadrangle2rectangle) compilés (voir le haut de la page).