#!/usr/local/bin/perl -w

# calculate histogram data from input image and write 256x100 bw image

use Image::Magick;
use strict;

my $err;

my $infile = shift or die "Usage: hist.pl filename\n";

# read in target image
my $src = Image::Magick->new;
$err = $src->Read($infile);
warn "$err" if "$err";

# analyze image
my @histogram;
my $w = $src->Get('width');
my $h = $src->Get('height');

# zero our array to avoid undef warnings on unincremented histogram levels
for(my $z=0; $z<256; $z++) { $histogram[$z] = 0; }

my @pixels = $src->GetPixels(map=>"I", width=>"$w", height=>"$h");
foreach my $p (@pixels) {
	$histogram[int($p*255)]++;
}

# normalize histogram data
my $norm = 0;
foreach my $lev (@histogram) {
	if($lev > $norm) { $norm = $lev; }
}

for(my $c=0; $c < @histogram; $c++) {
	# outlier: all black image, $norm is 0, div by zero!  Dodge that.
	if($norm == 0) { last; }
	$histogram[$c] = 100 * $histogram[$c] / $norm;
}

my $image = Image::Magick->new;
$image->Set(size=>'256x100');
$image->ReadImage('xc:white');

for(my $x=0; $x < 256; $x++) {
	my $height = $histogram[$x];
	for(my $y=0; $y <= $height; $y++) {
		$image->Set("pixel[$x," . (99 - $y) . "]"=>'black');
	}
}

my $outname = $infile;
$outname =~ s!^(.+)(\.\w{3})$!h_$1.png!;
$err = $image->Write("$outname");
warn "$err" if "$err";

print "Histogram printed to $outname\n";
exit;
