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)


In reply to How to use a pdl as an index into another pdl by Barrabas

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.