1 | initial version |

Unless you have a 16 MegaPixel image, this is probably one of the rare occasions where looping over all pixels and performing pixel-wise operations would be the fastest. Here's how I would do it (trying to minimize required storage, even so this requires quite a lot):

You would need

- a 256x256x256 Mat Let's call it
`Colors`

(you may be able to use a SparseMat for this and should if you can) - a Mat the size of your
original image, lets call it
`Next`

The type of both Mats should be `CV_32SC1`

. You could get away with a `CV_16UC1`

if the original image is <256x256. Both Mats initialized with all zeros.

What you then do is cycle through the pixels.

For each pixel:

Calculate its `index=X+Y*width+1`

It's color values are `R, G, B`

.

If the value of the `Colors`

Mat at location `(R,G,B)`

is zero set it to `index`

and go to next pixel

if it is not zero (say it is `p`

), go to position `p`

in the `Next`

mat. If that is zero, set it to `index`

and continue.
if not zero, repeat the last step as many times as is required to get to zero, then set that zero to `index`

Finally, to get all the pixel values of a certain color, you would find the corresponding pixel in `Colors`

, if it is zero there are no such pixels, if it is a value `index!=0`

, that is the index of the first pixel of that color.
You then cycle through the `Next`

matrix starting with position `index`

, the value of that position is the index of the second pixel and so on, until you get to `index==0`

.

Good luck

guy

2 | No.2 Revision |

Unless you have a ~~16 ~~>16 MegaPixel image, this is probably one of the rare occasions where looping over all pixels and performing pixel-wise operations would be the fastest.
Here's how I would do it (trying to minimize required storage, even so this requires quite a lot):

You would need

- a 256x256x256 Mat Let's call it
`Colors`

(you may be able to use a SparseMat for this and should if you can) - a Mat the size of your
original image, lets call it
`Next`

The type of both Mats should be `CV_32SC1`

. You could get away with a `CV_16UC1`

if the original image is <256x256. Both Mats initialized with all zeros.

What you then do is cycle through the pixels.

For each pixel:

Calculate its `index=X+Y*width+1`

It's color values are `R, G, B`

.

If the value of the `Colors`

Mat at location `(R,G,B)`

is zero set it to `index`

and go to next pixel

if it is not zero (say it is `p`

), go to position `p`

in the `Next`

mat. If that is zero, set it to `index`

and continue.
if not zero, repeat the last step as many times as is required to get to zero, then set that zero to `index`

Finally, to get all the pixel values of a certain color, you would find the corresponding pixel in `Colors`

, if it is zero there are no such pixels, if it is a value `index!=0`

, that is the index of the first pixel of that color.
You then cycle through the `Next`

matrix starting with position `index`

, the value of that position is the index of the second pixel and so on, until you get to `index==0`

.

Good luck

guy

Copyright OpenCV foundation, 2012-2018. Content on this site is licensed under a Creative Commons Attribution Share Alike 3.0 license.