21. September 2011

Automatische Verbesserung schlecht gescannten Bücher (Linux)

Das ist noch ein Thema, mit dem ich mich beschäftigt habe. Ich habe ein altes Buch in Internet gefunden. Dessen Qualität läßt zu wünschen übrig, auf dem Foto ist es gut zu sehen.


Beim detaillierten Anschauen kann man viel Rauschen erkennen. Kann man lesen, aber...

Mit dem Programm GIMP habe ich versucht, ob man tatsächlich verbessern könnte, z.B. wenn man Farbkurven benutzt. Nachden auf der Seite Skripte für ImageMagick habe ich das richtige Skript dafür gefunden: curves.

Transformation Graph (curve with points drawn)

Für zwei Pukte waren die besten Parametern experimentell herausgefunden:
./curves -s 100,100 "25,25 75,95" test.jpg test_out.jpg

man kann auch versuchen mit diesen Parametern:
./curves -s 100,100 "50,50 75,95" test.jpg test_out.jpg

hier sieht man das Ergebnis:


Nachdem habe ich das Skript geschrieben für die zyklische Verarbeitung von allen gescannten Seiten:

#!/bin/bash
# loop_for_fotos.sh
#

SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

#ist convert installiert ?
convert > /dev/null
if [ $? -ne 0 ] ; then
    echo "Error: convert is needed, it's a part of ImageMagick" ;
fi;
DIR=$1;
# am ende alle "/" entfernen
if [ -z $1 ]; then $DIR=`pwd`;
else
    TEMP=`pwd`;
    cd $DIR; TEMP2=`pwd`;
    cd $TEMP;
    DIR=$TEMP2;
    echo $TEMP2;
fi;
#alte dateien in das DIR.orig verzeichnis
echo $DIR
#mkdir $DIR/orig;
#cp *.jpg $DIR/orig/
ERR=0;
CPUS=1;
echo "Start in " $DIR
files=$(ls $DIR/*.jpg)
list=($files)
len=${#list[@]}
echo $len
CPUS=2;
echo "Start curve transformation"
for(( i=0; i<$len ; i=i+$CPUS))
do
    for(( j=0; j<$CPUS ; j++))
    do
    if [ ${list[i+j]} ]; then
#echo ${list[i+j]}
    ./curves -s 100,100 "25,25 75,95"  ${list[i+j]} ${list[i+j]}.new.jpg &
    fi
    done;
    for job in `jobs -p`
    do
    echo $job
    wait $job || let "FAIL+=1"
    done;
    if [ $? -eq 0 ]; then
    echo "curve transformation successfully ;) next step";
    else ERR=$[$ERR+1]; #считаем ошибки
    fi;
    for(( j=0; j<$CPUS ; j++))
    do
    if [ ${list[i+j]} ]; then
    mv  ${list[i+j]}.new.jpg ${list[i+j]}
    fi
    done;
done;

if [ $ERR -eq 0 ]; then
    echo "Job done!";
else echo "Job done with some errors.";
fi;
echo "You can find your old files in $DIR.orig"

IFS=$SAVEIFS
#end



Punkte für die Kurven sollte man immer zuerst experimentell feststellen, hängt nur von der Scanqualität ab.

Autor: Karbofos.

Keine Kommentare:

Kommentar veröffentlichen