Geo-Raster
view release on metacpan or search on metacpan
lib/Geo/Raster/Image.pm view on Meta::CPAN
# @brief Thin lines in the raster.
#
# This is an implementation of the algorithm in Jang, B-K., Chin,
# R.T. 1990. Analysis of Thinning Algorithms Using Mathematical
# Morphology. IEEE Trans. Pattern Analysis and Machine
# Intelligence. 12(6). 541-551. (Same as in GRASS but done in a bit
# different, and more generic way, I believe).
#
# The thinning algorithm defines a set of structuring templates and
# applies them in several passes until there are no matches or until the
# maxiterations is reached. Trimming means certain structuring templates
# are applied to kill emerging short limbs which appear because of the
# noise in the raster.
#
# Exple of thinning:
# @code
# $thinned_img = $img->thin(%options);
# @endcode
# or
# @code
# $img->thin(%options);
# @endcode
#
# @param[in] opt Includes as named parameters:
# - <I>algorithm</I> => character (optional). By default "B", the other option
# is "A".
# - <I>trimming</I> => binary (optional). By default 0, the other option is 1.
# Trimming removes artificial branches which grow on the side of wide lines in
# thinnning, but it also shortens a bit the real branches.
# - <I>maxiterations</I> => integer (optional). By default 0 (no maximum, will
# iterate until no cells are deleted).
# - <I>width</I> => double (optional). Used to define the maximum iterations
# count. In case the width is given then the maxiterations is set to
# int(width/2).
# @return a new raster. In void context changes this raster.
# @note The thinned raster must be a binary raster.
sub thin {
my($self, %opt) = @_;
$self = Geo::Raster->new($self) if defined wantarray;
my @D1 = (+0,+0,-1,
+0,+1,+1,
-1,+1,-1);
my @D2 = (-1,+0,+0,
lib/Geo/Raster/Image.pm view on Meta::CPAN
+1,+1,+0,
-1,+0,+0);
my @G8 = (+1,+0,+0,
+0,+1,+0,
+0,+0,+0);
my @trimmer = (\@G1,\@G2,\@G3,\@G4,\@G5,\@G6,\@G7,\@G8);
my $algorithm = $opt{algorithm};
$algorithm = 'B' unless $algorithm;
my $trimming = $opt{trimming};
$trimming = 0 unless $trimming;
my $maxiterations = $opt{maxiterations};
$maxiterations = 0 unless $maxiterations;
my $width = $opt{width};
$maxiterations = int($width/2) if $width;
my @thinner;
if ($algorithm eq 'B') {
if ($trimming) {
@thinner = (\@D1,\@D2,\@E1,@trimmer,
\@D2,\@D3,\@E2,@trimmer,
\@D3,\@D4,\@E3,@trimmer,
\@D4,\@D1,\@E4,@trimmer);
} else {
@thinner = (\@D1, \@D2, \@E1, \@D2, \@D3, \@E2,
\@D3, \@D4, \@E3, \@D4, \@D1, \@E4);
lib/Geo/Raster/Image.pm view on Meta::CPAN
} else {
croak "thin: $algorithm: unknown algorithm";
}
my ($m, $M, $i) = (0,0,1);
do {
$M = $m;
foreach (@thinner) {
$m += ral_grid_applytempl($self->{GRID}, $_, 0);
print STDERR "#" unless $opt{quiet};
}
print STDERR " thinning, pass $i/$maxiterations: deleted ", $m-$M, " cells\n" unless $opt{quiet};
$i++;
} while ($m > $M and !($maxiterations > 0 and $i > $maxiterations));
return $self if defined wantarray;
}
## @method Geo::Raster borders(%params)
#
# @brief Borders between zones.
#
# This method returns a binary raster, where the borders have the
# value of 1.
#
( run in 1.556 second using v1.01-cache-2.11-cpan-96521ef73a4 )