1. 简述
我们在开发基于热成像(红外)或者做深度估计应用时,为了便于直观的观察,常常将检测结果进行色彩上的映射,这样便可以很直观的看出哪里温度高,哪里温度低,或者哪里深度更深或更浅。
我们将一些标量值赋予特定的颜色的做法,称作色彩映射,更通俗的,我们称之为伪彩。
2. OpenCV伪彩函数
OpenCV提供了一个方便我们做伪彩的函数接口。
void applyColorMap(InputArray src, OutputArray dst, int colormap);
其中,
src:CV_8UC1或CV_8UC3类型的原图像,灰度图或彩色图;
dst:映射后的图像;
colormap:色彩映射图种类;
3. 举例
此处以深度估计举例,我们在使用DepthAnything算法执行推理时,网络输出是一个浮点数类型的Tensor,其值在一定程度上代表了深度程度。
/** 推理. */
output_data = this->predict(input_data);
cv::Mat output_tensor(output_data);
output_tensor =output_tensor.reshape(1, {input_width, input_height});
double minVal, maxVal;
cv::minMaxLoc(output_tensor, &minVal, &maxVal);
output_tensor.convertTo(output_tensor, CV_32F);
if (minVal != maxVal) {
output_tensor = (output_tensor - minVal) / (maxVal - minVal);
}
output_tensor *= 255.0;
output_tensor.convertTo(output_tensor, CV_8UC1);
cv::applyColorMap(output_tensor, output_tensor, cv::COLORMAP_HOT);
return output_tensor;
推理直接输出的output_data是一个连续存储的float序列,我们经过reshape进行转换,得到了一个shape(1, input_height, input_width)的图像,之后经过minMaxLoc获得最大值和最小值。
通过与255.0相乘,获得一个介于0和255之间的图像,这一步已经获得一个灰度图了。
接下来,我们将灰度图导入到applyColorMap中,获得伪彩图像。
前面讲到,colormap有多种不同的伪彩形式,如下列举简单几个作为参考。
COLORMAP_AUTUMN,
COLORMAP_BONE,
COLORMAP_JET,
COLORMAP_WINTER,
COLORMAP_RAINBOW,
COLORMAP_OCEAN,
COLORMAP_SUMMER,
COLORMAP_SPRING,
COLORMAP_COOL,
COLORMAP_HSV,
COLORMAP_PINK,
COLORMAP_HOT,
COLORMAP_PARULA,
COLORMAP_MAGMA,
COLORMAP_INFERNO,
COLORMAP_PLASMA,
COLORMAP_VIRIDIS,
COLORMAP_CIVIDIS,
COLORMAP_TWILIGHT,
COLORMAP_TWILIGHT_SHIFTED