• 【OpenCV实战】3.OpenCV颜色空间实战


    〇、Coding实战内容

    1. OpenCV imread()方法不同的flags差异性
    2. 获取单色通道【R通道、G通道、B通道】
    3. HSV、YUV、RGB

    一、imread

    1.1 函数介绍

    /**
    The function imread loads an image from the specified file and returns it
    @param filename Name of file to be loaded.
    @param flags Flag that can take values of cv::ImreadModes
    **/
    CV_EXPORTS_W Mat imread( const String& filename, int flags = IMREAD_COLOR );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    1.2 Flags

    // enum ImreadModes {
    //        IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.
    //        IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image (codec internal conversion).
    //        IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.
    //        IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.
    //        IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.
    //        IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.
    //        IMREAD_REDUCED_GRAYSCALE_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.
    //        IMREAD_REDUCED_COLOR_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.
    //        IMREAD_REDUCED_GRAYSCALE_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.
    //        IMREAD_REDUCED_COLOR_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.
    //        IMREAD_REDUCED_GRAYSCALE_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.
    //        IMREAD_REDUCED_COLOR_8      = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.
    //        IMREAD_IGNORE_ORIENTATION   = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.
    //      };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    常用的有三种
    a. -1 IMREAD_UNCHANGED:忽视alpha通道
    b. 0 IMREAD_GRAYSCALE:灰度图
    c. 1 IMREAD_COLOR 不填默认值,且格式为BGR

    1.3 Code

    assign_2.cpp

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <vector>
    #include <string>
    
    using namespace cv;
    using namespace std;
    
    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace cv;
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        std::string filePath = std::string(__FILE__);
        size_t pos = filePath.find_last_of("/\\");
        std::string rootPath = filePath.substr(0, pos); // string path = string(__BASE_FILE__)+"/img.webp";
        cout << rootPath;
        
        //IMREAD_COLOR BGR
        Mat image = imread(rootPath+"/img.webp",IMREAD_COLOR);
        //IMREAD_UNCHANGED, 无alpha通道
        Mat image1 = imread(rootPath+"/img.webp",IMREAD_UNCHANGED);
        //IMREAD_GRAYSCALE 灰度图
        Mat image2 = imread(rootPath+"/img.webp",IMREAD_GRAYSCALE);
      
     	namedWindow("imread imread_unchanged");    // 创建一个标题为 "hello" 的窗口
        imshow("hello", image); // image1, image2 //在窗口 "hello" 中显示图片
        waitKey(0);              // 等待用户按下键盘
        destroyWindow("hello");  // 销毁窗口 "hello"
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    输出结果:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    二. 色彩空间

    2.1 获取单色空间

    #include <opencv2/opencv.hpp>
    #include <iostream>
    #include <vector>
    #include <string>
    using namespace cv;
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        /**
         * 二、色彩空间
         * */
        //红色
        vector<Mat> channels;
        split(image, channels);//bgr
        channels[0] = Mat::zeros(image.rows, image.cols, CV_8UC1); // blue
        channels[1] = Mat::zeros(image.rows, image.cols, CV_8UC1); // green
        Mat red;
        merge(channels, red);
    	
    	//蓝色
    	vector<Mat> channels_1;
    	split(image, channels_1);//bgr
        channels[1] = Mat::zeros(image.rows, image.cols, CV_8UC1); // green
        channels[2] = Mat::zeros(image.rows, image.cols, CV_8UC1); // red
        Mat blue;
        merge(channels, blue);
        
    	//绿色
    	vector<Mat> channels_2;
    	split(image, channels_2);//bgr
        channels[0] = Mat::zeros(image.rows, image.cols, CV_8UC1); // green
        channels[2] = Mat::zeros(image.rows, image.cols, CV_8UC1); // red
        Mat green;
        merge(channels, green);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    输出结果
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    2.2. HSV、YUV、RGB

    int main(int argc, char *argv[])
    {
        std::string filePath = std::string(__FILE__);
        size_t pos = filePath.find_last_of("/\\");
        std::string rootPath = filePath.substr(0, pos); // string path = string(__BASE_FILE__)+"/img.webp";
        cout << rootPath;
        Mat image = imread(rootPath+"/img.webp",IMREAD_COLOR);
        
        /**
         * 三、色彩空间
         **/
        Mat hsv;
        cvtColor(image,hsv,COLOR_BGR2HSV);
    
        Mat rgb;
        cvtColor(image,hsv,COLOR_BGR2RGB);
        
        Mat yuv;
        cvtColor(image,yuv,COLOR_BGR2YUV);
        
        namedWindow("hsv");    
        imshow("hsv", hsv); 
        waitKey(0);            
        destroyWindow("hsv"); 
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    输出结果
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

    颜色空间:
    具体可搜索wikipedia,有很详细的介绍
    1. HSV vs HSB:https://en.wikipedia.org/wiki/HSL_and_HSV
    2. YUV:可参考本人以前的一篇文章,https://blog.csdn.net/Scott_S/article/details/118525159?spm=1001.2014.3001.5501
    
    • 1
    • 2
    • 3
    • 4

    2.3. 不同颜色空间应用场景

    1. RGB:视频监视器,彩色摄像机
    2. HSV [色调、饱和度、亮度]:彩色处理为目的
    3. CMYK :印刷行业,如果用过小米照片打印机,就会发现一张照片需要渲染4次,按照如下流程
      • Cyan:蓝青色;
      • magenta:品红、杨红;
      • Yellow:黄色;
      • Key: (black)
    4. YUV :电视信号传输,占用极少的带宽
  • 相关阅读:
    C语言 递归函数
    【笔记】《C++性能优化指南》Ch3 测量性能
    AndroidStudio 2024-2-21 Win10/11最新安装配置(Kotlin快速构建配置,gradle镜像源)
    Vue.js+Node.js全栈开发教程:Vue.js数据冻结
    【接口测试】微信小程序接口自动化的实现方案
    VMware Horizon 8.x支持winodws10 版本
    Oracle基础学习
    ​寒武纪思元370系列与飞桨完成II级兼容性测试,联合赋能AI落地实践
    c++ 中 拷贝构造函数 和 operator= 函数 的使用区别
    AddressSanitizer(ASan)
  • 原文地址:https://blog.csdn.net/Scott_S/article/details/132524479