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

OpenCV颜色空间实战

  • 〇、Coding实战内容
  • 一、imread
    • [1.1 函数介绍](#1.1 函数介绍)
    • [1.2 Flags](#1.2 Flags)
    • [1.3 Code](#1.3 Code)
  • [二. 色彩空间](#二. 色彩空间)
    • [2.1 获取单色空间](#2.1 获取单色空间)
    • [2.2. HSV、YUV、RGB](#2.2. HSV、YUV、RGB)
    • [2.3. 不同颜色空间应用场景](#2.3. 不同颜色空间应用场景)

〇、Coding实战内容

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

一、imread

1.1 函数介绍

java 复制代码
/**
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 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.
//      };

常用的有三种

a. -1 IMREAD_UNCHANGED:忽视alpha通道

b. 0 IMREAD_GRAYSCALE:灰度图

c. 1 IMREAD_COLOR 不填默认值,且格式为BGR

1.3 Code

assign_2.cpp

java 复制代码
#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;
}

输出结果:

二. 色彩空间

2.1 获取单色空间

java 复制代码
#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);
}

输出结果

2.2. HSV、YUV、RGB

java 复制代码
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;
}

输出结果

复制代码
颜色空间:
具体可搜索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

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

  1. RGB:视频监视器,彩色摄像机
  2. HSV [色调、饱和度、亮度]:彩色处理为目的
  3. CMYK :印刷行业,如果用过小米照片打印机,就会发现一张照片需要渲染4次,按照如下流程
    • Cyan:蓝青色;
    • magenta:品红、杨红;
    • Yellow:黄色;
    • Key: (black)
  4. YUV :电视信号传输,占用极少的带宽
相关推荐
郄堃Deep Traffic几秒前
机器学习+城市规划第十四期:利用半参数地理加权回归来实现区域带宽不同的规划任务
人工智能·机器学习·回归·城市规划
GIS小天1 小时前
AI+预测3D新模型百十个定位预测+胆码预测+去和尾2025年6月7日第101弹
人工智能·算法·机器学习·彩票
阿部多瑞 ABU1 小时前
主流大语言模型安全性测试(三):阿拉伯语越狱提示词下的表现与分析
人工智能·安全·ai·语言模型·安全性测试
cnbestec1 小时前
Xela矩阵三轴触觉传感器的工作原理解析与应用场景
人工智能·线性代数·触觉传感器
不爱写代码的玉子1 小时前
HALCON透视矩阵
人工智能·深度学习·线性代数·算法·计算机视觉·矩阵·c#
sbc-study1 小时前
PCDF (Progressive Continuous Discrimination Filter)模块构建
人工智能·深度学习·计算机视觉
EasonZzzzzzz2 小时前
计算机视觉——相机标定
人工智能·数码相机·计算机视觉
猿小猴子2 小时前
主流 AI IDE 之一的 Cursor 介绍
ide·人工智能·cursor
要努力啊啊啊2 小时前
Reranker + BM25 + FAISS 构建高效的多阶段知识库检索系统一
人工智能·语言模型·自然语言处理·faiss
EasyDSS2 小时前
国标GB28181设备管理软件EasyGBS远程视频监控方案助力高效安全运营
网络·人工智能