1.读图像
Mat imread(const string& filename, int flags=1 );
第一个参数filename
是指const string&
类型的文件名
第二个参数是int
类型的flags
,自带缺省值1,是一个载入标识,它指定一个加载图像的颜色类型。
flags >0返回一个3通道的彩色图像。
flags =0返回灰度图像。
flags <0返回包含Alpha通道的加载的图像。
2.写图像
bool imwrite(const string& filename,InputArray img, const vector<int>& params=vector<int>() );
第一个参数,const string&
类型的filename
第二个参数,InputArray
类型的img
第三个参数,const vector< int >&
类型的params
,表示为特定格式保存的参数编码
- JPEG(有损压缩):这个参数表示图像质量(CV_ IMWRITE_
JPEG_QUALITY),取值范围0-100,数值越大图像质量越高,默认值是95 - PNG(无损压缩):这个参数表示压缩级别(CV_ IMWRITE_
PNG_COMPRESSION),取值范围0-9,数值越大文件越小,但是压缩时间越长,默认值是3 - PPM,PGM,或PBM:这个参数表示一个二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值是1
3.显示图像
1>创建一个窗口
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );
第一个参数,const string&
型的name
,即填被用作窗口的标识符的窗口名称
第二个参数,int
类型的flags
,窗口的标识
WINDOW_NORMAL
设置了这个值,用户便可以改变窗口的大小(没有限制)WINDOW_AUTOSIZE
如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小WINDOW_OPENGL
如果设置了这个值的话,窗口创建的时候便会支持OpenGL
需要的时候,可以可以调用destroyWindow()
或者destroyAllWindows()
函数来关闭窗口,并取消之前分配的与窗口相关的所有内存空间
2>图像显示
void imshow(const string& winname, InputArray mat);
第一个参数,const string&类型的winname,就是写需要显示的窗口标识名称
第二个参数,InputArray 类型的mat,就是写需要显示的图像
4.通过ROI实现图像简单叠加
利用ROI将一幅图加到另一幅图的指定位置
//*******************************彩色图转换成灰度图*****************************************
IplImage*img_color = cvLoadImage("opencvlogo.png", 1);//原彩色图像(1表示读取彩色图)
//将彩色图像转换为灰度图像
IplImage*img_grey = cvCreateImage(cvGetSize(img_color), img_color->depth, 1);
//灰度图像(参数:图像宽、高、像素的位深度和通道数(单通道为灰度图像))
cvCvtColor(img_color, img_grey, CV_BGR2GRAY);
//保存灰度图像
cvSaveImage("opencvlogo_grey.png", img_grey);
//测试
namedWindow(" GreyOpenCVlogo", CV_WINDOW_AUTOSIZE);
cvShowImage("GreyOpenCVlogo", img_grey);
//*******************************通过ROI实现图像叠加*****************************************
Mat srcImage = imread("b.jpg", CV_LOAD_IMAGE_COLOR);
Mat logoImage = imread("opencvlogo_grey.png", CV_LOAD_IMAGE_GRAYSCALE);
//定义一个Mat类型并给其设定ROI区域
Mat imageROI = srcImage(Rect(200, 250, logoImage.cols, logoImage.rows));
//加载掩模(必须是灰度图)
Mat mask = imread("opencvlogo_grey.png", 0);
//将掩膜拷贝到ROI
logoImage.copyTo(imageROI, mask);
//显示
namedWindow("通过ROI实现图像叠加", CV_WINDOW_AUTOSIZE);
imshow("通过ROI实现图像叠加", srcImage);
waitKey(3000);
5.线性混合(Linear Blend)
线性混合操作是一种典型的二元(两个输入)的像素操作,
h(x)=(1-α)·f(x)+α·g(x)
通过在范围 0 - 1 内改变 α,这个操作可以用来对两幅图像或两段视频产生时间上的 画面叠化 (cross-dissolve)效果,比如在幻灯片翻页时设置的前后页缓慢过渡叠加效果,以及电影情节过渡时经常出现的画面叠加效果。
double alpha = 0.5; double beta; double input;
Mat src1, src2, dst;
///读入图片(同类型同尺寸)
src1 = imread("cloud.jpg");
src2 = imread("plane.jpg");
//错误处理
if (!src1.data) { printf("Error loading src1 \n"); return -1; }
if (!src2.data) { printf("Error loading src2 \n"); return -1; }
//图像混合加权操作
beta = (1.0 - alpha);
addWeighted(src1, alpha, src2, beta, 0.0, dst);
//显示
namedWindow("Linear Blend", 1);
imshow("Linear Blend", dst);
addWeighted()这个函数的作用是,计算两个数组(图像阵列)的加权和。
计算公式是 dst=α·src1+β·src2+γ
void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1)
第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
第二个参数,alpha,表示第一个数组的权重
第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
第四个参数,beta,表示第二个数组的权重值。
第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,这个参数设置为-1(默认值),即等同于src1.depth()。
参考
使用OpenCV对两幅图像求和(求混合(blending))
【OpenCV入门教程之四】 ROI区域图像叠加&初级图像混合 全剖析 - 【C++游戏编程】毛星云(浅墨)的专栏 - CSDN博客