一、图片的读入与写出
(1)imread(src,int flag);其中,src为读取图片存放的路径,flag为对图片的灰度设置,可取如下值:
enum
{
/* 8bit, color or not */
   CV_LOAD_IMAGE_UNCHANGED  =-1,   //这个标识在新版本中被废置了,忽略
/* 8bit, gray */
   CV_LOAD_IMAGE_GRAYSCALE  =0,   //如果取这个标识的话,始终将图像转换成灰度1
/* ?, color */
   CV_LOAD_IMAGE_COLOR      =1,  // 如果取这个标识的话,总是转换图像到彩色一体
/* any depth, ? */
   CV_LOAD_IMAGE_ANYDEPTH   =2,  // 如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回
/* ?, any color */
   CV_LOAD_IMAGE_ANYCOLOR   =4
};
(2)imread(imagename,image);其中,src为读取图片存放的路径,flag为对图片的灰度设置,可取如下值:
imshow("【3】logo图",logo);
(3)通道分离,split(srcImage,channels);其中srcImage为处理图片对象,Channels为分离的三通道;
(4)通道分离后各分离颜色的 ,imageBlueChannel=channels.at(0); //分离蓝色通道
(5)对图像进行加权叠加处理;addWeighted(imageBlueChannel(Rect(0,0,logoImage.cols,logoImage.rows)),0.5,logoImage,0.5,0.,
  imageBlueChannel(Rect(0,0,logoImage.cols,logoImage.rows))); 
(6)分离后的通道在与图片进行混合处理,merge(channels,srcImage); 
(7)重设图片大小;resize(srcImage,sizeImage1,Size(950,600),0,0,CV_INTER_LINEAR);其中把srcImage图片的大小设置为950*600,
   处理完后赋值给sizeImage1;
(8)案例
bool MultichannelBlending()
{
Mat srcImage;   //定义变量
Mat logoImage;
vector<Mat>channels;  //定义通道Mat结构数组
Mat imageBlueChannel;
Mat sizeImage1;
logoImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\hualogo.jpg",0);  //载入图片,并赋值给logoImage,其中第二个参数使用三通道时不可省
srcImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\huage.jpg");     //载入图片,并赋值给srcImage
if(!logoImage.data ) { printf("Oh,no,读取logoImage错误~!\n"); return false; }
if(!srcImage.data){printf("oh, no,读取srcImage错误1~");}
split(srcImage,channels);//分离色彩通道 ,把一个3通道图像转换成3个单通道图像   
imageBlueChannel=channels.at(0); //分离蓝色通道
addWeighted(imageBlueChannel(Rect(0,0,logoImage.cols,logoImage.rows)),0.5,logoImage,0.5,0.,imageBlueChannel(Rect(0,0,logoImage.cols,logoImage.rows)));  
merge(channels,srcImage);  
resize(srcImage,sizeImage1,Size(950,600),0,0,CV_INTER_LINEAR);  //重设图片大小并赋值给sizeImage1
namedWindow("华哥美照+logo蓝色通道 by tina");  
imshow("华哥美照+logo蓝色通道 by tina",sizeImage1);  
Mat  imageGreenChannel;    
logoImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\hualogo.jpg",0);  
srcImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\huage.jpg");  
if(!logoImage.data ) { printf("Oh,no,读取logoImage错误~!\n"); return false; }  
if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~!\n"); return false; }  
split(srcImage,channels);//分离色彩通道    
imageGreenChannel=channels.at(1);    //分离green
addWeighted(imageGreenChannel(Rect(0,0,logoImage.cols,logoImage.rows)),0.0,logoImage,0.5,0.,imageGreenChannel(Rect(0,0,logoImage.cols,logoImage.rows)));    
merge(channels,srcImage);  
resize(srcImage,sizeImage1,Size(950,600),0,0,CV_INTER_LINEAR);
namedWindow("华哥美照+logo绿色通道 by tina");  
imshow("华哥美照+logo绿色通道 by tina",sizeImage1);  
Mat  imageRedChannel;  
logoImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\hualogo.jpg",0);  
srcImage=imread("D:\\program files\\opencvtest\\opencvtest1\\pic\\huage.jpg");  
if(!logoImage.data ) { printf("Oh,no,读取logoImage错误~!\n"); return false; }  
if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~!\n"); return false; }   
split(srcImage,channels);//分离色彩通道     
imageRedChannel=channels.at(2);//分离红色通道
addWeighted(imageRedChannel(Rect(0,0,logoImage.cols,logoImage.rows)),0.0,logoImage,0.5,0.,imageRedChannel(Rect(0,0,logoImage.cols,logoImage.rows)));   
merge(channels,srcImage); 
resize(srcImage,sizeImage1,Size(950,600),0,0,CV_INTER_LINEAR);//重设图片大小
namedWindow("华哥美照+logo红色通道 by tina");  
imshow("华哥美照+logo红色通道 by tina",sizeImage1);     
return true;  
}  
运行结果图:
 
原文:http://www.cnblogs.com/tyen0921/p/4836571.html