Получение доминирующего значения цвета из гистограммы ВПГ

Я создаю гистограмму HSV из изображения, как показано ниже.

- (void)processImageWithHsv:(Mat&)image;
{
Mat image_hsv;

cvtColor(image, image_hsv, CV_BGR2HSV);

int hbins = 50, sbins = 60;
int histSize[] = {hbins, sbins};

float hranges[] = { 0, 360 };
float sranges[] = { 0, 256 };

const float* ranges[] = { hranges, sranges };
MatND hist;

int channels[] = {0, 1};

calcHist( &image_hsv, 1, channels, Mat(), // do not use mask
hist, 2, histSize, ranges,
true, // the histogram is uniform
false );

double maxVal = 0;
minMaxLoc(hist, 0, &maxVal, 0, 0);

// ???: HOW Convert this information to colour value

}

Но я понятия не имею, чтобы получить наиболее доминирующее значение цвета из этого hist?
Должен ли я использовать maxVal?

0

Решение

Вы сделали несколько ошибок:

  1. Вы ищете доминирующий цвет value но ты говоришь calcHist работать с оттенком и насыщенностью. Вы должны изменить каналы.
  2. Ваш hranges неправильно: должно быть 180.
  3. dims должно быть 1 (не 2), потому что вам нужно только value гистограмма.

После тех исправлений maxVal должен содержать наиболее повторяющиеся value значение.

1

Другие решения

- (void)processImageWithHsv:(Mat&)image;
{
Mat image_hsv;

cvtColor(image, image_hsv, CV_BGR2HSV);

// Quanta Ratio
int scale = 10;

int hbins = 36, sbins = 25, vbins = 25;
int histSize[] = {hbins, sbins, vbins};

float hranges[] = { 0, 180 };
float sranges[] = { 0, 256 };
float vranges[] = { 0, 256 };

const float* ranges[] = { hranges, sranges, vranges };
MatND hist;

int channels[] = {0, 1, 2};

calcHist( &image_hsv, 1, channels, Mat(), // do not use mask
hist, 3, histSize, ranges,
true, // the histogram is uniform
false );

int maxVal = 0;

int hue = 0;
int saturation = 0;
int value = 0;

for( int h = 0; h < hbins; h++ )
for( int s = 0; s < sbins; s++ )
for( int v = 0; v < vbins; v++ )
{
int binVal = hist.at<int>(h, s, v);
if(binVal > maxVal)
{
maxVal = binVal;

hue = h;
saturation = s;
value = v;
}
}

hue = hue * scale; // angle 0 - 360
saturation = saturation * scale; // 0 - 255
value = value * scale; // 0 - 255
}
0

По вопросам рекламы [email protected]