OpenCV笔记(3)图像简单处理

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博客

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值