代码
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
Mat img = imread("lena.png");
if(img.empty())
{
cout <<"please confirm the name of pic is right!" <<endl;
return -1;
}
Mat HSV;
cvtColor(img, HSV, COLOR_RGB2HSV);
Mat imgs0, imgs1, imgs2;
Mat imgv0, imgv1, imgv2;
Mat result0, result1, result2;
Mat imgs[3];
split(img, imgs);
imgs0 = imgs[0];
imgs1 = imgs[1];
imgs2 = imgs[2];
imshow("RGB-B", imgs0);
imshow("RGB-G", imgs1);
imshow("RGB-R", imgs2);
Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
imgs[0] = zero;
imgs[2] = zero;
merge(imgs, 3, result1);
imshow("result1", result1);
vector<Mat>imgv;
split(HSV, imgv);
imgv0=imgv.at(0);
imgv1=imgv.at(1);
imgv2=imgv.at(2);
imshow("HSV-H", imgv0);
imshow("HSV-S", imgv1);
imshow("HSV-V", imgv2);
waitKey(0);
return 0;
}
编译:
g++ splitmerge.cpp `pkg-config --cflags --libs opencv`
运行结果:
再来看一下YUV色彩空间
#include <opencv2/opencv.hpp>
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char **argv)
{
Mat img = imread("lena.png");
if(img.empty())
{
cout <<"please confirm the name of pic is right!" <<endl;
return -1;
}
Mat YUV;
cvtColor(img, YUV, COLOR_RGB2YUV);
Mat imgs0, imgs1, imgs2;
Mat imgv0, imgv1, imgv2;
Mat result0, result1, result2;
Mat imgs[3];
split(img, imgs);
imgs0 = imgs[0];
imgs1 = imgs[1];
imgs2 = imgs[2];
imshow("RGB-B", imgs0);
imshow("RGB-G", imgs1);
imshow("RGB-R", imgs2);
Mat zero = cv::Mat::zeros(img.rows, img.cols, CV_8UC1);
imgs[0] = zero;
imgs[2] = zero;
merge(imgs, 3, result1);
imshow("result1", result1);
vector<Mat>imgv;
split(YUV, imgv);
imgv0=imgv.at(0);
imgv1=imgv.at(1);
imgv2=imgv.at(2);
imshow("YUV-Y", imgv0);
imshow("YUV-U", imgv1);
imshow("YUV-V", imgv2);
waitKey(0);
return 0;
}
运行:
注意: OPENCV存储图像默认的通道序是BGR而非RGB。