Мне интересно, как построить 2d гистограмму матрицы HSV в opencv C++. Мой текущий код, пытающийся отобразить его, терпит неудачу. Я посмотрел вокруг, как построить гистограммы, и все, что я нашел, это те, которые замышляют их как независимые 1d гистограммы.opencv рисунок 2d гистограмма
Вот мой выходной ток с числом оттенков бункеров составляет 30 и бункеров насыщения является 32:
Вот еще один выход с количеством оттенков бункеров, являющихся 7 и saturaation бункеров, являющихся 5:
Я хотел бы, чтобы выглядеть как результат здесь
Я также заметил, что всякий раз, когда я делаю cout < < Hist.size это дает мне 50x50. Должен ли я понять, что просто означает, что первое измерение массива составляет 250?
Кроме того, как сортировать гистограмму с высокой до низкой (или наоборот) частоты? Это еще одна проблема, которую я пытаюсь решить.
Моя текущая функция заключается в следующем.
void Perform_Hist(Mat& MeanShift, Mat& Pyramid_Result, Mat& BackProj){
Mat HSV, Hist;
int histSize[] = {hbins, sbins};
int channels[] = {0, 1};
float hranges[] = {0, 180};
float sranges[] = {0, 256};
const float* ranges[] = {hranges, sranges};
cvtColor(MeanShift, HSV, CV_BGR2HSV);
Mat PyrGray = Pyramid_Result.clone();
calcHist(&HSV, 1, channels, Mat(), Hist, 2, histSize, ranges, true, false);
normalize(Hist, Hist, 0, 255, NORM_MINMAX, -1, Mat());
invert(Hist, Hist, 1);
calcBackProject(&PyrGray, 1, channels, Hist, BackProj, ranges, 1, true);
double maxVal = 0; minMaxLoc(Hist, 0, &maxVal, 0, 0);
int scale = 10;
Mat histImage = Mat::zeros(sbins*scale, hbins*10, CV_8UC3);
for(int i = 1; i < hbins * sbins; i++){
line(histImage,
Point(hbins*sbins*(i-1), sbins - cvRound(Hist.at<float>(i-1))),
Point(hbins*sbins*(i-1), sbins - cvRound(Hist.at<float>(i))),
Scalar(255,0,0), 2, 8, 0);
}
imshow (HISTOGRAM, histImage);
}
, что это двумерная гистограмма? Гистограмма - это вероятность (или количество пикселей) каждого цвета (или любого другого параметра) на изображении (или любой набор данных с любой размерностью), поэтому график 2d-графика x ось - это цвет (значение, код, индекс ...) и y ось - вероятность. Таким образом, вы подразумеваете под 2D-гистограммой это или вы хотите сделать гистограмму для каждого сегмента изображения (например, сетки)? и график гистограмм каким-то образом, как 3D-график? .... кстати. выход гистограммы обычно 1D-массив, а не изображение ... – Spektre
Также вы не можете сортировать цвета по частоте, потому что цвет не является световой частотой (свет какой-то частоты имеет цвет, но назад он не работает), поэтому вы можете сортировать по оттенку вместо. если вы нормализуете интенсивность цвета (значение = 1), тогда вы можете построить 3D-график базы гистограммы. xy - это цветной круг HSV, а Z - вероятность этого цвета ... без нормализации вам понадобится 4D-график ... для таких plot type – Spektre
Это действительно 2d гистограмма, я должен был сделать это ясно. Виноват! Кроме того, как бы я сортировать по оттенку? Могу ли я также сортировать по насыщенности, чтобы следить за каждым оттенком или нет? – Zypps987