OpenCV颜色空间转换(1)颜色空间转换函数cvtColor()的使用

2024-09-03 13:12

本文主要是介绍OpenCV颜色空间转换(1)颜色空间转换函数cvtColor()的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 操作系统:ubuntu22.04
  • OpenCV版本:OpenCV4.9
  • IDE:Visual Studio Code
  • 编程语言:C++11

算法描述

将图像从一个颜色空间转换到另一个颜色空间。

此函数将输入图像从一个颜色空间转换到另一个颜色空间。在进行 RGB 颜色空间之间的转换时,应显式指定通道的顺序(RGB 或 BGR)。请注意,在 OpenCV 中,默认的颜色格式通常称为 RGB,但实际上它是 BGR(字节顺序相反)。因此,在标准(24 位)彩色图像中,第一个字节将是 8 位的蓝色组件,第二个字节将是绿色,第三个字节将是红色。第四、第五和第六个字节将是第二个像素(首先是蓝色,然后是绿色,最后是红色),依此类推。

R、G 和 B 通道值的传统范围是:

  • 0 到 255 对于 CV_8U 图像
  • 0 到 65535 对于 CV_16U 图像
  • 0 到 1 对于 CV_32F 图像

在线性变换的情况下,范围无关紧要。但在非线性变换的情况下,输入的 RGB 图像应被归一化到适当的值范围以获得正确的结果,例如,在进行 RGB → Luv* 转换时。例如,如果您有一个直接从 8 位图像转换而来的 32 位浮点图像,并且没有任何缩放,则其值范围将是 0…255 而不是函数假定的 0…1。因此,在调用 cvtColor 之前,您需要先将图像缩小:

img *= 1./255;
cvtColor(img, img, COLOR_BGR2Luv);

如果您使用 cvtColor 函数处理 8 位图像,转换过程中会损失一些信息。对于许多应用而言,这种损失可能不会被注意到,但在需要全色彩范围的应用中或在执行某个操作前后需要转换图像的应用中,建议使用 32 位图像。

如果转换增加了 alpha 通道,其值将被设置为对应通道范围的最大值:对于 CV_8U 为 255,对于 CV_16U 为 65535,对于 CV_32F 为 1。

函数原型


void cv::cvtColor	
(InputArray 	src,OutputArray 	dst,int 	code,int 	dstCn = 0 
)	

参数

  • 参数src i输入图像:8 位无符号、16 位无符号(CV_16UC…)或单精度浮点。
  • 参数dst 输出图像,大小和深度与 src 相同。
  • 参数code 颜色空间转换代码(参见 ColorConversionCodes)。
  • 参数dstCn 目标图像中的通道数。如果该参数为 0,则通道数会根据 src 和 code 自动推断。

代码示例

#include <opencv2/opencv.hpp>
#include <iostream>int main(int argc, char** argv)
{// 加载一个图像文件,如果未提供,则使用默认的图像cv::Mat image = cv::imread("/media/dingxin/data/study/OpenCV/sources/images/qiu.jpg");if (image.empty()){std::cerr << "Error: Image cannot be loaded!" << std::endl;return -1;}// 创建一个窗口来显示原始图像cv::namedWindow("Original Image", cv::WINDOW_AUTOSIZE);cv::imshow("Original Image", image);// 将图像从 BGR 转换为灰度cv::Mat grayImage;cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);// 创建一个窗口来显示灰度图像cv::namedWindow("Grayscale Image", cv::WINDOW_AUTOSIZE);cv::imshow("Grayscale Image", grayImage);// 等待用户按键后退出cv::waitKey(0);return 0;
}

运行结果

在这里插入图片描述

这篇关于OpenCV颜色空间转换(1)颜色空间转换函数cvtColor()的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

《MySQLInnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据》mysql的ibdata文件被误删、被恶意修改,没有从库和备份数据的情况下的数据恢复,不能保证数据库所有表数据... 参考:mysql Innodb表空间卸载、迁移、装载的使用方法注意!此方法只适用于innodb_fi

Python中conda虚拟环境创建及使用小结

《Python中conda虚拟环境创建及使用小结》本文主要介绍了Python中conda虚拟环境创建及使用小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们... 目录0.前言1.Miniconda安装2.conda本地基本操作3.创建conda虚拟环境4.激活c

Spring中@Lazy注解的使用技巧与实例解析

《Spring中@Lazy注解的使用技巧与实例解析》@Lazy注解在Spring框架中用于延迟Bean的初始化,优化应用启动性能,它不仅适用于@Bean和@Component,还可以用于注入点,通过将... 目录一、@Lazy注解的作用(一)延迟Bean的初始化(二)与@Autowired结合使用二、实例解

SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)

《SpringBoot使用Jasypt对YML文件配置内容加密的方法(数据库密码加密)》本文介绍了如何在SpringBoot项目中使用Jasypt对application.yml文件中的敏感信息(如数... 目录SpringBoot使用Jasypt对YML文件配置内容进行加密(例:数据库密码加密)前言一、J

Spring Boot 中正确地在异步线程中使用 HttpServletRequest的方法

《SpringBoot中正确地在异步线程中使用HttpServletRequest的方法》文章讨论了在SpringBoot中如何在异步线程中正确使用HttpServletRequest的问题,... 目录前言一、问题的来源:为什么异步线程中无法访问 HttpServletRequest?1. 请求上下文与线

golang panic 函数用法示例详解

《golangpanic函数用法示例详解》在Go语言中,panic用于触发不可恢复的错误,终止函数执行并逐层向上触发defer,最终若未被recover捕获,程序会崩溃,recover用于在def... 目录1. panic 的作用2. 基本用法3. recover 的使用规则4. 错误处理建议5. 常见错

在 Spring Boot 中使用异步线程时的 HttpServletRequest 复用问题记录

《在SpringBoot中使用异步线程时的HttpServletRequest复用问题记录》文章讨论了在SpringBoot中使用异步线程时,由于HttpServletRequest复用导致... 目录一、问题描述:异步线程操作导致请求复用时 Cookie 解析失败1. 场景背景2. 问题根源二、问题详细分

从零教你安装pytorch并在pycharm中使用

《从零教你安装pytorch并在pycharm中使用》本文详细介绍了如何使用Anaconda包管理工具创建虚拟环境,并安装CUDA加速平台和PyTorch库,同时在PyCharm中配置和使用PyTor... 目录背景介绍安装Anaconda安装CUDA安装pytorch报错解决——fbgemm.dll连接p

Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)

《Vue项目的甘特图组件之dhtmlx-gantt使用教程和实现效果展示(推荐)》文章介绍了如何使用dhtmlx-gantt组件来实现公司的甘特图需求,并提供了一个简单的Vue组件示例,文章还分享了一... 目录一、首先 npm 安装插件二、创建一个vue组件三、业务页面内 引用自定义组件:四、dhtmlx

使用Python创建一个能够筛选文件的PDF合并工具

《使用Python创建一个能够筛选文件的PDF合并工具》这篇文章主要为大家详细介绍了如何使用Python创建一个能够筛选文件的PDF合并工具,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录背景主要功能全部代码代码解析1. 初始化 wx.Frame 窗口2. 创建工具栏3. 创建布局和界面控件4