通道的分割与合并,用到的是cvSplit(split)与cvMerge(merge),它可以把多通道分割成单通道,并且也可以把单通道合并成多通道,下面的实例为对通道进行分割与合并,并图中的RGB值分开,并且分别显示出来,可以看到图片中RGB值的分布情况。
例1:图像存储为IplImage *时通道的分割与合并
int main()
{
IplImage *Image1;
IplImage *RedImage,*GreenImage,*BlueImage;
IplImage *Channel1,*Channel2,*Channel3;
CvSize Size1;
Image1=cvLoadImage("grotto.jpg",1);
Size1=cvGetSize(Image1);
Channel1=cvCreateImage(Size1,IPL_DEPTH_8U,1);
Channel2=cvCreateImage(Size1,IPL_DEPTH_8U,1);
Channel3=cvCreateImage(Size1,IPL_DEPTH_8U,1);
cvSplit(Image1,Channel1,Channel2,Channel3,0);
BlueImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
GreenImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
RedImage=cvCreateImage(Size1,IPL_DEPTH_8U,3);
cvMerge(Channel1,0,0,0,BlueImage);
cvMerge(0,Channel2,0,0,GreenImage);
cvMerge(0,0,Channel3,0,RedImage);
cvNamedWindow("Red pic",1);
cvShowImage("Red pic",RedImage);
cvNamedWindow("Green pic",1);
cvShowImage("Green pic",GreenImage);
cvNamedWindow("Blue pic",1);
cvShowImage("Blue pic",BlueImage);
cvWaitKey(0);
}
例2:图像存储为Mat时通道的分割与合并
#include "cv.h"
#include "highgui.h"
#include <iostream>
#include <vector>
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat src = imread("misaka.jpg");
Mat dst;
vector<Mat> bgr;
//颜色通道分离
//输入图像
//分离后各通道
split(src,bgr);
//颜色通道合成
//输入各通道
//输入图像
merge(bgr,dst);
imshow("dst",dst);
//用彩色图像形象的表示一下,除了原通道保留,其余两通道置0
Mat tmp(src.size(),CV_8U,Scalar(0));
vector<Mat> b,g,r; //用来表示的彩色图像
for(int i=0;i<3;i++)
{
if(i==0)
b.push_back(bgr[0]);
else
b.push_back(tmp);
if(i==1)
g.push_back(bgr[1]);
else
g.push_back(tmp);
if(i==2)
r.push_back(bgr[2]);
else
r.push_back(tmp);
}
merge(b,dst);
imshow("b",dst);
merge(g,dst);
imshow("g",dst);
merge(r,dst);
imshow("r",dst);
waitKey();
return 0;
}