From cf88e403a5ac4fd51b473ff4f92c2b0a4aca5e92 Mon Sep 17 00:00:00 2001
From: Toke Eskildsen <te@ekot.dk>
Date: Thu, 9 Jan 2014 19:50:36 +0100
Subject: [PATCH] Closes #34 (Count holes in the histogram)

---
 analyze.sh              | 12 ++++++++++--
 quack.sh                |  4 +++-
 web/image_template.html |  1 +
 3 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/analyze.sh b/analyze.sh
index 73a2f49..62bc50c 100755
--- a/analyze.sh
+++ b/analyze.sh
@@ -43,7 +43,7 @@ function im_identify() {
 # 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
+# Output: $PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY $ZEROES $HOLES
 function grey_stats() {
     local SRC="$1"
     if [ ! -f "$SRC" ]; then
@@ -56,6 +56,9 @@ function grey_stats() {
     local INFO=`cat "$IDENTIFY"`
     # TODO: No good as the histogram data might be much less than 256
     local VALUES=`cat "$IDENTIFY" | grep -A 256 Histogram`
+    if [ ! "." == ".`echo "$VALUES" | grep Colormap`" ]; then
+        local VALUES=`echo "$VALUES" | grep -B 256 Colormap`
+    fi        
     local RAW_VALUES=`echo "$VALUES" | grep "[0-9]\\+: ("`
 #    local VALUES="$INFO"
 
@@ -70,6 +73,11 @@ function grey_stats() {
     local LAST_COUNT=`echo $RAW_VALUES | tail -n 1 | grep -o " [0-9]\\+:" | grep -o "[0-9]\\+"`
     local LAST_GREY=`echo $RAW_VALUES | tail -n 1 | grep -o " ([0-9 ,]*)" | sed 's/ //g'`
 
+    local ZEROES=$((256-UNIQUE))
+    local SPAN=$((LAST_GREY-FIRST_GREY+1))
+    local EDGE=$((256-SPAN))
+    local HOLES=$((ZEROES-EDGE))
+
     local SPIKE_COUNT=`echo $RAW_VALUES | sort -n | tail -n 1 | grep -o " [0-9]\\+:" | grep -o "[0-9]\\+"`
     local SPIKE_GREY=`echo $RAW_VALUES | sort -n | tail -n 1 | grep -o " ([0-9 ,]*)" | sed 's/ //g'`
 
@@ -87,7 +95,7 @@ function grey_stats() {
 
     IFS=$SAVEIFS
 
-    echo "$PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY $SPIKE_COUNT $SPIKE_PERCENT $SPIKE_GREY"
+    echo "$PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY $SPIKE_COUNT $SPIKE_PERCENT $SPIKE_GREY $ZEROES $HOLES"
 }
 
 # Produces a histogram over greyscale intensities in the given image
diff --git a/quack.sh b/quack.sh
index f5cdc1b..a015ead 100755
--- a/quack.sh
+++ b/quack.sh
@@ -794,7 +794,7 @@ function makePreviewPage() {
     # TODO: Use destination if that is lossless and faster to open?
     local GREY=`grey_stats "$SOURCE_IMAGE"`
 
-    # $PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY $COUNT_SPIKE $PERCENT_SPIKE $GREY_SPIKE
+    # $PIXELS $UNIQUE $FIRST_COUNT $PERCENT_FIRST $FIRST_GREY $LAST_COUNT $PERCENT_LAST $LAST_GREY $COUNT_SPIKE $PERCENT_SPIKE $GREY_SPIKE $ZEROES $HOLES
     # 1000095 512 82362 8.23 (0,0,0) 255 .02 (255,255,255)
     GREY_PIXELS=`echo "$GREY" | cut -d\  -f1`
     GREY_UNIQUE=`echo "$GREY" | cut -d\  -f2`
@@ -807,6 +807,8 @@ function makePreviewPage() {
     GREY_COUNT_SPIKE=`echo "$GREY" | cut -d\  -f9`
     GREY_PERCENT_SPIKE=`echo "$GREY" | cut -d\  -f10`
     GREY_SPIKE=`echo "$GREY" | cut -d\  -f11`
+    GREY_ZEROES=`echo "$GREY" | cut -d\  -f12`
+    GREY_HOLES=`echo "$GREY" | cut -d\  -f13`
     local GREY_ALL_SOURCE=`im_identify "$SOURCE_IMAGE"`
     GREY_ALL=`cat "$GREY_ALL_SOURCE" | grep -A 256 Histogram | tail -n 256`
 
diff --git a/web/image_template.html b/web/image_template.html
index 2d97206..6e3d436 100644
--- a/web/image_template.html
+++ b/web/image_template.html
@@ -30,6 +30,7 @@ Dark ${GREY_FIRST}: ${GREY_PERCENT_FIRST}%<br/>
 Spike ${GREY_SPIKE}: ${GREY_PERCENT_SPIKE}%<br/>
 Light ${GREY_LAST}: ${GREY_PERCENT_LAST}%<br/>
 Unique greyscale values: ${GREY_UNIQUE}<br/>
+Histogram holes: ${GREY_HOLES}<br/>
 ALTO-PC: ${ACCURACY}%
 <p><input type="checkbox" id="toggle_grid" onClick="toggleGrid();">Grid</input></p>
 <p><input type="checkbox" id="toggle_textblock" checked="checked" onClick="toggleTextBlock();">TextBlocks</input></p>
-- 
GitLab