Introduction
Ce programme permet d'automatiser la retouches des images scannées.
Il effectue différentes opérations:
- re-cadrage de l'image
- application d'un flou gaussien sélectif
- rotation automatique de l'image
- second re-cadrage
- sauvegarde des résultats
Limitations
Le programme ne prend en entrée que des images au format BMP en 24 bits ou en 256 niveaux de gris.
Il sauvegarde les résultats dans le même format.
J'ai l'habitude de faire mes scans de façon à ce que la page soit calée en haut et à gauche de l'image. Le programme ne re-cadre donc l'image qu'en bas et à droite.
Pour l'instant, il n'est compilé que pour Windows.
Utilisation sous windows
Copiez le contenu du répertoire bin ainsi que vos images dans un répertoire de travail.
Ouvrez une invite de commande et placez-vous dans ce répertoire.
Tapez "retouche nom de l'image". Le programme traite automatiquement votre image et sauvegarde le résultat.
Vous pouvez utiliser le script "r.bat" pour traiter toutes les image bmp du répertoire (il suffit de taper "r").
Configuration
Tous les paramètres que vous pouvez modifier se trouvent dans le fichier config.txt, que vous pouvez modifier avec n'importe quel éditeur de texte.
Les différents paramètres étant un peu compliqués à comprendre, je vais vous les décrire au fil d'une explication détaillée de ce que fait le programme sur une image d'exemple. Dans cette explication, vous trouverez les différents paramètres que vous pouvez modifier sous la forme d'un texte en italique entre parenthèses.
Voici l'image de départ sur laquelle nous allons travailler.
Les plus observateurs auront reconnu la page 41 du SVM 52, volontairement scannée de travers en 300 dpi. J'ai scanné cette page avec EasyScan en utilisant le filtre "réduction de impuretés".
La première étape consiste à trouver les dimension de l'image pour la re-cadrer.
On commence par faire la moyenne des couleurs des pixels de la dernière colonne de l'image (la plus à droite). Ca nous donne la couleur de "fond" de l'image.
Pour re-cadrer à droite, une ligne balaye l'image de la droite vers la gauche.
Si dans cette ligne, on rencontre au moins 20 (DETECT_WIDTH) pixels qui se suivent et dont la couleur diffrère d'au moins 25 (DETECT_DIFF) par rapport à la couleur du fond, on s'arrête.
On fait la même chose avec une ligne qui va de bas en haut, et on obtient les dimensions pour couper notre image.
Remarque: j'ai réglé ces 2 valeurs DETECT_WIDTH et DETECT_DIFF pour que ça marche avec mes scans: j'ai l'habitude me mettre une feuille noire derrière la page pour réduire les problèmes de transparence. Il faudra peut-être les modifier un peu si vous ne mettez pas de feuille noire, ou suivant le type de scanner que vous utilisez.
Ensuite, le programme fait un flou gaussien sélectif. Depuis que je scanne en 300 dpi, j'utilise un flou léger (rayon 3 et limite 50), juste pour éliminer la trame de la page et pour aider un peu la compression JPEG. En 150 dpi, j'utilisais un flou plus important parce que le tramage de mon scanner était beaucoup plus visible.
Les 2 paramètres du flou sont le rayon en pixels (BLUR_RADIUS) et la limite de couleur (BLUR_LIMIT). Si la différence de couleur entre 2 pixels est supérieure à la limite, le flou n'est pas fait (ça permet d'éviter de flouter trop les textes, tout en floutant les images).
A ce stade, le programme sauvegarde l'image dans REPERTOIRE1. C'est une précaution, parce que la détection de l'angle de rotation n'est pas toujours parfaite. De cette manière, on conserve l'image "non rotatée" pour pouvoir faire la rotation à la main si nécessaire.
Voici l'image sauvegardée à ce stade:
On attaque ensuite la détection de l'angle de rotation. Le but est d'obtenir des ligne de textes les plus horizontales possibles. Pour ça, on applique différents filtres à l'image pour extraire les lignes qui nous intéressent. La plupart des paramètres dans cette partie devront surtout être modifiés si vous scannez dans une réslution différente de moi (300 dpi).
Remarque: comme la plupart des filtres sont symétriques verticalement, cette détection marche aussi bien avec des pages scannées la tête en bas.
On commence par convertir l'image en 256 niveaux de gris.
Ensuite, on compare l'intensité de chaque pixel avec celle du pixel juste en dessous. Si la différence est supérieure à 64 (VISION_LIMIT1), on met un point blanc, sinon, on met un point noir. De cette façon, on ne conserve que les "transitions verticales franches".
Sur l'image, on peut voir que le texte se détache. La photo a presque complètement disparu.
Pour supprimer au maximum les lignes verticales et les points isolés, on filtre de façon à ne conserver que les transitions fréquentes: pour chaque pixel, on regarde dans une fenêtre de 16 (VISION_WIDTH1) pixels à sa droite. Si dans cette fenêtre on trouve au moins 3 (VISION_LIMIT2) transitions (c'est à dire 3 pixels blancs), alors on met ce pixel en blanc, sinon, on le met en noir.
Voici le résultat:
Le but de l'étape suivante est d'obtenir les lignes les plus longue possibles (pour avoir plus de précision pour calculer leurs angles). On cherche donc à prolonger les petites lignes blanches qu'on a obtenu. Pour chaque ligne, on s'intérésse à son bout à droite. A partir de ce bout de ligne, on regarde dans une fenêtre de 16 (VISION_WIDTH2) pixels à sa droite. Si dans cette fenêtre, on trouve un pixel, soit sur la même ligne, soit une ligne au-dessus, soit une ligne en-dessous, on prolonge notre ligne jusqu'à ce pixel.
Voilà le résultat, avec en rouge les parties que l'on a prolongé.
Pour se simplifier la vie, on réduit l'épaisseur des lignes jusqu'à ce qu'elles ne fassent plus qu'un pixel d'épaisseur. Il n'y a pas de paramètre à modifier dans cette partie.
Enfin, il ne nous reste plus qu'à récupérer les lignes les plus intéréssantes: on ne garde que celles qui font au moins 128 (VISION_WIDTH3) pixels de long et dont l'angle par rapport à l'horizontale ne dépasse pas les 3.0 (VISION_ANGLE) degrés. Sur l'image, on voit en vert les lignes que l'on a conservées, et en bleu celles qu'on a laissé de coté.
Il suffit ensuite de faire la moyenne des angles de ces lignes, en privilégiant les lignes les plus longues, et on obtient l'angle de rotation de la page.
Le programme affiche l'angle de rotation trouvé en degrés, au cas où il faudrait faire la rotation à la main si le re-cadrage n'avait pas bien marché par exemple. On peut rentrer cette valeur directement dans la fenêtre de rotation de Gimp (en arrondissant à la 2ième décimale). Si vous utilisez un autre programme pour faire les retouches, il faudra peut-être prendre l'opposé de cet angle.
Le programme effectue ensuite la rotation avec une interpolation bicubique, et il re-cadre encore une fois l'image pour gagner quelques pixel si c'est possible. Puis, l'image finale est sauvegardée dans REPERTOIRE2.
Problèmes connus
Problèmes de re-cadrage:
Dans mon cas, comme je scanne avec une feuille noire derrière la page, si le bord de la page est sombre le programme peut avoir du mal à reconnaitre le bord. Il coupe alors la page un peu trop... Naturellement, si on ne met pas de feuille noire derrière, le même problème peut apparaitre avec une page qui a des bords clairs...
Problèmes de rotation:
Ils apparaissent principalement dans 3 cas:
- soit la page ne contient pas de texte, mais simplement une image.
- soit la page ne contient que des textes mais penchés (dans le cas d'une pub par exemple)
- soit la page contient une zones avec une fine trame de points assez serrés.
D'après mon expérience, ces problèmes arrivent très rarement (environ 2% des pages scannées), mais le système de double sauvegarde du programme permet de rattraper le coup la plupart du temps. Si vous rencontrez vraiment des problèmes, je vous conseille les réglages suivants:
Pour les problèmes de re-cadrage: réglez les paramètres DETECT_WIDTH et DETECT_DIFF.
Pour les problèmes de rotation, réglez plutot les paramètres VISION, en commençant par essayer de réduire VISION_ANGLE.
Finalisation
Un dernier petit conseil avant de vous rendre le contrôle de votre téléviseur...
Pour la conversion en JPEG, je vous conseille d'utiliser IrfanView. Il permet non seulement de convertir les images par lot (batch conversion) de manière assez rapide, mais il peut en plus appliquer d'autres retouches (luminosité, contraste, ...) et de retourner les pages qui ont été scannées la tête en bas.
Allez, bon scan à tous...