"Fossies" - the Fresh Open Source Software Archive  

Source code changes of the file "GENERATED/PDL/Image2D.pm" between
PDL-2.074.tar.gz and PDL-2.075.tar.gz

About: PDL (Perl Data Language) aims to turn perl into an efficient numerical language for scientific computing (similar to IDL and MatLab).

Image2D.pm  (PDL-2.074):Image2D.pm  (PDL-2.075)
skipping to change at line 17 skipping to change at line 17
our %EXPORT_TAGS = (Func=>\@EXPORT_OK); our %EXPORT_TAGS = (Func=>\@EXPORT_OK);
use PDL::Core; use PDL::Core;
use PDL::Exporter; use PDL::Exporter;
use DynaLoader; use DynaLoader;
our @ISA = ( 'PDL::Exporter','DynaLoader' ); our @ISA = ( 'PDL::Exporter','DynaLoader' );
push @PDL::Core::PP, __PACKAGE__; push @PDL::Core::PP, __PACKAGE__;
bootstrap PDL::Image2D ; bootstrap PDL::Image2D ;
#line 5 "image2d.pd" #line 4 "image2d.pd"
use strict; use strict;
use warnings; use warnings;
=head1 NAME =head1 NAME
PDL::Image2D - Miscellaneous 2D image processing functions PDL::Image2D - Miscellaneous 2D image processing functions
=head1 DESCRIPTION =head1 DESCRIPTION
Miscellaneous 2D image processing functions - for want Miscellaneous 2D image processing functions - for want
skipping to change at line 39 skipping to change at line 40
=head1 SYNOPSIS =head1 SYNOPSIS
use PDL::Image2D; use PDL::Image2D;
=cut =cut
use PDL; # ensure qsort routine available use PDL; # ensure qsort routine available
use PDL::Math; use PDL::Math;
use Carp; use Carp;
#line 47 "Image2D.pm" #line 48 "Image2D.pm"
=head1 FUNCTIONS =head1 FUNCTIONS
=cut =cut
#line 1061 "../../blib/lib/PDL/PP.pm" #line 1060 "../../blib/lib/PDL/PP.pm"
#line 62 "Image2D.pm" #line 63 "Image2D.pm"
#line 1061 "../../blib/lib/PDL/PP.pm" #line 1060 "../../blib/lib/PDL/PP.pm"
#line 67 "Image2D.pm" #line 68 "Image2D.pm"
#line 1061 "../../blib/lib/PDL/PP.pm" #line 1060 "../../blib/lib/PDL/PP.pm"
#line 72 "Image2D.pm" #line 73 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 conv2d =head2 conv2d
=for sig =for sig
Signature: (a(m,n); kern(p,q); [o]b(m,n); int opt) Signature: (a(m,n); kern(p,q); [o]b(m,n); int opt)
=for ref =for ref
2D convolution of an array with a kernel (smoothing) 2D convolution of an array with a kernel (smoothing)
skipping to change at line 93 skipping to change at line 94
(i.e. wrap around axis) (i.e. wrap around axis)
=> Reflect - reflect at boundary => Reflect - reflect at boundary
=> Truncate - truncate at boundary => Truncate - truncate at boundary
=> Replicate - repeat boundary pixel values => Replicate - repeat boundary pixel values
=for bad =for bad
Unlike the FFT routines, conv2d is able to process bad values. Unlike the FFT routines, conv2d is able to process bad values.
=cut =cut
#line 119 "Image2D.pm" #line 121 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm" #line 1059 "../../blib/lib/PDL/PP.pm"
sub PDL::conv2d { sub PDL::conv2d {
my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH'; my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH';
die 'Usage: conv2d( a(m,n), kern(p,q), [o]b(m,n), {Options} )' die 'Usage: conv2d( a(m,n), kern(p,q), [o]b(m,n), {Options} )'
if $#_<1 || $#_>2; if $#_<1 || $#_>2;
my($x,$kern) = @_; my($x,$kern) = @_;
my $c = $#_ == 2 ? $_[2] : $x->nullcreate; my $c = $#_ == 2 ? $_[2] : $x->nullcreate;
&PDL::_conv2d_int($x,$kern,$c, &PDL::_conv2d_int($x,$kern,$c,
(!(defined $opt && exists $$opt{Boundary}))?0: (!(defined $opt && exists $$opt{Boundary}))?0:
(($$opt{Boundary} eq "Reflect") + (($$opt{Boundary} eq "Reflect") +
2*($$opt{Boundary} eq "Truncate") + 2*($$opt{Boundary} eq "Truncate") +
3*($$opt{Boundary} eq "Replicate"))); 3*($$opt{Boundary} eq "Replicate")));
return $c; return $c;
} }
#line 139 "Image2D.pm" #line 142 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*conv2d = \&PDL::conv2d; *conv2d = \&PDL::conv2d;
#line 145 "Image2D.pm" #line 149 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 med2d =head2 med2d
=for sig =for sig
Signature: (a(m,n); kern(p,q); [o]b(m,n); int opt) Signature: (a(m,n); kern(p,q); [o]b(m,n); int opt)
=for ref =for ref
2D median-convolution of an array with a kernel (smoothing) 2D median-convolution of an array with a kernel (smoothing)
skipping to change at line 155 skipping to change at line 157
=> Reflect - reflect at boundary => Reflect - reflect at boundary
=> Truncate - truncate at boundary => Truncate - truncate at boundary
=> Replicate - repeat boundary pixel values => Replicate - repeat boundary pixel values
=for bad =for bad
Bad values are ignored in the calculation. If all elements within the Bad values are ignored in the calculation. If all elements within the
kernel are bad, the output is set bad. kernel are bad, the output is set bad.
=cut =cut
#line 192 "Image2D.pm" #line 197 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm" #line 1059 "../../blib/lib/PDL/PP.pm"
sub PDL::med2d { sub PDL::med2d {
my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH'; my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH';
die 'Usage: med2d( a(m,n), kern(p,q), [o]b(m,n), {Options} )' die 'Usage: med2d( a(m,n), kern(p,q), [o]b(m,n), {Options} )'
if $#_<1 || $#_>2; if $#_<1 || $#_>2;
my($x,$kern) = @_; my($x,$kern) = @_;
croak "med2d: kernel must contain some positive elements.\n" croak "med2d: kernel must contain some positive elements.\n"
if all( $kern <= 0 ); if all( $kern <= 0 );
my $c = $#_ == 2 ? $_[2] : $x->nullcreate; my $c = $#_ == 2 ? $_[2] : $x->nullcreate;
&PDL::_med2d_int($x,$kern,$c, &PDL::_med2d_int($x,$kern,$c,
(!(defined $opt && exists $$opt{Boundary}))?0: (!(defined $opt && exists $$opt{Boundary}))?0:
(($$opt{Boundary} eq "Reflect") + (($$opt{Boundary} eq "Reflect") +
2*($$opt{Boundary} eq "Truncate") + 2*($$opt{Boundary} eq "Truncate") +
3*($$opt{Boundary} eq "Replicate"))); 3*($$opt{Boundary} eq "Replicate")));
return $c; return $c;
} }
#line 214 "Image2D.pm" #line 220 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*med2d = \&PDL::med2d; *med2d = \&PDL::med2d;
#line 220 "Image2D.pm" #line 227 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 med2df =head2 med2df
=for sig =for sig
Signature: (a(m,n); [o]b(m,n); int __p_size; int __q_size; int opt) Signature: (a(m,n); [o]b(m,n); int __p_size; int __q_size; int opt)
=for ref =for ref
2D median-convolution of an array in a pxq window (smoothing) 2D median-convolution of an array in a pxq window (smoothing)
skipping to change at line 219 skipping to change at line 222
=> Reflect - reflect at boundary => Reflect - reflect at boundary
=> Truncate - truncate at boundary => Truncate - truncate at boundary
=> Replicate - repeat boundary pixel values => Replicate - repeat boundary pixel values
=for bad =for bad
med2df does not process bad values. med2df does not process bad values.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 268 "Image2D.pm" #line 276 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm" #line 1059 "../../blib/lib/PDL/PP.pm"
sub PDL::med2df { sub PDL::med2df {
my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH'; my $opt; $opt = pop @_ if ref($_[$#_]) eq 'HASH';
die 'Usage: med2df( a(m,n), [o]b(m,n), p, q, {Options} )' die 'Usage: med2df( a(m,n), [o]b(m,n), p, q, {Options} )'
if $#_<2 || $#_>3; if $#_<2 || $#_>3;
my($x,$p,$q) = @_; my($x,$p,$q) = @_;
croak "med2df: kernel must contain some positive elements.\n" croak "med2df: kernel must contain some positive elements.\n"
if $p == 0 && $q == 0; if $p == 0 && $q == 0;
my $c = $#_ == 3 ? $_[3] : $x->nullcreate; my $c = $#_ == 3 ? $_[3] : $x->nullcreate;
&PDL::_med2df_int($x,$c,$p,$q, &PDL::_med2df_int($x,$c,$p,$q,
(!(defined $opt && exists $$opt{Boundary}))?0: (!(defined $opt && exists $$opt{Boundary}))?0:
(($$opt{Boundary} eq "Reflect") + (($$opt{Boundary} eq "Reflect") +
2*($$opt{Boundary} eq "Truncate") + 2*($$opt{Boundary} eq "Truncate") +
3*($$opt{Boundary} eq "Replicate"))); 3*($$opt{Boundary} eq "Replicate")));
return $c; return $c;
} }
#line 290 "Image2D.pm" #line 299 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*med2df = \&PDL::med2df; *med2df = \&PDL::med2df;
#line 296 "Image2D.pm" #line 306 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 box2d =head2 box2d
=for sig =for sig
Signature: (a(n,m); [o] b(n,m); int wx; int wy; int edgezero) Signature: (a(n,m); [o] b(n,m); int wx; int wy; int edgezero)
=for ref =for ref
fast 2D boxcar average fast 2D boxcar average
skipping to change at line 277 skipping to change at line 281
better filters are around (e.g., use L</conv2d> with the appropriate better filters are around (e.g., use L</conv2d> with the appropriate
kernel). On the other hand it is fast and computational cost grows only kernel). On the other hand it is fast and computational cost grows only
approximately linearly with window size. approximately linearly with window size.
=for bad =for bad
box2d does not process bad values. box2d does not process bad values.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 338 "Image2D.pm" #line 349 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*box2d = \&PDL::box2d; *box2d = \&PDL::box2d;
#line 344 "Image2D.pm" #line 356 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 patch2d =head2 patch2d
=for sig =for sig
Signature: (a(m,n); int bad(m,n); [o]b(m,n)) Signature: (a(m,n); int bad(m,n); [o]b(m,n))
=for ref =for ref
patch bad pixels out of 2D images using a mask patch bad pixels out of 2D images using a mask
skipping to change at line 309 skipping to change at line 314
C<$bad> is a 2D mask array where 1=bad pixel 0=good pixel. C<$bad> is a 2D mask array where 1=bad pixel 0=good pixel.
Pixels are replaced by the average of their non-bad neighbours; Pixels are replaced by the average of their non-bad neighbours;
if all neighbours are bad, the original data value is if all neighbours are bad, the original data value is
copied across. copied across.
=for bad =for bad
This routine does not handle bad values - use L</patchbad2d> instead This routine does not handle bad values - use L</patchbad2d> instead
=cut =cut
#line 378 "Image2D.pm" #line 391 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*patch2d = \&PDL::patch2d; *patch2d = \&PDL::patch2d;
#line 384 "Image2D.pm" #line 398 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 patchbad2d =head2 patchbad2d
=for sig =for sig
Signature: (a(m,n); [o]b(m,n)) Signature: (a(m,n); [o]b(m,n))
=for ref =for ref
patch bad pixels out of 2D images containing bad values patch bad pixels out of 2D images containing bad values
skipping to change at line 342 skipping to change at line 348
if all neighbours are bad, the output is set bad. if all neighbours are bad, the output is set bad.
If the input ndarray contains I<no> bad values, then a straight copy If the input ndarray contains I<no> bad values, then a straight copy
is performed (see L</patch2d>). is performed (see L</patch2d>).
=for bad =for bad
patchbad2d handles bad values. The output ndarray I<may> contain patchbad2d handles bad values. The output ndarray I<may> contain
bad values, depending on the pattern of bad values in the input ndarray. bad values, depending on the pattern of bad values in the input ndarray.
=cut =cut
#line 419 "Image2D.pm" #line 434 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*patchbad2d = \&PDL::patchbad2d; *patchbad2d = \&PDL::patchbad2d;
#line 425 "Image2D.pm" #line 441 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 max2d_ind =head2 max2d_ind
=for sig =for sig
Signature: (a(m,n); [o]val(); int [o]x(); int[o]y()) Signature: (a(m,n); [o]val(); int [o]x(); int[o]y())
=for ref =for ref
Return value/position of maximum value in 2D image Return value/position of maximum value in 2D image
Contributed by Tim Jeness Contributed by Tim Jeness
=for bad =for bad
Bad values are excluded from the search. If all pixels Bad values are excluded from the search. If all pixels
are bad then the output is set bad. are bad then the output is set bad.
=cut =cut
#line 455 "Image2D.pm" #line 472 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*max2d_ind = \&PDL::max2d_ind; *max2d_ind = \&PDL::max2d_ind;
#line 461 "Image2D.pm" #line 479 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 centroid2d =head2 centroid2d
=for sig =for sig
Signature: (im(m,n); x(); y(); box(); [o]xcen(); [o]ycen()) Signature: (im(m,n); x(); y(); box(); [o]xcen(); [o]ycen())
=for ref =for ref
Refine a list of object positions in 2D image by centroiding in a box Refine a list of object positions in 2D image by centroiding in a box
skipping to change at line 396 skipping to change at line 404
C<$box> is the full-width of the box, i.e. the window C<$box> is the full-width of the box, i.e. the window
is C<+/- $box/2>. is C<+/- $box/2>.
=for bad =for bad
Bad pixels are excluded from the centroid calculation. If all elements are Bad pixels are excluded from the centroid calculation. If all elements are
bad (or the pixel sum is 0 - but why would you be centroiding bad (or the pixel sum is 0 - but why would you be centroiding
something with negatives in...) then the output values are set bad. something with negatives in...) then the output values are set bad.
=cut =cut
#line 493 "Image2D.pm" #line 512 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*centroid2d = \&PDL::centroid2d; *centroid2d = \&PDL::centroid2d;
#line 499 "Image2D.pm" #line 519 "Image2D.pm"
#line 941 "image2d.pd" #line 940 "image2d.pd"
=head2 cc8compt =head2 cc8compt
=for ref =for ref
Connected 8-component labeling of a binary image. Connected 8-component labeling of a binary image.
Connected 8-component labeling of 0,1 image - i.e. find separate Connected 8-component labeling of 0,1 image - i.e. find separate
segmented objects and fill object pixels with object number. segmented objects and fill object pixels with object number.
8-component labeling includes all neighboring pixels. 8-component labeling includes all neighboring pixels.
skipping to change at line 445 skipping to change at line 454
sub PDL::cc8compt{ sub PDL::cc8compt{
return ccNcompt(shift,8); return ccNcompt(shift,8);
} }
*cc8compt = \&PDL::cc8compt; *cc8compt = \&PDL::cc8compt;
sub PDL::cc4compt{ sub PDL::cc4compt{
return ccNcompt(shift,4); return ccNcompt(shift,4);
} }
*cc4compt = \&PDL::cc4compt; *cc4compt = \&PDL::cc4compt;
#line 546 "Image2D.pm" #line 567 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 ccNcompt =head2 ccNcompt
=for sig =for sig
Signature: (a(m,n); int+ [o]b(m,n); int con) Signature: (a(m,n); int+ [o]b(m,n); int con)
=for ref =for ref
Connected component labeling of a binary image. Connected component labeling of a binary image.
skipping to change at line 479 skipping to change at line 488
$segmented2 = ccNcompt( $image > $threshold, 8); $segmented2 = ccNcompt( $image > $threshold, 8);
where the second parameter specifies the connectivity (4 or 8) of the labeling. where the second parameter specifies the connectivity (4 or 8) of the labeling.
=for bad =for bad
ccNcompt ignores the bad-value flag of the input ndarrays. ccNcompt ignores the bad-value flag of the input ndarrays.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 588 "Image2D.pm" #line 610 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*ccNcompt = \&PDL::ccNcompt; *ccNcompt = \&PDL::ccNcompt;
#line 594 "Image2D.pm" #line 617 "Image2D.pm"
#line 1109 "image2d.pd"
#line 1110 "image2d.pd"
=head2 polyfill =head2 polyfill
=for ref =for ref
fill the area of the given polygon with the given colour. fill the area of the given polygon with the given colour.
This function works inplace, i.e. modifies C<im>. This function works inplace, i.e. modifies C<im>.
=for usage =for usage
skipping to change at line 538 skipping to change at line 549
} }
else else
{ {
PDL::polyfill_pp($im,$ps,$colour); PDL::polyfill_pp($im,$ps,$colour);
} }
return $im; return $im;
} }
*polyfill = \&PDL::polyfill; *polyfill = \&PDL::polyfill;
#line 651 "Image2D.pm" #line 675 "Image2D.pm"
#line 1167 "image2d.pd" #line 1166 "image2d.pd"
=head2 pnpoly =head2 pnpoly
=for ref =for ref
'points in a polygon' selection from a 2-D ndarray 'points in a polygon' selection from a 2-D ndarray
=for usage =for usage
$mask = $img->pnpoly($ps); $mask = $img->pnpoly($ps);
skipping to change at line 619 skipping to change at line 630
my $testy = PDL::Core::topdl($ty)->dummy(0); my $testy = PDL::Core::topdl($ty)->dummy(0);
my $vertxj = PDL::Core::topdl($vertx)->rotate(1); my $vertxj = PDL::Core::topdl($vertx)->rotate(1);
my $vertyj = PDL::Core::topdl($verty)->rotate(1); my $vertyj = PDL::Core::topdl($verty)->rotate(1);
my $mask = ( ($verty>$testy) == ($vertyj>$testy) ); my $mask = ( ($verty>$testy) == ($vertyj>$testy) );
my $c = sumover( ! $mask & ( $testx < ($vertxj-$vertx) * ($testy-$verty) my $c = sumover( ! $mask & ( $testx < ($vertxj-$vertx) * ($testy-$verty)
/ ($vertyj-$verty+$mask) + $vertx) ) % 2; / ($vertyj-$verty+$mask) + $vertx) ) % 2;
return $c; return $c;
} }
*pnpoly = \&PDL::pnpoly; *pnpoly = \&PDL::pnpoly;
#line 734 "Image2D.pm" #line 759 "Image2D.pm"
#line 1250 "image2d.pd" #line 1249 "image2d.pd"
=head2 polyfillv =head2 polyfillv
=for ref =for ref
return the (dataflowed) area of an image described by a polygon return the (dataflowed) area of an image described by a polygon
=for usage =for usage
polyfillv($im,$ps,[\%options]); polyfillv($im,$ps,[\%options]);
skipping to change at line 673 skipping to change at line 684
my $parsed = PDL::Options->new({'Method' => undef}); my $parsed = PDL::Options->new({'Method' => undef});
$parsed->options($opt); $parsed->options($opt);
return $im->where(PDL::pnpoly_pp($im, $ps)) if $parsed->current-> {'Method'} eq 'pnpoly'; return $im->where(PDL::pnpoly_pp($im, $ps)) if $parsed->current-> {'Method'} eq 'pnpoly';
} }
my $msk = zeroes(long,$im->dims); my $msk = zeroes(long,$im->dims);
PDL::polyfill_pp($msk, $ps, 1); PDL::polyfill_pp($msk, $ps, 1);
return $im->where($msk); return $im->where($msk);
} }
*polyfillv = \&PDL::polyfillv; *polyfillv = \&PDL::polyfillv;
#line 790 "Image2D.pm" #line 816 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 rot2d =head2 rot2d
=for sig =for sig
Signature: (im(m,n); float angle(); bg(); int aa(); [o] om(p,q)) Signature: (im(m,n); float angle(); bg(); int aa(); [o] om(p,q))
=for ref =for ref
rotate an image by given C<angle> rotate an image by given C<angle>
skipping to change at line 715 skipping to change at line 726
L<PDL::Transform> offers a more general interface to L<PDL::Transform> offers a more general interface to
distortions, including rotation, with various types of sampling; but distortions, including rotation, with various types of sampling; but
rot2d is faster. rot2d is faster.
=for bad =for bad
rot2d ignores the bad-value flag of the input ndarrays. rot2d ignores the bad-value flag of the input ndarrays.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 839 "Image2D.pm" #line 866 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*rot2d = \&PDL::rot2d; *rot2d = \&PDL::rot2d;
#line 845 "Image2D.pm" #line 873 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 bilin2d =head2 bilin2d
=for sig =for sig
Signature: (Int(n,m); O(q,p)) Signature: (Int(n,m); O(q,p))
=for ref =for ref
Bilinearly maps the first ndarray in the second. The Bilinearly maps the first ndarray in the second. The
interpolated values are actually added to the second interpolated values are actually added to the second
ndarray which is supposed to be larger than the first one. ndarray which is supposed to be larger than the first one.
=for bad =for bad
bilin2d ignores the bad-value flag of the input ndarrays. bilin2d ignores the bad-value flag of the input ndarrays.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 874 "Image2D.pm" #line 903 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*bilin2d = \&PDL::bilin2d; *bilin2d = \&PDL::bilin2d;
#line 880 "Image2D.pm" #line 910 "Image2D.pm"
#line 1059 "../../blib/lib/PDL/PP.pm" #line 1058 "../../blib/lib/PDL/PP.pm"
=head2 rescale2d =head2 rescale2d
=for sig =for sig
Signature: (Int(m,n); O(p,q)) Signature: (Int(m,n); O(p,q))
=for ref =for ref
The first ndarray is rescaled to the dimensions of the second The first ndarray is rescaled to the dimensions of the second
skipping to change at line 772 skipping to change at line 785
tracking, consider using L<PDL::Transform::map|PDL::Transform/map> tracking, consider using L<PDL::Transform::map|PDL::Transform/map>
instead: it does these things, at some speed penalty compared to instead: it does these things, at some speed penalty compared to
rescale2d. rescale2d.
=for bad =for bad
rescale2d ignores the bad-value flag of the input ndarrays. rescale2d ignores the bad-value flag of the input ndarrays.
It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays. It will set the bad-value flag of all output ndarrays if the flag is set for any of the input ndarrays.
=cut =cut
#line 914 "Image2D.pm" #line 945 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*rescale2d = \&PDL::rescale2d; *rescale2d = \&PDL::rescale2d;
#line 920 "Image2D.pm" #line 952 "Image2D.pm"
#line 1570 "image2d.pd" #line 1569 "image2d.pd"
=head2 fitwarp2d =head2 fitwarp2d
=for ref =for ref
Find the best-fit 2D polynomial to describe Find the best-fit 2D polynomial to describe
a coordinate transformation. a coordinate transformation.
=for usage =for usage
skipping to change at line 1201 skipping to change at line 1215
# #
my $mat = _mkbasis( ones(byte,$nf,$nf), $npts, $u, $v ); my $mat = _mkbasis( ones(byte,$nf,$nf), $npts, $u, $v );
my $x = reshape( $mat x $px->clump(-1)->transpose(), $npts ); my $x = reshape( $mat x $px->clump(-1)->transpose(), $npts );
my $y = reshape( $mat x $py->clump(-1)->transpose(), $npts ); my $y = reshape( $mat x $py->clump(-1)->transpose(), $npts );
return ( $x, $y ); return ( $x, $y );
} # sub: applywarp2d } # sub: applywarp2d
*applywarp2d = \&PDL::applywarp2d; *applywarp2d = \&PDL::applywarp2d;
#line 1348 "Image2D.pm" #line 1381 "Image2D.pm"
#line 2005 "image2d.pd" #line 2004 "image2d.pd"
=head2 warp2d =head2 warp2d
=for sig =for sig
Signature: (img(m,n); double px(np,np); double py(np,np); [o] warp(m,n); { opt ions }) Signature: (img(m,n); double px(np,np); double py(np,np); [o] warp(m,n); { opt ions })
=for ref =for ref
Warp a 2D image given a polynomial describing the I<reverse> mapping. Warp a 2D image given a polynomial describing the I<reverse> mapping.
skipping to change at line 1335 skipping to change at line 1349
# note: convert to lower case # note: convert to lower case
sub _check_kernel ($$) { sub _check_kernel ($$) {
my $kernel = lc shift; my $kernel = lc shift;
my $code = shift; my $code = shift;
barf "Unknown kernel $kernel sent to $code\n" . barf "Unknown kernel $kernel sent to $code\n" .
"\tmust be one of [" . join(',',keys %warp2d) . "]\n" "\tmust be one of [" . join(',',keys %warp2d) . "]\n"
unless exists $warp2d{$kernel}; unless exists $warp2d{$kernel};
return $kernel; return $kernel;
} }
} }
#line 1484 "Image2D.pm" #line 1518 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm" #line 1059 "../../blib/lib/PDL/PP.pm"
sub PDL::warp2d { sub PDL::warp2d {
my $opts = PDL::Options->new( { KERNEL => "tanh", NOVAL => 0 } ); my $opts = PDL::Options->new( { KERNEL => "tanh", NOVAL => 0 } );
$opts->options( pop(@_) ) if ref($_[$#_]) eq "HASH"; $opts->options( pop(@_) ) if ref($_[$#_]) eq "HASH";
die "Usage: warp2d( in(m,n), px(np,np); py(np,np); [o] out(m,n), {Options} ) " die "Usage: warp2d( in(m,n), px(np,np); py(np,np); [o] out(m,n), {Options} ) "
if $#_<2 || $#_>3; if $#_<2 || $#_>3;
my $img = shift; my $img = shift;
my $px = shift; my $px = shift;
my $py = shift; my $py = shift;
my $out = $#_ == -1 ? PDL->null() : shift; my $out = $#_ == -1 ? PDL->null() : shift;
# safety checks # safety checks
my $copt = $opts->current(); my $copt = $opts->current();
my $kernel = _check_kernel( $$copt{KERNEL}, "warp2d" ); my $kernel = _check_kernel( $$copt{KERNEL}, "warp2d" );
&PDL::_warp2d_int( $img, $px, $py, $out, $kernel, $$copt{NOVAL} ); &PDL::_warp2d_int( $img, $px, $py, $out, $kernel, $$copt{NOVAL} );
return $out; return $out;
} }
#line 1509 "Image2D.pm" #line 1544 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*warp2d = \&PDL::warp2d; *warp2d = \&PDL::warp2d;
#line 1515 "Image2D.pm" #line 1551 "Image2D.pm"
#line 2319 "image2d.pd" #line 2318 "image2d.pd"
=head2 warp2d_kernel =head2 warp2d_kernel
=for ref =for ref
Return the specified kernel, as used by L</warp2d> Return the specified kernel, as used by L</warp2d>
=for usage =for usage
( $x, $k ) = warp2d_kernel( $name ) ( $x, $k ) = warp2d_kernel( $name )
The valid values for C<$name> are the same as the C<KERNEL> option The valid values for C<$name> are the same as the C<KERNEL> option
of L<warp2d()|/warp2d>. of L<warp2d()|/warp2d>.
=for example =for example
line warp2d_kernel( "hamming" ); line warp2d_kernel( "hamming" );
=cut =cut
#line 1540 "Image2D.pm" #line 1577 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm" #line 1059 "../../blib/lib/PDL/PP.pm"
sub PDL::warp2d_kernel ($) { sub PDL::warp2d_kernel ($) {
my $kernel = _check_kernel( shift, "warp2d_kernel" ); my $kernel = _check_kernel( shift, "warp2d_kernel" );
my $nelem = _get_kernel_size(); my $nelem = _get_kernel_size();
my $x = zeroes( $nelem ); my $x = zeroes( $nelem );
my $k = zeroes( $nelem ); my $k = zeroes( $nelem );
&PDL::_warp2d_kernel_int( $x, $k, $kernel ); &PDL::_warp2d_kernel_int( $x, $k, $kernel );
return ( $x, $k ); return ( $x, $k );
# return _get_kernel( $kernel ); # return _get_kernel( $kernel );
} }
*warp2d_kernel = \&PDL::warp2d_kernel; *warp2d_kernel = \&PDL::warp2d_kernel;
#line 1560 "Image2D.pm" #line 1598 "Image2D.pm"
#line 1060 "../../blib/lib/PDL/PP.pm"
#line 1061 "../../blib/lib/PDL/PP.pm"
*warp2d_kernel = \&PDL::warp2d_kernel; *warp2d_kernel = \&PDL::warp2d_kernel;
#line 1566 "Image2D.pm" #line 1605 "Image2D.pm"
#line 30 "image2d.pd" #line 29 "image2d.pd"
=head1 AUTHORS =head1 AUTHORS
Copyright (C) Karl Glazebrook 1997 with additions by Robin Williams Copyright (C) Karl Glazebrook 1997 with additions by Robin Williams
(rjrw@ast.leeds.ac.uk), Tim Jeness (timj@jach.hawaii.edu), (rjrw@ast.leeds.ac.uk), Tim Jeness (timj@jach.hawaii.edu),
and Doug Burke (burke@ifa.hawaii.edu). and Doug Burke (burke@ifa.hawaii.edu).
All rights reserved. There is no warranty. You are allowed All rights reserved. There is no warranty. You are allowed
to redistribute this software / documentation under certain to redistribute this software / documentation under certain
conditions. For details, see the file COPYING in the PDL conditions. For details, see the file COPYING in the PDL
distribution. If this file is separated from the PDL distribution, distribution. If this file is separated from the PDL distribution,
the copyright notice should be included in the file. the copyright notice should be included in the file.
=cut =cut
#line 1587 "Image2D.pm" #line 1627 "Image2D.pm"
# Exit with OK status # Exit with OK status
1; 1;
 End of changes. 83 change blocks. 
86 lines changed or deleted 102 lines changed or added

Home  |  About  |  Features  |  All  |  Newest  |  Dox  |  Diffs  |  RSS Feeds  |  Screenshots  |  Comments  |  Imprint  |  Privacy  |  HTTP(S)