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

news2025/2/24 21:23:30

3eb6297fb467050328586eebe33cebeb.png

2df397b04b4bc209992211cffae39096.gif

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

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

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

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

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

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

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

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

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

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

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

#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;
}

fcdc0b1e0365997e1b52d8bf9c2576b7.png

ea1d734e5394562103909fcbe69a023f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1585871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NX/UG二次开发—CAM—一些外挂刀路选择方案对比

在做一刀轨编辑工具时&#xff0c;大家希望实现类似NX刀轨编辑中选择刀路的功能&#xff0c;以下我罗列了几种目前外挂里使用的几种方式&#xff0c;自己也做了一些对比&#xff1a; 涉及一些运算时间&#xff0c;参考电脑配置(内存32G&#xff0c;CPUi9-12950HX) 1、刀路转成…

idea链接gitlab的token到期

报错 HTTP Request Request GET http://36.46.143.158:6060/api/v4/version failed wit

乡村振兴多元共治,共绘乡村新蓝图:政府引领、企业助力、村民参与

乡村振兴是一项复杂而艰巨的任务&#xff0c;需要从多个角度进行考虑。以下是从不同身份出发对乡村振兴建设的思考&#xff1a; 1、政府领导的角度&#xff1a; 政府是乡村振兴的主要推动者和组织者。在制定和实施乡村振兴战略时&#xff0c;政府需要注重规划引领&#xff0c;科…

PHP7垃圾回收算法

前提 本文为了梳理PHP GC工作流程&#xff0c;所以从引用计数、部分标记清除算法做引子&#xff0c;然后介绍PHP GC工作流程,最后介绍性能更高的GC算法 引用计数 概述 引用计数算法中引入了一个概念计数器。计数器代表对象被引用的次数 基本原理 为了记录一个对象有没有被…

微信公众号第三方平台-公众号扫码授权接入代运营

文章目录 接入目的效果展示技术积累如何成为服务商如何搭建第三方后端服务传统模式V云服务模式如何完成商家授权授权逻辑介绍 环境准备注册开发者平台-个人类型 传统模式后端代码接收公众号个人三方平台的票据根据票据获取三方平台访问令牌根据访问令牌获取预授权码通过预授权码…

如何本地搭建开源导航页配置服务Dashy并发布到公网分享好友使用

文章目录 简介1. 安装Dashy2. 安装cpolar3.配置公网访问地址4. 固定域名访问 正文开始前给大家推荐个网站&#xff0c;前些天发现了一个巨牛的 人工智能学习网站&#xff0c; 通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。[点击跳转到网站] 简介 Dashy 是…

嵌入式网线连接——笔记本电脑设置

一、需求 我们调试很多设备经常需要用到网线去调试&#xff0c;当然主流是USB&#xff0c;和网线。 二、笔记本电脑端设备 有网口的&#xff0c;非常方便&#xff0c;如果没有网口&#xff0c;则需要用到USB转网口 连接指示灯&#xff1a; 绿色&#xff1a;灯亮表示连接正常…

蓝桥杯(填空题)

十四届 B组 日期统计&#xff08;暴力枚举&#xff09; 数据 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 0 5 8 8 5 7 0 9 9 1 9 4 4 6 8 6 3 3 8 5 1 6 3 4 6 7 0 7 8 2 7 6 8 9 5 6 5 6 1 4 0 1 0 0 9 4 8 0 9 1 2 8 5 0 2 5 3…

一篇文章了解php7和php8新特性

PHP7新特性 ?? 运算符 php7以前用三目判断变量是否存在或是否为空 $a isset($_GET[a]) ? $_GET[a] : 1;php7新增null 合并运算符??快捷判断 $a $_GET[a] ?? 1;函数返回值类型声明 用:返回值类型的形式定义函数的返回值类型 <?phpdeclare(strict_types1); fun…

git配置多SSH

目的&#xff1a; 一台电脑可以让github、gitee等账号同时存在&#xff0c;让不同账号配置不同的密钥 第一步&#xff1a;创建不同平台的SSH公钥 执行命令&#xff1a; ssh-keygen -t rsa -C "对应仓库邮箱地址" -f ~/.ssh/id_rsa.github 如果执行上面的命令&…

Windows部署ChatGLM3步骤

一、环境要求 硬件 内存&#xff1a;> 16GB 显存: > 13GB&#xff08;4080 16GB&#xff09; 软件 python 版本推荐3.10 - 3.11 transformers 库版本推荐为 4.36.2 torch 推荐使用 2.0 及以上的版本&#xff0c;以获得最佳的推理性能 二、部署步骤 1、新建pytho…

Web服务器架构设计(学习笔记)

软件架构风格 质量属性与架构评估 Web架构综合考察 什么叫做架构风格&#xff1f;又有哪些架构风格&#xff1f;不同的架构风格的优劣如何? 有哪些层次的负载均衡实现&#xff1f;优劣如何&#xff1f; 有哪些层面的集群切片实现&#xff1f; 什么叫做小前端&#xff0c…

【收藏】工业物联网常用协议及使用场景

物联网通信协议 物联网通信协议在工业中至关重要。它们实现设备之间的实时数据传输与相互交互&#xff0c;提高了生产效率、降低成本、增强安全性。这些协议帮助监控设备运行状况、优化生产流程、预测维护需求&#xff0c;同时改善生产环境智能化。通过整合智能传感器与设备&am…

哪些工作不会被AI替代:人类能力地形图

这一轮AI&#xff0c;到底对人有多强的替代性&#xff1f;这一轮AI的可靠性&#xff0c;是之前任何一代所谓的人工智能都不能比的。 在国内&#xff0c;AI开始被用来筛选简历&#xff0c;而在国外&#xff0c;亚马逊正在用算法跟踪仓库工人的生产率&#xff0c;顺道还会给生产率…

【Vector-Map-路径规划(0)】卷首语

因为城市NOA 的开发过程中&#xff0c;十字路口这类场景非常不好处理&#xff0c;个人对路径规划没有什么基础&#xff0c;只知道深度优先&#xff0c;广度优先&#xff0c;A*&#xff0c;Dijkstra等算法&#xff0c;不知道在矢量地图中如何使用&#xff1f;因此花几天时间读几…

【Python】控制台进度条

在Python开发中&#xff0c;有时需要向用户展示一个任务的进度&#xff0c;以提供更好的交互体验。下面我将展示如何使用Python来创建一个简单的控制台进度条。 效果&#xff1a; 代码&#xff1a; import time import sys def print_progress_bar(completed, total, length…

如何使用Jellyfin+cpolar低成本部署私人影音平台并实现无公网IP远程访问

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及&#xff0c;各种各样的使用需求也被开发出来&…

Redis从入门到精通(十二)Redis实战(九)GEO查询附近商户、BitMap用户签到和统计、HLL的UV统计

↑↑↑请在文章开头处下载测试项目源代码↑↑↑ 文章目录 前言4.10 附近商户4.10.1 GEO介绍4.10.2 附近商户需求分析4.10.3 实现新增商户功能4.10.4 实现查询附近商户功能 4.11 用户签到4.11.1 用户签到需求分析4.11.2 BitMap介绍4.11.3 实现用户签到4.11.4 实现用户签到统计4.…

Vuforia AR篇(二)— 扫描指定图片播放视频

目录 一、 使用Vuforia SDK创建Vuforia账号下载Vuforia SDK包导入SDK到unity中 二、使用Vuforia扫描指定图片播放视频创建ARCamera创建 License创建ImageTarget生成识别数据库播放视频 三、 效果 一、 使用Vuforia SDK 创建Vuforia账号 Vuforia官网 登录官网创建一个账号&am…

【fiddler】弱网测试

目录 一、测试目的 二、步骤 2.1打开弱网模式 ​ 2.2设置网络参数 &#xff08;1&#xff09;打开Rules→Customize Rules&#xff1b; &#xff08;2&#xff09;找到下面框出的代码&#xff0c;在这里设置弱网参数值&#xff1b; &#xff08;3&#xff09;设置完成后&a…