一、图片的读入与写出
(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)));
- void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);
- 第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
- 第二个参数,alpha,表示第一个数组的权重
- src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数
- 第四个参数,beta,表示第二个数组的权重值
- 第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
- 第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()
(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错误~! "); 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错误~! "); return false; } if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~! "); 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错误~! "); return false; } if(!srcImage.data ) { printf("Oh,no,读取srcImage错误~! "); 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; }
运行结果图: