• Accueil
  • > Planet Libre
  • > Numérisation de documents sous Linux : résoudre le problème du fond grisé

Numérisation de documents sous Linux : résoudre le problème du fond grisé

Depuis quelques années, je peaufine un script shell qui me permet de faire des numérisations de documents administratifs (formulaires à renvoyer, documents reçus par la poste…) au format A4. Ce script utilise scanimage, un outil en ligne de commande du projet SANE.

Le script permet de lancer une numérisation en noir et blanc par lot, avec contrôle de la numérisation de chacune des pages avec les boutons du scanner, puis de convertir et fusionner tous les documents numérisés dans un fichier PDF.

J’en suis assez content. Seulement voilà, avec le scanner que j’utilise (Canon Pixma MP450, une imprimante-scanner), le résultat de la numérisation est décevant.

Voici un exemple avec la commande suivante :
scanimage –device pixma –resolution 150 –mode Gray -l 0 -t 0 -x 210 -y 297 >image.pnm

J’ai alors ce résultat (après conversion en PNG) :
Numérisation de documents sous Linux : résoudre le problème du fond grisé dans Planet Libre page_scanimage_options_defaut-723x1024

Comme on peut le voir, le fond est grisé (alors que le document papier a bien un fond blanc). Selon la qualité du papier, il arrive même que le verso du document soit visible.

J’avais déjà essayé de changer certains réglages mais sans succès.

Je me suis donc décidé à prendre le problème au sérieux et de lui trouver une solution.

Après quelques recherches, je comprends qu’il me faudrait régler la luminosité utilisée lors de la numérisation. Cela se fait généralement avec l’option –brightness dans scanimage. Le problème est que cette option n’est pas disponible pour le scanner Canon Pixma MP450, comme le montre le résultat de la commande scanimage -d pixma -h :

Options specific to device `pixma’:
Scan mode:
–resolution auto||75|150|300|600|1200dpi [75]
Sets the resolution of the scanned image.
–mode auto|Color|Gray|Lineart [Color]
Selects the scan mode (e.g., lineart, monochrome, or color).
–source Flatbed [Flatbed]
Selects the scan source (such as a document-feeder). Set source before
mode and resolution. Resets mode and resolution to auto values.
–button-controlled[=(yes|no)] [no]
When enabled, scan process will not start immediately. To proceed,
press « SCAN » button (for MP150) or « COLOR » button (for other models).
To cancel, press « GRAY » button.
Gamma:
–custom-gamma[=(auto|yes|no)] [yes]
Determines whether a builtin or a custom gamma-table should be used.
–gamma-table auto|0..255,…
Gamma-correction table.  In color mode this option equally affects the
red, green, and blue channels simultaneously (i.e., it is an intensity
gamma table).
–gamma auto|0.299988..5 [2.2]
Changes intensity of midtones
Geometry:
-l auto|0..216.069mm [0]
Top-left x position of scan area.
-t auto|0..297.011mm [0]
Top-left y position of scan area.
-x auto|0..216.069mm [216.069]
Width of scan-area.
-y auto|0..297.011mm [297.011]
Height of scan-area.
Buttons:
–button-update
Update button state
Extras:
–threshold auto|0..100% (in steps of 1) [inactive]
Select minimum-brightness to get a white point
–threshold-curve auto|0..127 (in steps of 1) [inactive]
Dynamic threshold curve, from light to dark, normally 50-65

Après plusieurs tâtonnements et investigations, je comprends que je dois jouer avec le gamma. Le gros problème, c’est que je ne sais pas ce qu’est un gamma et encore moins une table de gamma. Je crois comprendre qu’il permet d’indiquer comment l’intensité d’un point numérisé doit être traduit en niveau de gris (ou en couleur) mais cela reste assez obscur pour moi. Je remercie par avance celui ou celle qui pourra m’éclairer sur le sujet en commentaires.

J’essaie les différents modes auto mais cela ne donne pas ou peu de changements. Puis j’essaie les différentes valeurs de l’option –gamma. Cela a bien une influence mais le résultat n’est toujours pas satisfaisant.

Mon dernier recours est alors de spécifier une table de gamma personnalisée (avec l’option –gamma-table). L’outil scanimage attend, pour cela, une suite de nombres. C’est plutôt abscons pour moi.

Heureusement, le projet SANE fournit un outil permettant de générer cette suite de nombres : gamma4scanimage.

L’outil attend cinq paramètres : gamma, shadow, highlight, maxin et maxout. Voilà ce que j’ai compris :

  • gamma prend les mêmes valeurs que l’option –gamma de scanimage; plus la valeur est grande, plus il y a de la luminosité ;
  • maxin doit être spécifiée avec une valeur fixe dépendant du nombre de bits supportés par le scanner ; dans mon cas, il s’agit de 12 bits; je renseigne donc la valeur 4095 (cf. man).
  • maxout doit être spécifiée avec la valeur la plus grande acceptée par l’option –gamma-table de scanimage (255 dans mon cas) ;
  • shadow peut garder la valeur 0 ;
  • enfin, highlight peut garder la même valeur que maxin mais c’est en abaissant cette valeur de 15% que j’ai finalement résolu mon problème.

Une fois les valeurs déterminées, je combine l’outil gamma4scanimage avec scanimage de la manière suivante :
scanimage –device pixma –mode Gray -l 0 -t 0 -x 210 -y 297 –custom-gamma=yes –gamma-table `gamma4scanimage 1.8 0 3500 4095 255` >image.pnm

J’ai alors ce résultat (après conversion en PNG) :
page_scanimage_option_gamma-table-723x1024 gamma dans Planet Libre
Le fond est bien blanc. Le verso n’apparaît pas.

Autre avantage : le fichier qui en résulte est plus petit (presque deux fois plus petit dans mon exemple). Ceci est particulièrement pratique lorsque les documents sont destinés à être envoyés par courriel.

Ce résultat me permet maintenant d’envisager d’appliquer une phase de reconnaissance de caractères (OCR) afin de faciliter des recherches éventuelles dans mes documents numérisés.

Avis et éclairage sont les bienvenus en commentaires.

Mots-clefs : , , , , ,

6 Réponses à “Numérisation de documents sous Linux : résoudre le problème du fond grisé”

  1. Albert dit :

    Article sympa et utile – merci. Le problème de calibration des scanners sous GNU/Linux est effectivement énervant. Pour un outil en ligne de commande, vous montrez ici tout le problème : il faut tâtonner pour y arriver ! Mais que des outils visuels, comme xscanimage ou simple scan, n’intègrent pas en natif la possibilité de scanner une fois pour toute une image et un texte, en retenant les paramètres de calibration, c’est énervant à la longue… Il manque en fait la notion de pouvoir rajouter un profil de calibration en lui donnant simplement un nom libre, et de pouvoir le reprendre en un clic avant de scanner : ça économiserait beaucoup d’aperçus pour rien. Il est heureux que les outils libres de scan soient 3X plus rapides minimum que leurs homologues windows, ce qui rattrape le coup. Mais c’est un peu dommage que les créateurs de xscanimage ou simple scan ne fassent pas évoluer les choses en ce sens. Cordialement.

  2. G dit :

    Il existe plusieurs projets pour la numérisation+OCR :
    Malodo, Paperworks
    Mayan EMC

    Le plus simple, serait que tu regardes comment intégrer ton super travail à Paperworks, puisqu’il ne lui manque que ce que tu as fait. Le développeur principal est français, et sera très intéressé par ce que tu as fait.

    Bonne journée

  3. cricri dit :

    Beaucoup de complications, tout ça.
    Moi, sous Linux Mate 17.3 j’utilise SimpleScan avec une HP Deskjet 1050 et mes fonds de documents sont blancs. De plus, pour faire un PDF avec plusieurs documents, il suffit de les numériser les uns après les autres et d’enregistrer à la fin, directement en PDF. Après, quand on peut aussi se faire plaisir en bricolant…

  4. julien1001 dit :

    Merci pour vos commentaires.

    Albert: Vous avez tout à fait raison. C’est une des raisons pour lesquelles j’ai ce script « maison ».

    G: J’ai déjà entendu parler de Paperwork. L’idée est intéressante et son implémentation me paraît être un très beau travail. Cependant la solution dépasse la simple numérisation et va au-delà de mon besoin. D’autre part, mon travail (qui n’a rien d’extraordinaire) ne s’applique qu’au scanner que j’utilise. Je n’ai que peu d’idée sur la manière de le rendre générique à tous les scanners.

    cricri: Si il y avait une solution facile, je l’utiliserais. J’avais entendu parler de Simple Scan mais je ne l’avais jamais essayé. Votre commentaire m’a incité à le faire. Il résout en effet le problème du fond grisé (pour peu qu’on ait bien sélectionné l’option Texte). Cependant il n’a pas rogné l’image au format A4, bien que j’ai précisé le format dans les préférences. Ai-je loupé quelque chose ? Enfin, mon script permet de lancer la numérisation des différentes pages à partir du scanner (je place la page sur le scanner, j’appuie sur un bouton vert pour lancer la numérisation de la page, puis je place la page suivante, puis bouton vert, etc. à la fin, j’appuie sur un bouton gris pour terminer). C’est une option du scanner que j’utilise (d’autres scanners ont probablement la même option). Cela permet d’éviter de faire la bascule permanente entre le scanner (pour placer la page) et l’ordinateur (pour lancer la numérisation). Simple Scan ne semble pas proposer cette option. Donc oui, je me suis compliqué la vie à écrire ce script mais c’est pour me rendre la vie plus simple à l’utilisation.

  5. G dit :

    Une fois les scans faits, tu peux lancer Paperworks pour l’OCR et la création des indexs.
    Je pense sincèrement que tu peux inclure sans difficultés ton travail dans Paperworks pour que les scans soient bien fait, puisque c’est l’ajout de paramètres spécifiques pour scanner. Ainsi, tu pourras bénéficier de ce super outil.

  6. julien1001 dit :

    G: Merci pour ton commentaire. J’avais étudié la solution proposée par Paperwork dans le passé et j’avais conclu que cela ne correspondait pas à mon besoin. Mais je devrais ré-évaluer la solution une nouvelle fois.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>