OpenCV杂记(4):OpenCV之色彩映射(伪彩applyColorMap)

发布于:2024-07-08 ⋅ 阅读:(44) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到