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) :
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) :
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.