使用OpenCV从点坐标在图像上构建热图/注意图

时间:2014-04-24 10:06:18

标签: c++ opencv coordinates heatmap density-plot

我想从重叠图像的点坐标(灰度)构建热图。我有我的点的x和y坐标。这个想法是很容易看到注意力/密度,点集中(红色区域,如果有重要的点数)。

我想我可以使用OpenCV。以下功能听起来很有趣:applyColorMap(src, result, cv::COLORMAP_JET);。但我不知道如何将这张地图与点相关联,而不是与图像相关联。

有人知道如何从点坐标建立热图吗?

感谢@berak的代码并使用COLORMAP_RAINBOW代替COLORMAP_JET这是我获得的:enter image description here 这接近我想要的结果,它似乎也是'#34;离散的"而不是"顺利" /"模糊"足够。我不想要点出现(特别是那些单独的#34;),我希望密度区域清楚地显示为here。 正如你们中的一些人所说,我认为我只是"需要更改投资回报率周围的像素强度。

有人有更多线索吗?

2 个答案:

答案 0 :(得分:2)

这是我的想法, - 应用距离变换来可视化点密度:

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

from ponts to jetmap

答案 1 :(得分:1)

一种简单的方法是使用单通道图像(理想情况下,BPP比通常的8位图像更多),将其初始化为零,然后迭代所有点。然后,您将增加与每个点对应的像素,从而导致许多点下降的高值,以及没有点的低值。

可选地,如果你想要一个相当“模糊”的地图(很难找到一个正确的术语......),你不仅可以增加有点的所有像素,而且可以增加点周围的圆圈中的所有像素。

然后,您可以通过applyColorMap将地图转换为灰度图像或彩色图像。