Я хотел бы построить тепловую карту из координат точек, перекрывающих изображение (в оттенках серого). У меня есть координаты x и y моих точек. Идея состоит в том, чтобы легко увидеть внимание / плотность, где сосредоточены точки (красная область, если есть важное количество точек).
Я думаю, что я могу использовать OpenCV для этого. Следующая функция звучит интересно: applyColorMap(src, result, cv::COLORMAP_JET);
, Но я не знаю, как связать эту карту с точками, а не с изображением.
Кто-нибудь знает, как построить тепловую карту из координат точек, пожалуйста?
Благодаря коду @ berak и использованию COLORMAP_RAINBOW
вместо COLORMAP_JET
вот что я получаю:
Это близко к результату, который я хочу, за исключением того, что он кажется слишком «дискретным» и недостаточно «гладким» / «нечетким». Я не хочу, чтобы точки появлялись (особенно те, которые «одни»), я хочу, чтобы зона плотности четко отображалась как Вот.
Как некоторые из вас сказали, я думаю, что мне «просто» нужно изменить интенсивность пикселей вокруг моего ROI.
У кого-нибудь есть еще подсказки, пожалуйста?
вот моя идея — применить преобразование расстояния для визуализации плотности точек:
// generate demo data, you will just set your pixels here:
RNG &ran(theRNG());
Mat img(300,300,CV_8U,Scalar(255)); // inverted b/w scheme
for ( int i=0; i<600; i++ )
{
int x=ran.uniform(0,300);
int y=ran.uniform(0,300);
img.at<uchar>(y,x) = 0;
}
Mat draw;
distanceTransform(img,draw,CV_DIST_L2,5);
// back from float to uchar, needs a heuristic scale factor here (10 works nice for the demo)
draw.convertTo(draw,CV_8U,10);
// cerr << draw(Rect(30,30,10,10)) << endl; // peek into the data, does it look good ?
applyColorMap(draw,draw, cv::COLORMAP_JET);
imshow("jetmap",draw);
waitKey();
Простым способом было бы использовать одноканальное изображение (в идеале с большим количеством BPP, чем обычные 8-битные изображения), инициализировать его нулем, а затем выполнить итерацию по всем точкам. Затем вы увеличиваете пиксель, соответствующий каждой точке, что приводит к высоким значениям, где падает много точек, и низким значениям, когда точки отсутствуют.
При желании, если вы хотите получить довольно «нечеткую» карту (трудно найти правильный термин для этого …), вы можете не только увеличивать все пиксели, где есть точки, но и все пиксели по кругу вокруг точек.
Затем вы можете преобразовать карту в изображение в градациях серого или в цветное изображение с помощью applyColorMap
,