OpenCV 图像色彩空间转换

一、知识点:
1、色彩空间转换函数

(1)、void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0, AlgorithmHint hint = cv::ALGO_HINT_DEFAULT );

(2)、将图像从一种颜色空间转换为另一种。

(3)、参数说明:

src: 输入图像,即要进行颜色空间变换的原图像。

dst: 输出图像,即进行颜色空间变换后的图像。

code: ColorConversionCodes枚举值,确定从什么颜色空间转换到什么颜色空间,如: COLOR_BGR2RGB、 COLOR_BGRA2RGBA、COLOR_BGR2GRAY、COLOR_BGR2HSV。

dstCn: 指定目标图像的通道数,若为0,则通道数由src和code决定。

hint: 算法提示。

(4)、若有RGB颜色空间的转换,则必须指定通道顺序(RGB或BGR)。

(5)、OpenCV默认RGB颜色空间的通道顺序是BGR,例如标准24位彩色图像,第一个字节是蓝色分量,第二个字节是绿色分量,第三个字节是红色分量,第四、第五、第六依次是第二个像素的蓝、绿、红分量,以此类推。

(6)、R、G、B通道值的常规范围:

-CV_8U是0-255

-CV_16U是0-65535

-CV_32F是0-1

(7)、在非线性变换下,一个RGB颜色空间的输入图像,需先归一化到通道值范围,才能得到正确的转换结果。

(8)、例如,有一个CV_32F图像,直接从CV_8U图像转换而来,那么在调用cvtColor前,需先将0-255的值转换为0-1的值。

img *= 1.0 / 255;

cvtColor(img, img, COLOR_BGR2Luv);

(9)、如果转换添加了alpha通道,则其值将被设置为范围最大值: CV_8U是255,CV_16U为65535,CV_32F为1。

2、保存图像到文件

(1)、bool imwrite( const String & filename, InputArray img, const std::vector<int> & params = std::vector<int>());

(2)、将图像保存到指定文件。

(3)、参数说明:

filename: 图像要保存的文件路径名。

img: 要保存的图像。

params: 为特定格式保存的参数编码。

(4)、根据文件扩展名选择图像保存格式。

(5)、一般imwrite只保存CV_8U单通道或3通道(BGR通道顺序)图像。

但有特殊情况: 如对于PNG、TIFF、JPEG格式,可以保存CV_16U图像,还有很多情况见imwrite()接口注释。

不支持的图像格式,imwrite将图像转为CV_8U并以这种方式保存。

(6)、如果格式、深度、通道顺序不同,可以用convertTo和cvtColor在保存之前进行转换。

3、HSV颜色空间

(1)、H: 色相,即什么颜色,opencv中取值范围[0, 180]。

(2)、S: 饱和度,即颜色有多深,opencv中取值范围[0, 255]。

(3)、V: 色调、纯度、亮度,即颜色有多亮,opencv中取值范围[0, 255]。

二、示例代码:

cpp 复制代码
#include <iostream>
#include <opencv2/opencv.hpp>

int main()
{
    cv::Mat srcImg = cv::imread("C:\\Users\\ml\\Desktop\\Test\\MyOpenCVTest\\images\\1.png");
    if (srcImg.empty())
    {
        std::cout << "Could not load image..." << std::endl;
        return -1;
    }
    cv::imshow("原始图像", srcImg);

    cv::Mat grayImg;
    cv::cvtColor(srcImg, grayImg, cv::COLOR_BGR2GRAY);
    cv::imshow("gray图像", grayImg);
    cv::imwrite("C:\\Users\\ml\\Desktop\\Test\\MyOpenCVTest\\images\\1_gray.png", grayImg);

    cv::Mat hsvImg;
    cv::cvtColor(srcImg, hsvImg, cv::COLOR_BGR2HSV);
    cv::imshow("hsv图像", hsvImg);
    cv::imwrite("C:\\Users\\ml\\Desktop\\Test\\MyOpenCVTest\\images\\1_hsv.png", hsvImg);

    cv::waitKey(0);
    cv::destroyAllWindows();

    return 0;
}
相关推荐
小鸡吃米…5 小时前
机器学习 - K - 中心聚类
人工智能·机器学习·聚类
好奇龙猫6 小时前
【AI学习-comfyUI学习-第三十节-第三十一节-FLUX-SD放大工作流+FLUX图生图工作流-各个部分学习】
人工智能·学习
沈浩(种子思维作者)6 小时前
真的能精准医疗吗?癌症能提前发现吗?
人工智能·python·网络安全·健康医疗·量子计算
saoys6 小时前
Opencv 学习笔记:图像掩膜操作(精准提取指定区域像素)
笔记·opencv·学习
minhuan6 小时前
大模型应用:大模型越大越好?模型参数量与效果的边际效益分析.51
人工智能·大模型参数评估·边际效益分析·大模型参数选择
Cherry的跨界思维6 小时前
28、AI测试环境搭建与全栈工具实战:从本地到云平台的完整指南
java·人工智能·vue3·ai测试·ai全栈·测试全栈·ai测试全栈
MM_MS6 小时前
Halcon变量控制类型、数据类型转换、字符串格式化、元组操作
开发语言·人工智能·深度学习·算法·目标检测·计算机视觉·视觉检测
ASF1231415sd6 小时前
【基于YOLOv10n-CSP-PTB的大豆花朵检测与识别系统详解】
人工智能·yolo·目标跟踪
水如烟7 小时前
孤能子视角:“意识“的阶段性回顾,“感质“假说
人工智能
Carl_奕然7 小时前
【数据挖掘】数据挖掘必会技能之:A/B测试
人工智能·python·数据挖掘·数据分析