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
Colors
(you may be able to use a SparseMat for this and should if you can)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
Colors
(you may be able to use a SparseMat for this and should if you can)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