首先介绍一下density map(密度图),密度图可以表示聚集密度的大小,本文的density map主要用于人群(物体)密度检测。
首先我们需要一张冷暖色色卡:(如下)(本文使用的时候就是如下图片的形态使用的)
//加载输入的数值density map
Mat dens = imread(path);
//如果是以GRAYSCALE加载的图片可以忽略这行代码
cvtColor(dens, dens, COLOR_BGR2GRAY);
//定义和数值density map大小相同的三通道图像(彩图)
Mat densitymap(dens.size(), CV_8UC3);
//取出数值density map的最大最小值
double max, min;
minMaxLoc(dens, &min, &max);
//得到色卡图片的宽高以便进行等比例映射
int color_h = card.rows;
int color_w = card.cols;
//做等比例映射
float ratio = color_h / float(max-min);
//遍历每个位置的像素进行映射
for (int row = 0; row < dens.rows; row++)
{
for (int col = 0; col < dens.cols; col++)
{
int value = dens.at<uchar>(row, col);
int x = color_w / 2; //列的位置取值固定在色卡的中间
int y = color_h-1 - ratio*(value-min); //因为我们的色卡冷色在最下面
densitymap.at<Vec3b>(row, col) = card.at<Vec3b>(y, x);
}
}
//保存生成的彩色密度图
imwrite("your save path", densitymap);
原图:
处理后的图片: