一、图片的读入与写出
(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错误~!\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;
}
运行结果图:

浙公网安备 33010602011771号