【opencv】示例-falsecolor.cpp 使用OpenCV函数动态地对图像应用不同的色彩映射

该代码是一个使用OpenCV库实现的C++程序,主要用来展示如何通过applyColorMap函数将色彩映射应用到一个灰度图像上,并提供一个滑动条来实时改变色彩映射的效果。此外,该程序还可以绘制包含不同形状的灰度图像,用作applyColorMap函数的输入。程序的总体流程为:

  1. 引入OpenCV库和标准I/O库。

  2. 声明使用命名空间cv和std。

  3. 定义形状类型枚举MyShape。

  4. 定义ParamColorMap结构体保存色彩映射参数。

  5. 定义一个色彩映射窗口名称和色彩映射名称数组。

  6. 实现TrackColorMap回调函数,用于响应色彩映射滑动条操作。

  7. 实现DrawMyImage函数,绘制灰度图像并在图像上绘制随机形状。

  8. main函数中读取或生成输入图像,创建窗口环境,并展示图像和色彩映射效果。

  9. 等待用户按键退出程序。

整个程序示范了如何使用OpenCV函数动态地对图像应用不同的色彩映射,并且通过用户界面交互,让用户可以选择和查看不同的色彩映射效果。

cpp 复制代码
#include "opencv2/imgproc.hpp" // 包含OpenCV图像处理库
#include "opencv2/imgcodecs.hpp" // 包含OpenCV图像编解码库
#include "opencv2/highgui.hpp" // 包含OpenCV高级用户界面库
#include <iostream> // 包含标准输入输出流库


// 使用命名空间 cv 和 std 来简化代码中的类型和成员函数的引用
using namespace cv;
using namespace std;


// 定义一个枚举类型 MyShape 表示形状类型
enum MyShape{MyCIRCLE=0,MyRECTANGLE,MyELLIPSE};


// 定义一个结构体 ParamColorMap 存储色彩映射的参数
struct ParamColorMap {
    int iColormap; // 当前色彩映射的编号
    Mat img; // 存储将要映射色彩的图像
};


// 定义一个窗口名称常量
String winName="False color";
// 定义一个色彩映射名称数组,包括各种色彩映射的名称
static const String ColorMaps[] = {
    "Autumn", "Bone", "Jet", "Winter", "Rainbow", "Ocean", "Summer", "Spring",
    "Cool", "HSV", "Pink", "Hot", "Parula", "Magma", "Inferno", "Plasma", "Viridis",
    "Cividis", "Twilight", "Twilight Shifted", "Turbo", "Deep Green", "User defined (random)"
};


// 定义TrackColorMap回调函数,当拖动条改变时调用此函数实现色彩映射的更新
static void TrackColorMap(int x, void *r)
{
    ParamColorMap *p = (ParamColorMap*)r; // 将传入的void指针转换为ParamColorMap结构体指针
    Mat dst; // 创建一个输出图像
    p->iColormap = x; // 设置当前色彩映射的编号
    
    // 判断是否为用户自定义色彩映射
    if (x == COLORMAP_DEEPGREEN + 1)
    {
        // 创建一个随机的查找表 LUT (Look Up Table)
        Mat lutRND(256, 1, CV_8UC3);
        // 使用随机值填充查找表
        randu(lutRND, Scalar(0, 0, 0), Scalar(255, 255, 255));
        // 应用用户自定义的随机色彩映射
        applyColorMap(p->img, dst, lutRND);
    }
    else
    {
        // 应用官方定义的色彩映射
        applyColorMap(p->img, dst, p->iColormap);
    }


    // 在输出图像上添加文字,显示当前的色彩映射名称
    putText(dst, "Colormap : "+ColorMaps[p->iColormap], Point(10, 20), FONT_HERSHEY_SIMPLEX, 0.8, Scalar(255, 255, 255), 2);
    // 在窗口中展示色彩映射后的图像
    imshow(winName, dst);
}


// 定义DrawMyImage函数,用于生成包含不同形状的灰度图像
static Mat DrawMyImage(int thickness, int nbShape)
{
    // 创建一个黑色背景的图像
    Mat img = Mat::zeros(500, 256*thickness + 100, CV_8UC1);
    // 定义线和形状的偏移量
    int offsetx = 50, offsety = 25;
    // 定义线的长度
    int lineLength = 50;


    // 绘制256个灰度梯度的线条
    for (int i=0; i<256; i++)
        line(img, Point(thickness * i + offsetx, offsety), Point(thickness * i + offsetx, offsety + lineLength), Scalar(i), thickness);
        
    // 创建随机数生成器对象 r
    RNG r;
    // 存储形状参数的变量
    Point center;
    int radius;
    int width, height;
    int angle;
    Rect rc;


    // 根据参数 nbShape 绘制随机数量和类型的形状
    for (int i=1; i<=nbShape; i++)
    {
        // 随机选择一个形状类型
        int typeShape = r.uniform(MyCIRCLE, MyELLIPSE + 1);
        switch (typeShape) {
        case MyCIRCLE:
            // 绘制一个圆形
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            radius = r.uniform(1, min(offsetx, offsety));
            circle(img, center, radius, Scalar(i), -1);
            break;
        case MyRECTANGLE:
            // 绘制一个矩形
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            width = r.uniform(1, min(offsetx, offsety));
            height = r.uniform(1, min(offsetx, offsety));
            rc = Rect(center - Point(width, height) / 2, center + Point(width, height) / 2);
            rectangle(img, rc, Scalar(i), -1);
            break;
        case MyELLIPSE:
            // 绘制一个椭圆
            center = Point(r.uniform(offsetx, img.cols - offsetx), r.uniform(offsety + lineLength, img.rows - offsety));
            width = r.uniform(1, min(offsetx, offsety));
            height = r.uniform(1, min(offsetx, offsety));
            angle = r.uniform(0, 180);
            ellipse(img, center, Size(width / 2, height / 2), angle, 0, 360, Scalar(i), -1);
            break;
        }
    }
    // 返回生成的图像
    return img;
}


// 程序的主入口
int main(int argc, char** argv)
{
    // 输出程序的简短描述
    cout << "This program demonstrates the use of applyColorMap function.\n\n";


    // 创建一个ParamColorMap结构体变量 p 来存储色彩映射的参数
    ParamColorMap  p;
    Mat img;


    // 判断命令行是否提供了输入文件路径
    if (argc > 1)
        // 如果提供了,则读取指定的图像文件
        img = imread(samples::findFile(argv[1]), IMREAD_GRAYSCALE);
    else
        // 如果没有提供,则生成一个图像
        img = DrawMyImage(2, 256);


    // 设置色彩映射的参数
    p.img = img;
    p.iColormap = 0;


    // 展示灰度图像
    imshow("Gray image", img);
    // 创建一个新窗口
    namedWindow(winName);
    // 在新窗口中创建一个滑动条,用于调节色彩映射
    createTrackbar("colormap", winName, NULL, COLORMAP_DEEPGREEN + 1, TrackColorMap, (void*)&p);
    // 设置滑动条的最小值
    setTrackbarMin("colormap", winName, COLORMAP_AUTUMN);
    // 设置滑动条的最大值
    setTrackbarMax("colormap", winName, COLORMAP_DEEPGREEN + 1);
    // 设置滑动条的当前位置
    setTrackbarPos("colormap", winName, COLORMAP_AUTUMN);


    // 初始调用TrackColorMap函数来展示色彩映射效果
    TrackColorMap(0, (void*)&p);


    // 打印提示信息,告知用户可以按任意键退出程序
    cout << "Press a key to exit" << endl;
    // 等待用户按键,然后关闭程序
    waitKey(0);
    return 0;
}
相关推荐
Kenneth風车1 分钟前
【机器学习(九)】分类和回归任务-多层感知机 (MLP) -Sentosa_DSML社区版
人工智能·算法·低代码·机器学习·分类·数据分析·回归
知来者逆4 分钟前
ChemChat——大语言模型与化学的未来,以及整合外部工具和聊天机器人的潜力
人工智能·gpt·语言模型·自然语言处理·机器人·llm·大语言模型
AI领航者5 分钟前
大型语言模型的结构性幻觉:不可避免的局限性
人工智能·语言模型·自然语言处理·llm·大语言模型·ai大模型·大模型幻觉
fydw_7155 分钟前
PyTorch 池化层详解
人工智能·深度学习
奥利给少年28 分钟前
深度学习——管理模型的参数
人工智能·深度学习
小羊在奋斗1 小时前
【C++】探秘二叉搜索树
c++·人工智能·神经网络·机器学习
m0_713344851 小时前
新能源汽车数据大全(产销数据\充电桩\专利等)
大数据·人工智能·新能源汽车
NewsMash1 小时前
平安养老险阜阳中心支公司开展金融教育宣传专项活动
人工智能·金融
白葵新1 小时前
PCL addLine可视化K近邻
c++·人工智能·算法·计算机视觉·3d
simple_whu2 小时前
相机畸变系数$b_1,b_2$与畸变系数aspect ratio和skew的互转
数码相机·计算机视觉·摄影测量