From 721da72b3b92227d6f5932c47b55a1b7133078df Mon Sep 17 00:00:00 2001 From: Toke Eskildsen <te@ekot.dk> Date: Tue, 26 Nov 2013 16:18:07 +0100 Subject: [PATCH] Added greyscale stats extraction --- analyze.sh | 98 ++++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 84 insertions(+), 14 deletions(-) diff --git a/analyze.sh b/analyze.sh index 65d47a6..59373bd 100755 --- a/analyze.sh +++ b/analyze.sh @@ -6,21 +6,78 @@ # Requirements: ImageMagick's identify and convert # +# TODO: Move this outside of the script +ASSUME_GREY=true + +# TODO: Accept destination for identify-file as input + # Input: image # Sample: foo.png -# Produces foo.identify is not already existing. +# Produces foo.identify if not already existing. +# Output: The name of the identity file function im_identify() { local SRC="$1" local IDENTIFY=${SRC%%.*}.identify if [ -f "$IDENTIFY" ]; then + echo "$IDENTIFY" return fi + if [ "false" == "$ASSUME_GREY" ]; then # We do the TIFF-conversion to force greyscale - local TMP=`mktemp`.tif - convert "$SRC" -colorspace gray "$TMP" - identify -verbose "$TMP" > "$IDENTIFY" - rm "$TMP" + local TMP=`mktemp`.tif + convert "$SRC" -colorspace gray "$TMP" + identify -verbose "$TMP" > "$IDENTIFY" + rm "$TMP" + else + identify -verbose "$SRC" > "$IDENTIFY" + fi + echo "$IDENTIFY" +} + +# TODO: Accept destination for grey-stats-file as input + +# Input: image +# Sample: foo.png +# Produces foo.grey with $PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY +# Output: $PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY +function grey_stats() { + local SRC="$1" + if [ ! -f "$SRC" ]; then + echo "grey_stats: The file $SRC does not exist in `pwd`" + return + fi + + local IDENTIFY=$(im_identify "$SRC") + local GREY=${SRC%%.*}.grey + local INFO=`cat "$IDENTIFY"` + local VALUES=`cat "$IDENTIFY" | grep -B 1000 Colormap` + + local SAVEIFS=$IFS + IFS=$(echo -en "\n") + + local UNIQUE=`echo $VALUES | grep "[0-9]\\+: (" | wc -l` + + local FIRST_COUNT=`echo $VALUES | grep "[0-9]\\+: (" | head -n 1 | grep -o " [0-9]\\+:" | grep -o "[0-9]\\+"` + local FIRST_GREY=`echo $VALUES | grep "[0-9]\\+: (" | head -n 1 | grep -o " ([0-9 ,]*)" | sed 's/ //g'` + + local LAST_COUNT=`echo $VALUES | grep "[0-9]\\+: (" | tail -n 1 | grep -o " [0-9]\\+:" | grep -o "[0-9]\\+"` + local LAST_GREY=`echo $VALUES | grep "[0-9]\\+: (" | tail -n 1 | grep -o " ([0-9 ,]*)" | sed 's/ //g'` + + local GEOMETRY=`echo $INFO | grep "Geometry: [0-9]\\+x[0-9]\\+" | grep -o "[0-9]\\+x[0-9]\\+"` + local X=`echo $GEOMETRY | grep -o "[0-9]\\+x" | grep -o "[0-9]\\+"` + local Y=`echo $GEOMETRY | grep -o "x[0-9]\\+" | grep -o "[0-9]\\+"` + local PIXELS=`echo "$X*$Y" | bc` + + # http://stackoverflow.com/questions/8402181/how-do-i-get-bc1-to-print-the-leading-zero + local PERCENT_FIRST=`echo "scale=2;x=$FIRST_COUNT*100/$PIXELS; if(x<1) print 0; x" | bc` + local PERCENT_LAST=`echo "scale=2;x=$LAST_COUNT*100/$PIXELS; if(x<1) print 0; x" | bc` + + echo "$PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY" > "$GREY" + + IFS=$SAVEIFS + + echo "$PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY" } # Produces a histogram over greyscale intensities in the given image @@ -32,8 +89,7 @@ function histogram() { local HEIGHT=$2 local LOG=$3 - im_identify "$SRC" - local IDENTIFY=${SRC%%.*}.identify + local IDENTIFY=`im_identify "$SRC"` local DEST=${SRC%%.*}.histogram.png # Convert # 78085: ( 0, 0, 0) #000000 black @@ -102,17 +158,31 @@ function histogram() { # /1 due to funky bc scale not being applied if nothing is done local PIXELS=`echo "scale=0;$PIXELS/1" | bc -l` - for P in `seq 0 $((HEIGHT-1))`; do - if [ $P -le $PIXELS ]; then + if [ 0 -lt $PIXELS ]; then + for P in `seq 0 $PIXELS`; do echo -n -e \\x0 >> $HTMP - else + done + fi + if [ $((HEIGHT-1)) -gt $PIXELS ]; then + for P in `seq $((PIXELS+1)) $((HEIGHT-1)) `; do echo -n -e \\xff >> $HTMP - fi - done - echo "$G $COUNT $PIXELS" + done + fi + +# for P in `seq 0 $((HEIGHT-1))`; do +# if [ $P -le $PIXELS ]; then +# echo -n -e \\x0 >> $HTMP +# else +# echo -n -e \\xff >> $HTMP +# fi +# done +# echo "$G $COUNT $PIXELS" done + echo "convert -rotate 270 $HTMP $DEST" convert -rotate 270 $HTMP "$DEST" + ls -l $HTMP rm $HTMP } -#histogram $1 200 false +# histogram $1 200 false +# grey_stats $1 -- GitLab