in reply to Re^4: Interpolating data using pdl
in thread Interpolating data using pdl

use strict; use warnings; use PDL; use PDL::IO::Image; # data my $x = sequence( 100, 100 ); # ranges my $range1 = $x < 3000; my $range2 = ( $x >= 3000 ) * ( $x <= 7000 ); my $range3 = $x > 7000; my $bytes = ( $range1 + 2 * $range2 + 3 * $range3 )-> byte; my $palette = byte [ [ 0, 0, 0 ], [ 255, 50, 50 ], [ 128, 255, 0 ], [ 255, 215, 0 ] ]; $bytes-> wimage( 'test.png', { palette => $palette });

Not sure if I understand what you need, but, "from the top of my head", this code produces rather dull looking image with three colorful stripes (no time to invent some "smart" data). You have your conditions, combine them, associate with palette of the same length + 1.

Replies are listed 'Best First'.
Re^6: Interpolating data using pdl
by karthik248 (Acolyte) on Mar 16, 2017 at 05:22 UTC

    I'm able to use your solution. When I try to initiate a piddle with zeroes(5400,2700) it works fine, but zeroes(21600,10800) doesn't work. It shows an error as Probably false alloc of over 1Gb PDL! (set $PDL::BIGPDL = 1 to enable). I tried setting $PDL::BIGPDL=1, but then it crashes. How can we solve this?

      zeroes(21600,10800) works for me. Are you on 32-bit OS? Then use 64-bit. If your data is going to finish as 8 bits per channel image anyway, then work with byte piddles.

      P.S. BTW, you understand, that your image will be 700 MB (uncompressed), don't you?

        PDL 2.067 removed the $PDL::BIGPDL check, because 1GB isn't big anymore. zeroes(21600,10800) has about 200,000 elements in, which for double (the default) at 8 bytes each would be about 1.6GB. float would be half that. byte would naturally be an eighth. Which to use depends on both available resources, and the needs of your application.