C++ OpenCV #005 色彩空间转换

常用的色彩空间有RGB,HSV,Lab,Lch等,这些色彩空间常用于不同的场景


1. 常用色彩空间

  • RGB:R红 / G绿 / B蓝 取值范围都为[0,255],一张真彩色图片为3个通道的叠加

  • HSV:H为色调,取值范围[0,360];S为饱和度,取值范围[0,1],V为明度,取值范围[0,1];主要应用与色彩分析,排除亮度的干扰

  • Lab:L代表亮度,取值范围[0,100],a代表从绿色到红色的分量,b代表从蓝色到黄色的分量

    a值为负数时,绝对值越大越趋近绿色;为正数时,值越大越趋近红色

    b值为负数时,绝对值越大越趋近蓝色;为正数时,值越大越趋近黄色



2. 颜色空间转换

  • 函数原型:cvtColor(InputArray src, OutputArray dst, int code, int dstCn = 0);

    InputArray src:输入矩阵

    OutputArray dst:输出矩阵

    int code:颜色空间转换的标识符

    int dstCn = 0:目标图像的通道数,若该参数是0,表示目标图像取源图像的通道数。

  • cvtColor( )支持多种颜色空间之间的转换,其支持的转换类型和转换码如下:

    1、RGB和BGR(opencv默认的彩色图像的颜色空间是BGR)颜色空间的转换
    cv::COLOR_BGR2RGB
    cv::COLOR_RGB2BGR
    cv::COLOR_RGBA2BGRA
    cv::COLOR_BGRA2RGBA
    
    2、向RGB和BGR图像中增添alpha通道
    cv::COLOR_RGB2RGBA
    cv::COLOR_BGR2BGRA
    
    3、从RGB和BGR图像中去除alpha通道
    cv::COLOR_RGBA2RGB
    cv::COLOR_BGRA2BGR
    
    4、从RBG和BGR颜色空间转换到灰度空间
    cv::COLOR_RGB2GRAY
    cv::COLOR_BGR2GRAY
    cv::COLOR_RGBA2GRAY
    cv::COLOR_BGRA2GRAY
    
    5、从灰度空间转换到RGB和BGR颜色空间
    cv::COLOR_GRAY2RGB
    cv::COLOR_GRAY2BGR
    cv::COLOR_GRAY2RGBA
    cv::COLOR_GRAY2BGRA
    
    6、RGB和BGR颜色空间与BGR565颜色空间之间的转换
    cv::COLOR_RGB2BGR565
    cv::COLOR_BGR2BGR565
    cv::COLOR_BGR5652RGB
    cv::COLOR_BGR5652BGR
    cv::COLOR_RGBA2BGR565
    cv::COLOR_BGRA2BGR565
    cv::COLOR_BGR5652RGBA
    cv::COLOR_BGR5652BGRA
    
    7、灰度空间域BGR565之间的转换
    cv::COLOR_GRAY2BGR555
    cv::COLOR_BGR5552GRAY
    
    8、RGB和BGR颜色空间与CIE XYZ之间的转换
    cv::COLOR_RGB2XYZ
    cv::COLOR_BGR2XYZ
    cv::COLOR_XYZ2RGB
    cv::COLOR_XYZ2BGR
    
    9、RGB和BGR颜色空间与uma色度(YCrCb空间)之间的转换
    cv::COLOR_RGB2YCrCb
    cv::COLOR_BGR2YCrCb
    cv::COLOR_YCrCb2RGB
    cv::COLOR_YCrCb2BGR
    
    10、RGB和BGR颜色空间与HSV颜色空间之间的相互转换
    cv::COLOR_RGB2HSV
    cv::COLOR_BGR2HSV
    cv::COLOR_HSV2RGB
    cv::COLOR_HSV2BGR
    
    11、RGB和BGR颜色空间与HLS颜色空间之间的相互转换
    cv::COLOR_RGB2HLS
    cv::COLOR_BGR2HLS
    cv::COLOR_HLS2RGB
    cv::COLOR_HLS2BGR
    
    12、RGB和BGR颜色空间与CIE Lab颜色空间之间的相互转换
    cv::COLOR_RGB2Lab
    cv::COLOR_BGR2Lab
    cv::COLOR_Lab2RGB
    cv::COLOR_Lab2BGR
    
    13、RGB和BGR颜色空间与CIE Luv颜色空间之间的相互转换
    cv::COLOR_RGB2Luv
    cv::COLOR_BGR2Luv
    cv::COLOR_Luv2RGB
    cv::COLOR_Luv2BGR
    
    14、Bayer格式(raw data)向RGB或BGR颜色空间的转换
    cv::COLOR_BayerBG2RGB
    cv::COLOR_BayerGB2RGB
    cv::COLOR_BayerRG2RGB
    cv::COLOR_BayerGR2RGB
    cv::COLOR_BayerBG2BGR
    cv::COLOR_BayerGB2BGR
    cv::COLOR_BayerRG2BGR
    cv::COLOR_BayerGR2BGR
    
  • 示例:

    #include<opencv2/opencv.hpp>	
    #include<opencv2/core/utils/logger.hpp>
    #include<iostream>
    #include<string>
    
    using namespace std;
    using namespace cv;
    
    // 关闭日志
    void close_log() {
    	utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
    }
    
    void image_process() {
    	// 创建矩阵
    	Mat bgr, hsv, gray;
    	// 文件名,路径,后缀写错,会报错:error: abort() has been called
    	const string image_name = "F:/test/1.png";
    
    	// opencv读取的图像顺序是 B,G,R
    	bgr = imread(image_name);
    
    	// 分别 BGR 转 HSV 和 GRAY
    	cvtColor(bgr, hsv, COLOR_BGR2HSV);
    	cvtColor(bgr, gray, COLOR_BGR2GRAY);
          
            // 创建窗口显示图片
    	namedWindow("BGR", WINDOW_AUTOSIZE);
    	namedWindow("HSV", WINDOW_AUTOSIZE);
    	namedWindow("GRAY", WINDOW_AUTOSIZE);
    	imshow("BGR", bgr);
    	imshow("HSV", hsv);
    	imshow("GRAY", gray);
    
    	// 保存图像
    	imwrite("F:/test/1_hsv.png", hsv);
    	imwrite("F:/test/1_gray.png", gray);
    
    	waitKey(0);
    	destroyAllWindows();
    }
    
    int main() {
    	close_log();
    	image_process();
    	return 0;
    }
    
  • 运行结果:



3. 颜色表

  • 函数原型:applyColorMap(InputArray src, OutputArray dst, int colormap)

    src: 源图像

    dst: 结果图像。

    colormap:提供的色彩图代码值。(参见:ColormapTypes 枚举数据类型)

  • ColormapTypes 枚举数据类型:

    enum ColormapTypes
    {
        COLORMAP_AUTUMN = 0, 
        COLORMAP_BONE = 1, 
        COLORMAP_JET = 2, 
        COLORMAP_WINTER = 3, 
        COLORMAP_RAINBOW = 4, 
        COLORMAP_OCEAN = 5, 
        COLORMAP_SUMMER = 6, 
        COLORMAP_SPRING = 7, 
        COLORMAP_COOL = 8, 
        COLORMAP_HSV = 9, 
        COLORMAP_PINK = 10, 
        COLORMAP_HOT = 11,
        COLORMAP_PARULA = 12, 
        COLORMAP_MAGMA = 13, 
        COLORMAP_INFERNO = 14,
        COLORMAP_PLASMA = 15,
        COLORMAP_VIRIDIS = 16, 
        COLORMAP_CIVIDIS = 17, 
        COLORMAP_TWILIGHT_SHIFTED = 19 
    };
    

  • 示例:

    #include <opencv2/opencv.hpp>
    #include <opencv2/core/utils/logger.hpp>
    #include<iostream>
    using namespace cv;
    
    
    void close_log() {
        utils::logging::setLogLevel(utils::logging::LOG_LEVEL_ERROR);
    }
    
    void image_process() {
        Mat img = imread("F:\\test\\1.png", 1);
        Mat target; 
    
        applyColorMap(img, target, COLORMAP_HSV);
    
        imshow("原图", img);
        imshow("结果图", target);
        waitKey();
        destroyAllWindows();
    }
    
    int main() {
        close_log();
        image_process();
    
        return 0;
    }
    
  • 运行结果:

posted @ 2023-06-28 23:06  枫_Null  阅读(885)  评论(0)    收藏  举报