Améliorer la qualité des images prises en archives avec Imagemagick
Le problème
Les conditions de lumière ne sont pas toujours optimales lorsque nous prenons des photos en archives.
Voici un exemple d’une page du rôle d’évaluation de la Ville de Sherbrooke (quartier Centre, 1921) qui avaient été photographiées dans des conditions de lumière suboptimales.

La solution
Un traitement, notamment pour améliorer la luminosité et le contraste, et pour améliorer la netteté de l’image.
Les outils
Les fonctions de conversion de la suite Imagemagick et un script.
Imagemagick est un logiciel gratuit pour le traitement des images matricielles. Il roule sur Linux, Windows, Mac, Android et iOS. Il sert à modifier, créer, convertir ou composer des images à partir de la ligne de commande ou peut être intégré à un des langages de programmation courants (C, C++, Perl, Python, PHP, etc.). Il est très utile pour faire du traitement en lot (batch).
Deux fonctions de la commande convert sont nécessaires pour améliorer la qualité de l’image :
- -brightness-contrast : sert à modifier d’un coup la luminosité et le contraste
- -sharpen : sert à améliorer la netteté de l’image en enlevant les pixels flous
Une autre fonction, -chop, permet de rogner une partie de l’image. Dans ce cas-ci, on pouvait enlever de l’espace superflu au haut et au bas de l’image.
Le script sert à enchaîner les commandes pour effectuer le traitement en lot. Divers langages pourraient être utilisés. Pour un exemple très simple comme celui-ci, il est plus rapide d’utiliser le langage associé à la ligne de commande. Le traitement étant fait sur un ordinateur Linux, j’ai utilisé un script shell.
Les tests manuels
Pour définir les paramètres des différentes commandes, j’ai d’abord fait quelques tests pour obtenir les résultats qui conviennent le mieux à mes besoins. Les commandes suivantes répondaient à mes besoins.
convert -brightness-contrast 25x35 fichierA.jpg fichierB.jpg convert -sharpen 0x4 fichierB.jpg fichierC.jpg
La documentation d’Imagemagick permet de comprendre comment utiliser les paramètres. La section Usage donne des exemples.
Pour connaître l’espace à rogner au haut et au bas de l’image, j’ai ouvert un fichier dans Gimp et j’ai mesuré le nombre de pixels entre la bordure supérieure de l’image et le haut de la page (191 pixels) et entre la bordure inférieure de l’image et le bas de la page (392 pixels). Les images ayant été prises avec une caméra sur trépied avec un déclencheur à distance, le nombre de pixels à enlever devrait être le même sur toutes les images. Au cas où le registre se serait déplacé sous la caméra, j’ai rogné 385 pixels au bas des images.
Selon les exemples, la commande suivante permet d’enlever les bandes superflues. L’option -gravity South spécifique que la bande à enlever est celle du bas. Le 0 indique qu’il ne fait pas enlever de bande sur le côté.
convert fichierB.jpg -chop 0x191 fichierC.jpg convert fichierC.jpg -gravity South -chop 0x385 fichierD.jpg
Opérations à réaliser dans le script
- pour chaque fichier se terminant par .JPG dans le dossier
- appliquer la conversion de luminosité et de contraste
- appliquer la fonction de netteté
- enlever les bandes
- nommer le fichier Role_Sherbrooke_1921_QuartierCentre_page[no].jpg
- les fichiers sont ainsi clairement nommés par rapport à leur contenu et leur origine
- les numéros de pages commencent à 1 et se terminent à 48.
- un compteur permet de d’attribuer un numéro séquentiel
- si le numéro est inférieur à 10, ajouter un préfixe 0 pour faciliter le tri
Le script
Un script shell commence par la ligne :
#!/bin/bash
Le reste du script permet d’initialiser le compteur, de déclarer la boucle et de traiter les fichiers. J’ai choisi de conserver le fichier original et de ne pas conserver les fichiers intermédiaires. Imagemagick permet d’utiliser plus d’une option par commande. Mon objectif étant de mieux comprendre mon code plutôt que de l’optimiser, j’ai choisi d’exécuter une transformation à la fois.
count=0 #initialisation du compteur for i in ./*.JPG #chargement de la liste des fichiers se terminant par .JPG do #début de la boucle suffixe="" #vider la variable suffixe au début de chaque boucle count=`expr $count + 1` #incrémentation du compteur if test $count -lt 10 #début de condition: si le compteur est de 1 à 9 then suffixe+="0$count" #ajouter un 0 devant le chiffre else suffixe=$count #sinon utiliser le nombre de 10 à n fi #fin de la condition echo $count convertir $i à Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg #afficher le nom du fichier en traitement convert -brightness-contrast 25x35 $i Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg #ajustement luminosité et contraste convert -sharpen 0x4 Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg #ajustement netteté convert Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg -chop 0x191 Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg #enlever bande supérieure convert Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg -gravity South -chop 0x392 Role_Sherbrooke_1921_QuartierCentre_page$suffixe.jpg #enlever bande inférieure done #fin de la boucle
Résultat

Tout en ne s’éloignant pas trop de la couleur du papier, l’image est plus lisible, ce qui en accélère la transcription.
L. Robichaud
4 mars 2017
Laisser un commentaire
Vous devez vous connecter pour publier un commentaire.