rendered paste body#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;
my @rectangles;
my $image = Image::Magick->new();
print "Read " . int($image->Read('in.bmp')) . " image(s).\n";
my ($width, $height) = $image->Get('columns', 'rows');
print "Image is " . $width . "x" . $height . "\n";
$image->Separate(channel=> 'Blue');
$image->Threshold(threshold => 50000);
#$image->Set(depth => 16, colorspace => 'RGB');
my $raw = $image->ImageToBlob(magick => 'GRAY', depth => 8);
my @bits = unpack('C*', $raw);
#$image = Image::Magick->new();
#$image->Set(size => $width . 'x' . $height);
#$image->ReadImage('xc:black');
foreach my $x (0..$width-1) {
foreach my $y (0..$height-1) {
my $point = "$x,$y";
my $pixel = $bits[$y*$width + $x];
if($pixel > 0) {
$image->Draw(primitive => 'point', points => $point, fill => 'green');
processPoint($x, $y);
}
}
}
print "Found " . scalar(@rectangles) . " rectangle(s).\n";
foreach(@rectangles) {
#$image->Draw(primitive => 'rectangle', points => "$_->[0],$_->[1] $_->[2],$_->[3]", stroke => 'green', fill => 'none');
$image->Draw(primitive => 'line', points => "$_->[0],$_->[1] $_->[2],$_->[1]", stroke => 'green');
my $x = $_->[0] + (($_->[2] - $_->[0])/2);
my $y = $_->[1] + (($_->[3] - $_->[1])/2);
$image->Draw(primitive => 'point', points => "$x,$y", fill => 'blue');
$image->Draw(primitive => 'point', points => "$x,$y", fill => 'red');
}
$image->Write(filename=>'out.bmp');
sub processPoint {
my ($x, $y) = @_;
my $foundRectangle = 0;
foreach(@rectangles) {
if(inRectangle($_, $x, $y)) {
$foundRectangle = 1;
last;
}
}
if(!$foundRectangle) {
push @rectangles, [$x,$y,$x,$y];
}
}
sub inRectangle {
my ($rectangle, $x, $y) = @_;
if($x >= $rectangle->[0] - 1 && $x <= $rectangle->[2] + 1 &&
$y >= $rectangle->[1] - 1 && $y <= $rectangle->[3] + 1) {
if($x < $rectangle->[0]) {
$rectangle->[0] = $x;
} elsif($x > $rectangle->[2]) {
$rectangle->[2] = $x;
}
if($y < $rectangle->[1]) {
$rectangle->[1] = $y;
} elsif($y > $rectangle->[3]) {
$rectangle->[3] = $y;
}
return 1;
} else {
return 0;
}
}