I have a 3-channel image , and I tried to get the histograms of 3 channels . Then I found out what I need is to count how many times every colors shows , it means I have to see every pixel as a 3D vector .
Can CalcHist make it ?
I have a 3-channel image , and I tried to get the histograms of 3 channels . Then I found out what I need is to count how many times every colors shows , it means I have to see every pixel as a 3D vector .
Can CalcHist make it ?
why are you doing this ? what is the purpose ?
it will compute an intensity distribution per channel
(an 1d vector for a single channel, a 2d plane for 2 channels, and a 3d cube for 3)
probably not what you wanted
to count ocurrences of rgb triplets, id propose something else:
map<int,int> counter; // key:color, val:count
// loop over pixels:
Vec3b pixel = img.at<Vec3b >(y,x);
// integer encoding:
int color = pixel[0] << 16 + pixel [1] << 8 + pixel[2];
if (counter.find(color) == counter.end())
counter[color] = 0; // new color
else
counter[color] ++;
now you got a count for each rgb pixel in the map, to retrieve the resp. rgb value from the int (map key), do:
Vec3b pixel( (color>>16)&0xff, (color>>8)&0xff, color&0xff );
To estimate if the main color of the image is close enough to a given one .
Thanks for your advise , it does match my purpose .
Hi @sd3326852
It seems to me your are looking for histogram comparison. Check out the tutorial.
May be you can work it out without histograms. You can define a test to check if a color is close enough to the given one. inRange()
function can perform such test.
You can try this sample