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. | ||||

=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. | |||

=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. | |||

=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. | |||

=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. | |||

=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 |