Построить тепловую карту / карту внимания на изображении из координат точек с помощью OpenCV

Я хотел бы построить тепловую карту из координат точек, перекрывающих изображение (в оттенках серого). У меня есть координаты x и y моих точек. Идея состоит в том, чтобы легко увидеть внимание / плотность, где сосредоточены точки (красная область, если есть важное количество точек).

Я думаю, что я могу использовать OpenCV для этого. Следующая функция звучит интересно: applyColorMap(src, result, cv::COLORMAP_JET);, Но я не знаю, как связать эту карту с точками, а не с изображением.

Кто-нибудь знает, как построить тепловую карту из координат точек, пожалуйста?

Благодаря коду @ berak и использованию COLORMAP_RAINBOW вместо COLORMAP_JET вот что я получаю:введите описание изображения здесь
Это близко к результату, который я хочу, за исключением того, что он кажется слишком «дискретным» и недостаточно «гладким» / «нечетким». Я не хочу, чтобы точки появлялись (особенно те, которые «одни»), я хочу, чтобы зона плотности четко отображалась как Вот.
Как некоторые из вас сказали, я думаю, что мне «просто» нужно изменить интенсивность пикселей вокруг моего ROI.

У кого-нибудь есть еще подсказки, пожалуйста?

0

Решение

вот моя идея — применить преобразование расстояния для визуализации плотности точек:

// 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();

от ponts до jetmap

2

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

Простым способом было бы использовать одноканальное изображение (в идеале с большим количеством BPP, чем обычные 8-битные изображения), инициализировать его нулем, а затем выполнить итерацию по всем точкам. Затем вы увеличиваете пиксель, соответствующий каждой точке, что приводит к высоким значениям, где падает много точек, и низким значениям, когда точки отсутствуют.

При желании, если вы хотите получить довольно «нечеткую» карту (трудно найти правильный термин для этого …), вы можете не только увеличивать все пиксели, где есть точки, но и все пиксели по кругу вокруг точек.

Затем вы можете преобразовать карту в изображение в градациях серого или в цветное изображение с помощью applyColorMap,

1

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