http://www.perlmonks.org?node_id=11115346

Barrabas has asked for the wisdom of the Perl Monks concerning the following question:

Oh great and venerable ones...

I am trying to create a PDL color "Cube" array of the counts of each color in an image.

The image is a PDL of dimension(width,height,3) of RGB values:

> my $Image = PDL::IO::Image->new_from_file("SomeImage.jpg"); > my $Pixels = $Image->pixels_to_pdl; > print $Pixels->info; PDL: Byte D [1920,1920,3]

The color count is a pdl cube of dimension 256,256,256:

> my $Colors = zeroes(long,256,256,256);

I would like to iterate over the pixels in the image, incrementing the element in the $Colors cube indexed by the RGB value of each pixel.

> my $P2 = $Pixels->clump(2); # Collapses $Pixels to [3686400,3] > my $P3 = $P2->mv(0,1); # Reverses $Pixels to [3,3686400] > $Colors->indexND($P3)++; # Thread over $P3 2nd dimension, index +into $Colors, and increment > print $Colors->at(0,0,0); # Print count of black pixels 1

There are many black pixels in the image, so the count at RGB(0,0,0) should be fairly large. Looking through the $Color pdl, it *appears* that colors are being set to 1, but not incremented. IOW, the cube is sprinkled with 1 values where I would expect it to be sprinkled with color counts.

My two questions are:

1) What is my mistake, and

2) Is there a straightforward PDL way to do this? (Ie - thread one PDL as an index into another for incrementing)