193 lines
5.3 KiB
Bash
Executable File
193 lines
5.3 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
##
|
|
# Configuration
|
|
|
|
# Before morphology analysis, reduce image dimensions by this factor
|
|
simplify=2
|
|
|
|
# Morphology to apply to reduce content to main area
|
|
morphology="Open:6"
|
|
morphology_shape="Disk"
|
|
|
|
# Number of colors images are quantized to for component detection
|
|
colors=4
|
|
|
|
# Neighbors to evaluate when detecting connected components
|
|
connected_components=8
|
|
|
|
# Area treshold for connected components detection
|
|
area_treshold=1000
|
|
|
|
# Sigmoidal contrast adjustment used when trimming
|
|
sigmoidal_contrast_trim="30,30%"
|
|
|
|
# Sigmoidal contrast adjustment visible in result images
|
|
sigmoidal_contrast="45,50%"
|
|
|
|
# Number of colors result images are quantized to
|
|
posterize=6
|
|
|
|
# Keep intermediate images after processing (note that they will be removed in
|
|
# any case at the next run of this script)
|
|
keep_tmpfiles=true
|
|
|
|
##
|
|
# Main Program
|
|
|
|
dir="$(dirname "$(readlink -f "$0")")"
|
|
tmpdir="$dir/tmp"
|
|
indir="$dir/in"
|
|
comdir="$dir/com"
|
|
outdir="$dir/out"
|
|
resize_percent=$((100/simplify))
|
|
|
|
if ! cd "$dir" ; then
|
|
echo "ERROR: Could not change to directory \"$dir\"; aborted." >&2
|
|
exit 1
|
|
elif ! mkdir -p "$comdir" "$outdir" "$tmpdir" ; then
|
|
echo "ERROR: Could not create working directories; aborted." >&2
|
|
exit 1
|
|
elif ! rm -f -- "$comdir/"*.* ; then
|
|
echo "ERROR: Could not delete existing component files; aborted." >&2
|
|
exit 1
|
|
elif ! rm -f -- "$tmpdir/"*.* ; then
|
|
echo "ERROR: Could not delete existing tempfiles; aborted." >&2
|
|
exit 1
|
|
elif ! rm -f -- "$outdir/"*.* ; then
|
|
echo "ERROR: Could not delete existing results; aborted." >&2
|
|
exit 1
|
|
else
|
|
rv=0
|
|
|
|
for jpg in "$indir/"*.jpg ; do
|
|
base=$(basename "$jpg" .jpg)
|
|
tmp1="$tmpdir/$base.tmp1.png"
|
|
tmp2="$tmpdir/$base.tmp2.png"
|
|
com="$tmpdir/$base.com.png"
|
|
trimmed="$tmpdir/$base.trimmed.png"
|
|
inf="$tmpdir/$base.txt"
|
|
out="$outdir/$base.png"
|
|
|
|
if ! convert \
|
|
"$jpg" \
|
|
-colorspace RGB \
|
|
-sigmoidal-contrast "$sigmoidal_contrast_trim" \
|
|
-resize "$resize_percent%" \
|
|
-colors "$colors" \
|
|
-morphology "$morphology" "$morphology_shape" \
|
|
"$tmp1"
|
|
then
|
|
echo "ERROR: Could not create test image \"$tmp1\"; skipped." >&2
|
|
rv=1
|
|
continue
|
|
fi
|
|
|
|
draw=()
|
|
v=255
|
|
|
|
while read -r primitive ; do
|
|
draw+=("-fill" "rgb($v,$v,$v)" "-draw" "$primitive")
|
|
v=$((v-2))
|
|
done < <(
|
|
convert \
|
|
"$tmp1" \
|
|
-define connected-components:verbose=true \
|
|
-define connected-components:exclude-header=true \
|
|
-define connected-components:sort-order=increasing \
|
|
-define connected-components:area-threshold="$area_treshold" \
|
|
-virtual-pixel None \
|
|
-connected-components "$connected_components" \
|
|
-auto-level \
|
|
"$com" | \
|
|
perl -e '
|
|
while(<>){
|
|
chomp;
|
|
next unless /(\d+)x(\d+)\+(\d+)\+(\d+)/;
|
|
printf
|
|
STDERR
|
|
"DEBUG: component: $_\n";
|
|
printf
|
|
"rectangle %d,%d,%d,%d\n",
|
|
$1, $2, $1+$3, $2+$4;
|
|
}
|
|
|
|
' | \
|
|
sort | \
|
|
uniq
|
|
)
|
|
|
|
printf "DEBUG: connected components in \"%s\":" "$tmp1"
|
|
for d in "${draw[@]}" ; do
|
|
printf " \"%s\"" "$d"
|
|
done
|
|
printf "\n"
|
|
|
|
if ! convert \
|
|
"$tmp1" \
|
|
-fill black -colorize 100 \
|
|
"${draw[@]}" \
|
|
"$tmp2"
|
|
then
|
|
echo "ERROR: Could not convert \"$tmp1\" to \"$tmp2\"; skipped." >&2
|
|
rv=1
|
|
continue
|
|
elif ! convert \
|
|
"$tmp2" \
|
|
-trim info: \
|
|
> "$inf"
|
|
then
|
|
echo "ERROR: Could not determine trim info from \"$tmp2\"; skipped." >&2
|
|
rv=1
|
|
continue
|
|
fi
|
|
|
|
if "$keep_tmpfiles" ; then
|
|
if ! convert \
|
|
"$tmp2" \
|
|
-trim \
|
|
"$trimmed"
|
|
then
|
|
echo "ERROR: Could not test trim \"$tmp2\"; skipped." >&2
|
|
rv=1
|
|
continue
|
|
fi
|
|
fi
|
|
|
|
# upscale crop area from smaller temporary picture sizes
|
|
crop=$(simplify=$simplify perl -MEnv -e '
|
|
while(<>) {
|
|
chomp();
|
|
s/(\d+)/$1*${simplify}/eg;
|
|
/(\d+)x(\d+) \d+x\d+\+(\d+)\+(\d+)/ && do {
|
|
print $1."x".$2."+".$3."+".$4;
|
|
}
|
|
}
|
|
' < "$inf")
|
|
|
|
if ! "$keep_tmpfiles" ; then
|
|
if ! rm -f -- "$tmp1" "$tmp2" "$trimmed" "$inf" ; then
|
|
echo "WARNING: Could not remove temporary files in \"$dir/tmp\"." >&2
|
|
rv=1
|
|
fi
|
|
fi
|
|
|
|
echo "Processing $base: crop=$crop ..."
|
|
|
|
if ! convert \
|
|
"$jpg" \
|
|
-crop "$crop" \
|
|
-sigmoidal-contrast "$sigmoidal_contrast" \
|
|
+dither -posterize "$posterize" \
|
|
"$out"
|
|
then
|
|
echo "ERROR: Could not process \"$jpg\"; skipped." >&2
|
|
rv=1
|
|
continue
|
|
fi
|
|
done
|
|
|
|
exit "$rv"
|
|
fi
|
|
|