DrGraph原理示教 - OpenCV 4 功能 - 颜色变幻

2024-01-03 17:44

本文主要是介绍DrGraph原理示教 - OpenCV 4 功能 - 颜色变幻,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二值化是逐像素处理,而逐像素处理会有很多效果,这主要是给人眼看的,因为像素值的变化,直观的就是图像变化,比如颜色。

颜色变幻处理

OpenCV提供了一些图片,如下:
在这里插入图片描述
粗看是一些风格,细看一下,其实是各行颜色一致,看属性知道图像尺寸为256 * 30。
256是字节宽度,也是各通道取值范围。
所以,可以用查表法直接替代处理,即将上面一张图片作为输入,则各行就将原值的0-255映射成为图片相应列的值。图像尺寸设置为30,其实也无所谓多少行,至少一行就行,不过行数太少了,人看起来就感觉,行数多了,读到计算机内存里面处理也浪费。那就折衷选个30吧。
代码处理,这就看水平了,可以一次性全读入,也可以只读取需要的图片。

   QString colorMapPath = THelper::File::GetPath_Resource() + "colorMap/";QStringList fileNames;THelper::File::BrowseDir(fileNames, colorMapPath, "*.*");if (!COLORMAP_TABLE) {if(fileNames.count() > 0) {COLORMAP_TABLE = new cv::Vec3b[256 * fileNames.count()];BYTE * pDst = (BYTE*)COLORMAP_TABLE;foreach(QString fileName, fileNames) {cv::Mat mat = CvHelper::MatFromFile(fileName);if(mat.cols * mat.channels() == 256 * 3) {memcpy(pDst, mat.data, 256 * 3);pDst += 256 * 3;}}}}

最终的颜色变幻处理逻辑:

// 其它-颜色变幻int paramIndex = 0;FMapIndex = GetParamValue_Int(paramIndex++);    // 0: 变幻颜色Mat tempMat;cvtColor(dstMat, tempMat, COLOR_BGR2GRAY);dstMat = cv::Mat(tempMat.rows, tempMat.cols, CV_8UC3);cv::Vec3b * table = COLORMAP_TABLE + 256 * FMapIndex;BYTE * pTemp = tempMat.data;cv::Vec3b * pDst = (cv::Vec3b*)dstMat.data;for (int row = 0; row < tempMat.rows; ++row)for (int col = 0; col < tempMat.cols; ++col)* pDst++ = table[*pTemp++];

本质上还是逐像素处理,这里是查表法,核心逻辑就是* pDst++ = table[*pTemp++];
这个整明白后,那就可以自己设计一个图片作为查表输入,当然有一点点的美工基础更好。

API函数

OpenCV中,提供了一个applyColorMap函数,具体文档说明:

/** @brief Applies a GNU Octave/MATLAB equivalent colormap on a given image.@param src The source image, grayscale or colored of type CV_8UC1 or CV_8UC3.
@param dst The result is the colormapped source image. Note: Mat::create is called on dst.
@param colormap The colormap to apply, see #ColormapTypes
*/
CV_EXPORTS_W void applyColorMap(InputArray src, OutputArray dst, int colormap);

继续查看ColormapTypes定义,可知其系统提供了22种颜色风格。

//! GNU Octave/MATLAB equivalent colormaps
enum ColormapTypes
{COLORMAP_AUTUMN = 0, //!< ![autumn](pics/colormaps/colorscale_autumn.jpg)COLORMAP_BONE = 1, //!< ![bone](pics/colormaps/colorscale_bone.jpg)COLORMAP_JET = 2, //!< ![jet](pics/colormaps/colorscale_jet.jpg)COLORMAP_WINTER = 3, //!< ![winter](pics/colormaps/colorscale_winter.jpg)COLORMAP_RAINBOW = 4, //!< ![rainbow](pics/colormaps/colorscale_rainbow.jpg)COLORMAP_OCEAN = 5, //!< ![ocean](pics/colormaps/colorscale_ocean.jpg)COLORMAP_SUMMER = 6, //!< ![summer](pics/colormaps/colorscale_summer.jpg)COLORMAP_SPRING = 7, //!< ![spring](pics/colormaps/colorscale_spring.jpg)COLORMAP_COOL = 8, //!< ![cool](pics/colormaps/colorscale_cool.jpg)COLORMAP_HSV = 9, //!< ![HSV](pics/colormaps/colorscale_hsv.jpg)COLORMAP_PINK = 10, //!< ![pink](pics/colormaps/colorscale_pink.jpg)COLORMAP_HOT = 11, //!< ![hot](pics/colormaps/colorscale_hot.jpg)COLORMAP_PARULA = 12, //!< ![parula](pics/colormaps/colorscale_parula.jpg)COLORMAP_MAGMA = 13, //!< ![magma](pics/colormaps/colorscale_magma.jpg)COLORMAP_INFERNO = 14, //!< ![inferno](pics/colormaps/colorscale_inferno.jpg)COLORMAP_PLASMA = 15, //!< ![plasma](pics/colormaps/colorscale_plasma.jpg)COLORMAP_VIRIDIS = 16, //!< ![viridis](pics/colormaps/colorscale_viridis.jpg)COLORMAP_CIVIDIS = 17, //!< ![cividis](pics/colormaps/colorscale_cividis.jpg)COLORMAP_TWILIGHT = 18, //!< ![twilight](pics/colormaps/colorscale_twilight.jpg)COLORMAP_TWILIGHT_SHIFTED = 19, //!< ![twilight shifted](pics/colormaps/colorscale_twilight_shifted.jpg)COLORMAP_TURBO = 20, //!< ![turbo](pics/colormaps/colorscale_turbo.jpg)COLORMAP_DEEPGREEN = 21  //!< ![deepgreen](pics/colormaps/colorscale_deepgreen.jpg)
};

运行效果

OpenCV 4 功能 - 颜色变幻

不过,用applyColorMap的话,受到的制约就是只有这22种效果。也许OpenCV 5会更多一些。要想自由的话,还是直接查表处理,那里啥都有。

这篇关于DrGraph原理示教 - OpenCV 4 功能 - 颜色变幻的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/566544

相关文章

springboot+redis实现订单过期(超时取消)功能的方法详解

《springboot+redis实现订单过期(超时取消)功能的方法详解》在SpringBoot中使用Redis实现订单过期(超时取消)功能,有多种成熟方案,本文为大家整理了几个详细方法,文中的示例代... 目录一、Redis键过期回调方案(推荐)1. 配置Redis监听器2. 监听键过期事件3. Redi

Java线程池核心参数原理及使用指南

《Java线程池核心参数原理及使用指南》本文详细介绍了Java线程池的基本概念、核心类、核心参数、工作原理、常见类型以及最佳实践,通过理解每个参数的含义和工作原理,可以更好地配置线程池,提高系统性能,... 目录一、线程池概述1.1 什么是线程池1.2 线程池的优势二、线程池核心类三、ThreadPoolE

Qt实现对Word网页的读取功能

《Qt实现对Word网页的读取功能》文章介绍了几种在Qt中实现Word文档(.docx/.doc)读写功能的方法,包括基于QAxObject的COM接口调用、DOCX模板替换及跨平台解决方案,重点讨论... 目录1. 核心实现方式2. 基于QAxObject的COM接口调用(Windows专用)2.1 环境

Spring Boot Interceptor的原理、配置、顺序控制及与Filter的关键区别对比分析

《SpringBootInterceptor的原理、配置、顺序控制及与Filter的关键区别对比分析》本文主要介绍了SpringBoot中的拦截器(Interceptor)及其与过滤器(Filt... 目录前言一、核心功能二、拦截器的实现2.1 定义自定义拦截器2.2 注册拦截器三、多拦截器的执行顺序四、过

Java 队列Queue从原理到实战指南

《Java队列Queue从原理到实战指南》本文介绍了Java中队列(Queue)的底层实现、常见方法及其区别,通过LinkedList和ArrayDeque的实现,以及循环队列的概念,展示了如何高效... 目录一、队列的认识队列的底层与集合框架常见的队列方法插入元素方法对比(add和offer)移除元素方法

SpringBoot+Vue3整合SSE实现实时消息推送功能

《SpringBoot+Vue3整合SSE实现实时消息推送功能》在日常开发中,我们经常需要实现实时消息推送的功能,这篇文章将基于SpringBoot和Vue3来简单实现一个入门级的例子,下面小编就和大... 目录前言先大概介绍下SSE后端实现(SpringBoot)前端实现(vue3)1. 数据类型定义2.

SQL 注入攻击(SQL Injection)原理、利用方式与防御策略深度解析

《SQL注入攻击(SQLInjection)原理、利用方式与防御策略深度解析》本文将从SQL注入的基本原理、攻击方式、常见利用手法,到企业级防御方案进行全面讲解,以帮助开发者和安全人员更系统地理解... 目录一、前言二、SQL 注入攻击的基本概念三、SQL 注入常见类型分析1. 基于错误回显的注入(Erro

Spring IOC核心原理详解与运用实战教程

《SpringIOC核心原理详解与运用实战教程》本文详细解析了SpringIOC容器的核心原理,包括BeanFactory体系、依赖注入机制、循环依赖解决和三级缓存机制,同时,介绍了SpringBo... 目录1. Spring IOC核心原理深度解析1.1 BeanFactory体系与内部结构1.1.1

SpringBoot整合Apache Spark实现一个简单的数据分析功能

《SpringBoot整合ApacheSpark实现一个简单的数据分析功能》ApacheSpark是一个开源的大数据处理框架,它提供了丰富的功能和API,用于分布式数据处理、数据分析和机器学习等任务... 目录第一步、添加android依赖第二步、编写配置类第三步、编写控制类启动项目并测试总结ApacheS

Python实现繁体转简体功能的三种方案

《Python实现繁体转简体功能的三种方案》在中文信息处理中,繁体字与简体字的转换是一个常见需求,无论是处理港澳台地区的文本数据,还是开发面向不同中文用户群体的应用,繁简转换都是不可或缺的功能,本文将... 目录前言为什么需要繁简转换?python实现方案方案一:使用opencc库方案二:使用zhconv库