&sysread_uint48($RGB, \@rgbz); # Store RGB in uint64, RGBZ array &RADIX_SORT(\@rgbz); # Sort by digits! $std=$rgbz[0]; # Make first uint64 the STanDard $unique=1; # First one is Always Unique! for($ii=1; $ii < $num_pix; $ii++) { next if($rgbz[$ii] == $std); # Same Old value as last time! $unique++; # New value, Increment Unique $std=$rgbz[$ii]; # Make new THIS the STD } printf("%d distinct values\n", $unique); #### I:\exp\raw>cdrc pf-2015.0531-249465.pprgb.7360x4912.raw CDRC: 27645898 distinct RGBs = 76.471% in 0.946 sec I:\exp\raw>cdrc pf-2015.0531-249465.pprgb.7360x4912.raw -d CDRC: Read 216.913920MB, 36.2MP in 73 msec->2964 MB/s, CPU@3.421GHz CDRC: 36.152320M MemCpy in 67 msec RS: R_Sort-> 775 ms, C_Unique-> 32 ms, total-> 808 ms CDRC: 27645898 distinct RGBs = 76.471% in 0.950 sec #### Running C:\bin\bb2.pl Sun Dec 13 16:30:19 2015 Unique colors=27.645898M = 76.471% <<< EXACT! SE: Sum of Event Times = 6.789 min, now-init = 6.78937 min ETime=239.024 ms = 0.059%, 1 Hits, Event 'PerlMagic Read Raw File' ETime= 6.785 min = 99.941%, 1 Hits, Event 'Quantize' 99.94% -> Quantize 0.06% -> PerlMagic Read Raw File Elapsed C:\bin\bb2.pl time = 6.789 min # Here is the hash way implemented by ImageMagick Bone-Nary[*]: Running C:\bin\bb.pl Sun Dec 13 15:19:29 2015; Conv convert.exe -size 7360x4912 -depth 16 \ RGB:i:/exp/raw/pf-2015.0531-249465.pprgb.7360x4912.raw \ -unique-colors \ i:/exp/raw/pf-2015.0531-249465.pprgb.7360x4912.raw.tif -> size=165875652 Elapsed C:\bin\bb.pl time = 6.936 min I:\exp\raw>mult 165875652 /27645898 6.0000 << Very close agreement on Unique Count I:\exp\raw>mult 6.936 60 /0.946 439.915433 #### # ============================================================= sub unique_colors_perl() { use Image::Magick; # my($debug, $raw, $xres, $yres, $xysize, $unique, $xysize, %e2at); $debug=0; %e2at = (); $raw='i:/exp/raw/pf-2015.0531-249465.pprgb.7360x4912.raw'; &time_event('init', \%e2at, $debug*0); # Initialize timing &time_event('PerlMagic Read Raw File', \%e2at, $debug*0); ($xres, $yres)=&fname_to_xyres($raw, $debug); $xysize=$xres . "x$yres"; # 7360x4912 # Create a new rgb48 with just the right size $im=Image::Magick->new(size=>"$xysize", type=>'TrueColor',\ depth=>16); $err=$im->Read(filename=>"RGB:$raw"); warn $err if $err; &time_event('Quantize', \%e2at, $debug*0); ($unique) = $im->Get('colors'); printf("Unique colors=%.6fM = %6.3f%%\n", $unique/1E6, $unique/(7360*4912)); &time_event('term', \%e2at, $debug*0); # Finalize timing &show_event(\%e2at, $debug*0); # Event timing } # End Unique_Colors_Perl(). NOTE: Bone-Nary: Special build for BoneHeads who can't \ make their own! :)