OpenCV颜色空间实战
- 〇、Coding实战内容
- 一、imread
- 1.1 函数介绍
- 1.2 Flags
- 1.3 Code
- 二. 色彩空间
- 2.1 获取单色空间
- 2.2. HSV、YUV、RGB
- 2.3. 不同颜色空间应用场景
〇、Coding实战内容
- OpenCV imread()方法不同的flags差异性
- 获取单色通道【R通道、G通道、B通道】
- 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 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
#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 获取单色空间
#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
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. 不同颜色空间应用场景
- RGB:视频监视器,彩色摄像机
- HSV [色调、饱和度、亮度]:彩色处理为目的
- CMYK :印刷行业,如果用过小米照片打印机,就会发现一张照片需要渲染4次,按照如下流程
- Cyan:蓝青色;
- magenta:品红、杨红;
- Yellow:黄色;
- Key: (black)
- YUV :电视信号传输,占用极少的带宽