Reconnaissance optique de caractères

Nous traiterons ici bien évidement une solution libre, basé sur Tesseract.

Présentation de Tesseract

Petit extrait de chez http://doc.ubuntu-fr.org/tesseract-ocr : Tesseract est un moteur de reconnaissance optique de caractères (ROC, OCR) qui a été conçu par les ingénieurs de HP de 1984 à 1995, avant d'être abandonné. Après 10 ans de purgatoire, son code est ouvert en 2005, et le développement est repris sous la houlette de Google.

Et le reste ?

C'est simple, j'ai tout testé : Gocr c'est nul. Il prend énormément de CPU, le résultat est médiocre. Voilà pour le tour d'horizon des moteurs d'OCR. Ensuite, des interfaces, il y en a plein, mais aucune ne permet de choisir facilement la zone à scanner, à part XSane.

Utilisation avec XSane

Bon, tout ça c'est bien, mais si je veux faire de l'OCR « facile » pour tous, la ligne de commande, bof. On va donc utiliser… la ligne de commande, mais scriptée. 8-)

En fait, XSane, l'outil de base pour scanner sur Ubuntu, est très puissant : on peut associer n'importe quelle commande pour n'importe quelle action. J'avoue avoir testé plusieurs solutions avec des logiciels divers, mais j'aime bien rester sur XSane, le couteau Suisse du scan.

Si vous n'avez pas XSane :

$ sudo aptitude install xsane

Il est aussi nécessaire d'installer Image Magick, pour préparer les images avant de les passer à Tesseract : ne vous inquiétez pas, ça sera transparent pour vous :

$ sudo aptitude install imagemagick

Installation du moteur

Sous Ubuntu, il faut installer :

$ sudo aptitude install tesseract-ocr tesseract-ocr-fra

« tessertact-ocr » étant le moteur d'OCR, le paquet « tesseract-ocr-fra » permet de reconnaître les caractères français. Il y a aussi les paquets suivants avec d'autres langues :

  • tesseract-ocr-deu : allemand ;
  • tesseract-ocr-eng : anglais ;
  • tesseract-ocr-spa : espagnol ;
  • tesseract-ocr-nld : hollandais ;
  • tesseract-ocr-ita : italien ;
  • tesseract-ocr-por : portugais-brésilien;
  • tesseract-ocr-deu-f : allemand ancien.

Bref, il n'y en a pour presque tous les goûts !

Interface

Ouvrez votre éditeur de texte préféré et copiez-collez le contenu de ceci :

#!/bin/bash
#
#
##############################################################################
#
#                                   xsane2tess 1.0
#
#                          *** tesseract made simple ***
#
#
##############################################################################
# 
# xsane2tess is a TesseractOCR wrapper to be able to use tesseract with xsane
#
#
#
TEMP_DIR=~/tmp/      # folder for temporary files (TIFF & tesseract data)
ERRORLOG="xsane2tess.log"  # file where STDERR goes 
 
if [[ -z "$1"  ]]
  then
  echo "Usage: $0 [OPTIONS]
 
  xsane2tess converts files to TIF, scans them with TesseractOCR
  and outputs the text in a file.
 
  OPTIONS:
    -i <file1>  define input file (any image-format supported)
    -o <file2>  define output-file (*.txt)
    -l <lang>  define language-data tesseract should use
 
  Progress- & error-messages will be stored in this logfile:
     $TEMP_DIR$ERRORLOG
 
  xsane2tess depends on
    - ImageMagick  http://www.imagemagick.org/
    - TesseractOCR http://code.google.com/p/tesseract-ocr/
 
  Some coding was stolen from 'ocube'
  http://www.geocities.com/thierryguy/ocube.html
"
  exit
fi
 
 
# get options...
while getopts ":i:o:l:" OPTION
  do
  case $OPTION in 
    i)  # input filename (with path)
      FILE_PATH="$OPTARG"
    ;;
    o )  # output filename
      FILE_OUT="$OPTARG"
    ;;
    l )  # Language-selection
      TES_LANG="$OPTARG"
    ;;
  esac
done
 
# redirect STDOUT to FILE_OUT
exec 1>>$FILE_OUT
 
# redirect STDERR to ERRORLOG
exec 2>>$TEMP_DIR$ERRORLOG
 
# strip path from FILE_PATH, use filename only
IN_FILE=${FILE_PATH##*/}
 
TIF_FILE="$TEMP_DIR""${IN_FILE%.*}".tif
TXT_FILE="$TEMP_DIR""${IN_FILE%.*}"
 
# converting image into TIFF (ImageMagick)
convert "$FILE_PATH" -compress none  "$TIF_FILE" 1>&2
 
# start OCR (tesseract expands output with *.txt)
tesseract "$TIF_FILE" "$TXT_FILE" -l "$TES_LANG" 1>&2
 
# STDOUT scanned text => FILE_OUT
cat "$TXT_FILE".txt
 
# delete graphic file after use
rm "$TIF_FILE"
 
# delete tesseract output
rm "$TXT_FILE".txt

Enregistrez le avec comme nom xsane2tess, et rendez-le exécutable :

$ chmod +x xsane2tess

Copiez-le dans /usr/bin :

$ sudo cp xsane2tess /usr/bin

Comme ça, il est accessible directement dans un terminal, ce qui servira pour être appelé plus tard par XSane.

Le script à besoin d'un répertoire dans votre dossier personnel pour fonctionner, donc :

$ mkdir ~/tmp

Paramétrage de XSane

Ouvrir XSane : Applications → Graphisme → Scanneur d'images XSane

Dans Préférences → Configuration → Onglet « OCR » :

  • Commande OCR : xsane2tess -l fra
  • Option de fichier d'entrée : -i
  • Option de fichier de sortie : -o

Bien entendu, le « -l fra » précise que c'est du français.

Utilisation

Vous pouvez donc scanner un document, en chosissant comme type « TEXT ». On obtient de bons résultats en scannant à 300 ppi, noir et blanc (ou encore appelé « trait »).

Le gros avantage dans un document complexe (exemple : livre), vous pouvez sélectionner dans l'aperçu la zone précise que vous voulez analyser.

La souplesse d'XSane, avec la puissance de Tesseract : un joli duo !

Remerciement

J'ai passé une soirée à trouver une solution viable pour l'OCR d'un bouquin. Merci au wiki d'Ubuntu-Fr (et à Sorbus, l'auteur de l'article) !

reconnaissance_optique_de_caractères_ocr_/accueil.txt · Dernière modification: 2008/10/14 18:34 (édition externe)
Haut de page
CC Attribution-Noncommercial-Share Alike 3.0 Unported chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0