• [^] # Re: Tesseract-ocr

    Posté par . En réponse à la dépêche GNU/Linux a son OCR de qualité. Évalué à 7.

    Il y a quelques temps j'ai eu besoin d'écrire un script qui détectait l'orientation d'un document scanné et le remettait automatiquement "dans le bon sens".

    Simple à faire, un passage d'ocr sur le document initial puis un second sur le document retourné à 180°. Le résultat comportant le plus de mots existants de plus de 4 lettres (pour éviter les artefacts) gagne.

    Du coup j'ai installé une bonne partie des ocr disponibles. Le meilleur (dans ces conditions précises) a été ocrad :
    - très peu de dépendances sous debian (libc6 libgcc1 libstdc++6, qui sont très probablement déjà installées)
    - très rapide (de l'ordre de la seconde pour une image de 3 millions de pixel en 300 dpi)
    - résultats parfait pour l'usage.

    Testé sur une vingtaine de milliers de document, il fonctionne impeccablement.

    Voici le script pour ceux que ça intéresse :

    #!/bin/bash
    # this script determines whether an image must be flipped by comparing the results
    # of OCR on the image and the flipped image
    show_help()
    {
     echo "${0##*/} image1 [image2]..."
     exit 1
    }
    topbm()
    {
     mimetype=$(file --brief --mime "1ドル" | cut -d';' -f1)
     case "$mimetype" in
     "image/x-ms-bmp")
     bmptopnm --quiet "1ドル"
     ;;
     "image/jpeg")
     jpegtopnm --quiet "1ドル"
     ;;
     "image/png")
     pngtopnm --quiet "1ドル"
     ;;
     * )
     >&2 echo ${file}: Mime type "$mimetype" not supported
     return 1
     ;;
     esac
    }
    verbose=0
    while getopts ":vh" opt
    do
     case $opt in
     v)
     verbose=$((verbose + 1))
     ;;
     h)
     show_help
     exit 0
     ;;
     \?)
     >&2 echo "Invalid option: -$OPTARG"
     show_help
     exit 1
     ;;
     esac
    done
    shift "$((OPTIND-1))"
    pbmfile=$(mktemp)
    for file in $*
    do
     topbm "$file" > "$pbmfile"
     if [ $? -eq 0 ]
     then
     normal=$(ocrad -l "`{mathjax} pbmfile" | iconv -f iso8859-15 | hunspell -G | grep -v '[0-9]' | grep '[a-zA-Z]\`
     flipped=$(ocrad --transform=rotate180 -l "`{mathjax} pbmfile" | iconv -f iso8859-15 | hunspell -G | grep -v '[`
     if [ $flipped -gt $normal ]
     then
     if [ $verbose -gt 0 ]
     then
     echo "$file : flip needed ($normal / $flipped)"
     fi
     mogrify -flip -flop "$file"
     fi
     fi
    done
    if [ -e "$pbmfile" ]
    then
     rm "$pbmfile"
    fi