vendredi 18 juillet 2014

Concatenation d'images avec OpenCV

Concatenation d'images avec OpenCV

pdfimages.exe


Le format PDF présente plusieurs avantages : en générant un fichier PDF vous avez la garantie qu'il sera affichée de la même manière sur toutes les plateformes. A l'impression le rendu sera identique partout.

En contrepartie, le format PDF n'est pas fait pour être édité facilement. De plus les choix d'affichages effectués par le lecteur de fichier peuvent se révéler mauvais dans certains cas (notamment lors de l'affichage d'images A4 pleine page dans le cas de bande dessinées ou de comics par exemple).
Les publications scientifiques en PDF (ou ces même comics) embarquent souvent des infographies que vous voudriez peut-être récupérer.

L'outil pdfimages permet d'extraire les images JPG embarquées dans un fichier PDF (ainsi que d'autres formats qui ne nous intéressent pas ici). Pour Win32, vous pouvez trouver l'outil précompilé là : http://www.foolabs.com/xpdf/download.html . Vous pouvez ne garder que pdfimages.exe présent dans l'archive.
Lorsqu'il enregistre les images, l'outil ne les "réinterprète" pas, ce qui est important pour les images JPEG : il n'y a pas de perte de qualité avec une nouvelle compression/décompression.

La syntaxe pour extraire les fichiers au format JPEG est -j :


 pdfimages.exe -j "nom_du_fichier_pdf" 0


Afin de garder la numérotation des images identique à celle du fichier, il faut donner un préfixe au fichiers qui seront sauvegardé. Vous pouvez utiliser ce que vous voulez, évidemment. Ici, j'utilise '0'. 

OpenCV à la rescousse 

Certains outils découpent les images lors de l'intégration des fichiers dans le fichier PDF. Cela ne se voit pas à l'écran lors de la visualisation du PDF, mais lors de la sauvegarde des images elles seront extraites en plusieurs morceaux.

J'ai programmé un petit outil avec OpenCV qui récupère toutes les images d'un dossier et les réassemble en pages logiques. OpenCV est surdimensionné pour une tâche de ce type, mais son utilisation permet d'appliquer d'éventuels traitement ultérieurs sur les images.

 Afin de pouvoir lire facilement les dossiers et les fichiers de manière multiplateforme (en prévision d'un portage éventuel sous Linux, par exemple), j'utilise un simple fichier d'en-tête, tinydir.h (par Cong Xu et Baudouin Feildel, venant d'ici https://github.com/cxong/tinydir).
 Afin de gérer plusieurs cas de découpe d'image, l'outil accepte en paramètre le nombre d'images successives à assembler. Par exemple, si vous désirer réunir les images 5 par 5, voici la ligne de commande :


OpenCVConcat.exe 5


Par défaut, l'outil va sauvegarder les images séquentiellement en partant de 000.jpg, jusqu'à 999.jpg

Pour l'instant, l'outil n'assemble que les fichiers .jpg . Il faut rajouter la vérification pour les autres formats de fichiers si vous voulez assembler des PNG ou autres.

Le code n'est pas complètement propre, mais cela donne une bonne base pour commencer. Par exemple, il faudrait pour la gestion des images temporaires en RAM désallouer proprement les images stockées dans le vecteur. Malgré tout, l'outil tournant rapidement et n'étant pas destiné à tourner en mémoire vive, le segment mémoire associé sera libéré proprement par l'OS à la fin de l'exécution.

Le code compile avec OpenCV 2.4.9 et Visual Studio 2012, mais cela devrait fonctionner avec n'importe quelle installation d'OpenCV en branche 2.0+ et un VS récent (certainement depuis VS2005). Les bibliothèques à lier par le compilateur sont déclarées en #pragma comment(lib,""), il faut changer ces lignes pour qu'elles correspondent à votre installation. (Cette manière de déclarer les librairies permet de changer facilement de version lorsque vous utilisez plusieurs version d'OpenCV en parallèle sur la même machine).

Le code est disponible sur GitHub : https://github.com/Pseudopode/OpenCVConcat, ainsi qu'une archive contenant l'exécutable et ses DLLs. Cette même archive est disponible également ici : https://dl.dropboxusercontent.com/u/1412774/Blog/BlogSpot/OpenCV_Concat/OpenCVConcat.1.0.7z.

Aucun commentaire:

Enregistrer un commentaire