diff --git a/analyze.sh b/analyze.sh
new file mode 100755
index 0000000000000000000000000000000000000000..7624c7bada38b21cd370ccb95c7a73442a14d853
--- /dev/null
+++ b/analyze.sh
@@ -0,0 +1,116 @@
+#!/bin/bash
+
+#
+# Statistical helper functions for greyscale images.
+#
+
+# Input: image
+# Sample: foo.png
+# Produces foo.identify is not already existing.
+function im_identify() {
+    local SRC="$1"
+ 
+    local IDENTIFY=${SRC%%.*}.identify
+    if [ -f "$IDENTIFY" ]; then
+        return
+    fi
+    # We do the TIFF-conversion to force greyscale
+    local TMP=`mktemp`.tif
+    convert "$SRC" -colorspace gray "$TMP"
+    identify -verbose "$TMP" > "$IDENTIFY"
+    rm "$TMP"
+}
+
+
+# Input: image height log
+# Sample: foo.jpg 200 true
+function histogram() {
+    local SRC="$1"
+    local HEIGHT=$2
+    local LOG=$3
+
+    im_identify "$SRC"
+    local IDENTIFY=${SRC%%.*}.identify
+    local DEST=${SRC%%.*}.histogram.png
+    # Convert      
+    #   78085: (  0,  0,  0) #000000 black
+    #    3410: (  1,  1,  1) #010101 rgb(1,1,1)
+    # into
+    # 0 78085
+    # 1 3410
+    GREYS=`cat "$IDENTIFY" | grep -A 9999 "  Histogram:" | grep -o " \\+[0-9]\\+: ( *[0-9]\\+, *[0-9]\\+, *[0-9]\\+)" | sed 's/ \\+\\([0-9]\\+\\): ( *\\([0-9]\\+\\).\\+/\\2 \\1/g'`
+    
+    # Find lowest and highest for both intensity and count
+    local MIN_GREY=255
+    local MAX_GREY=0
+    local MIN_COUNT=9999999
+    local MAX_COUNT=0
+
+    local SAVEIFS=$IFS
+    IFS=$(echo -en "\n\b")
+    while IFS= read -r L
+    do
+        local GREY=`echo "$L" | cut -d\  -f1`
+        local COUNT=`echo "$L" | cut -d\  -f2`
+        if [ $MIN_GREY -gt $GREY ]; then
+            local MIN_GREY=$GREY
+        fi
+        if [ $MAX_GREY -lt $GREY ]; then
+            local MAX_GREY=$GREY
+        fi
+        if [ $MIN_COUNT -gt $COUNT ]; then
+            local MIN_COUNT=$COUNT
+        fi
+        if [ $MAX_COUNT -lt $COUNT ]; then
+            local MAX_COUNT=$COUNT
+        fi
+    done <<< "$GREYS"
+    IFS=$SAVEIFS
+#    echo "Grey: $MIN_GREY $MAX_GREY  count: $MIN_COUNT $MAX_COUNT"
+
+    # Let SCALE map all counts from 0 to 1
+    if [ ".true" == ".$LOG" ]; then
+        local SCALE=`echo "scale=10;1/l($MAX_COUNT)" | bc -l`
+    else
+        local SCALE=`echo "scale=10;1/$MAX_COUNT" | bc -l`
+    fi
+
+    # We create a PGM-file with the extracted greyscale statistics
+    # as a histogram. The PGM is sideways because it is easier
+    # http://netpbm.sourceforge.net/doc/pgm.html
+    local HTMP=`mktemp`.pgm
+    if [ "true" == "$LOG" ]; then
+        local NONE=1
+    else
+        local NONE=0
+    fi
+
+    echo "P5 $HEIGHT 256 255" > $HTMP
+    for G in `seq 0 255`; do
+        local COUNT=`echo "$GREYS" | grep "^$G " | sed 's/[0-9]\\+ \\([0-9]\\+\\)/\\1/g'`
+        if [ "." == ".$COUNT" ]; then
+            local COUNT=$NONE
+        fi
+        if [ "true" == "$LOG" ]; then
+            local PIXELS=`echo "scale=10;l($COUNT)/l(10)*$SCALE*$HEIGHT" | bc -l`
+        else 
+            local PIXELS=`echo "scale=10;$COUNT*$SCALE*$HEIGHT" | bc -l`
+        fi
+        # /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
+                echo -n -e \\x0 >> $HTMP
+            else 
+                echo -n -e \\xff >> $HTMP
+            fi
+        done
+#        echo "$G $COUNT $PIXELS $HTMP"
+    done
+    convert -rotate 270 $HTMP "$DEST"
+    rm $HTMP
+    
+}
+
+#histogram $1 200 false