美文网首页
三 (3.1 core 模块) 图像混合和图像运算(加减乘除)

三 (3.1 core 模块) 图像混合和图像运算(加减乘除)

作者: 交大小丑 | 来源:发表于2018-11-05 19:11 被阅读0次

    使用OpenCV对两幅图像求和(求混合(blending)) — OpenCV 2.3.2 documentation http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/core/adding_images/adding_images.html#adding-images

    图像混合:

    • addWeighted
    void addWeighted(InputArray src1, 
                     double alpha,
                     InputArray src2,
                     double beta,
                     double gamma,
                     OutputArray dst, 
                     int dtype = -1);
    

    实例

    #include <cv.h>
    #include <highgui.h>
    #include <iostream>
    
    using namespace cv;
    
    int main( int argc, char** argv )
    {
     double alpha = 0.5; double beta; double input;
    
        Mat src1, src2, dst;
    
        /// Ask the user enter alpha
        std::cout << " Simple Linear Blender " << std::endl;
        std::cout << "-----------------------" << std::endl;
        std::cout << "* Enter alpha [0-1]: ";
        std::cin >> input;
    
        /// We use the alpha provided by the user iff it is between 0 and 1
        if (alpha >= 0 && alpha <= 1)
        {
            alpha = input;
        }
    
        /// Read image ( same size, same type )
        src1 = imread("test.jpg");
        resize(src1, src1, Size(1000, 750));
        src2 = imread("test2.jpg");
        resize(src2, src2, Size(1000, 750));
        if (!src1.data) { printf("Error loading src1 \n");  }
        if (!src2.data) { printf("Error loading src2 \n");  }
    
        /// Create Windows
        namedWindow("Linear Blend", 1);
    
        beta = (1.0 - alpha);
        addWeighted(src1, alpha, src2, beta, 0.0, dst);
    
        imshow("Linear Blend", dst);
    
        waitKey(0);
     return 0;
    }
    

    openCV之图像混合 - 大道至简 - CSDN博客 https://blog.csdn.net/weixin_37720172/article/details/72851497

    图像运算

    • add
    • multiply
    • max
    • min

    常用函数汇总

    //------------两幅图像之间的基本运算----------------------------------
    void add(InputArray src1, InputArray src2, OutputArray dst,
                      InputArray mask=noArray(), int dtype=-1);
    
    void subtract(InputArray src1, InputArray src2, OutputArray dst,
                           InputArray mask=noArray(), int dtype=-1);
    
    void multiply(InputArray src1, InputArray src2,
                           OutputArray dst, double scale=1, int dtype=-1);
    
    void divide(InputArray src1, InputArray src2, OutputArray dst,
                         double scale=1, int dtype=-1);
    
    void divide(double scale, InputArray src2,
                         OutputArray dst, int dtype=-1);
    
    void scaleAdd(InputArray src1, double alpha, InputArray src2, OutputArray dst);
    
    void addWeighted(InputArray src1, double alpha, InputArray src2,
                              double beta, double gamma, OutputArray dst, int dtype=-1);
    //-------------位运算----------------
    void bitwise_and(InputArray src1, InputArray src2,
                              OutputArray dst, InputArray mask=noArray());
    
    void bitwise_or(InputArray src1, InputArray src2,
                             OutputArray dst, InputArray mask=noArray());
    
    void bitwise_xor(InputArray src1, InputArray src2,
                              OutputArray dst, InputArray mask=noArray());
    
    void bitwise_not(InputArray src, OutputArray dst,
                              InputArray mask=noArray());
    
    //-------------求两幅图像像素的差的绝对值----------------
    void absdiff(InputArray src1, InputArray src2, OutputArray dst);
    //-------------对单幅图像进行操作的,比如对每个像素的值取平方、平方根、对数等----------------
    void sqrt(InputArray src, OutputArray dst);
    void pow(InputArray src, double power, OutputArray dst);
    void exp(InputArray src, OutputArray dst);
    void log(InputArray src, OutputArray dst);
    

    函数详解

    add
     void add(InputArray src1, 
              InputArray src2, 
              OutputArray dst,
              InputArray mask = noArray(),
              int dtype = -1);
    
    multiply
    void multiply(InputArray src1, 
                  InputArray src2,
                  OutputArray dst,
                  double scale = 1,
                  int dtype = -1);
    
    max
    CV_EXPORTS MatExpr max(const Mat& a, const Mat& b);
    CV_EXPORTS MatExpr max(const Mat& a, double s);
    CV_EXPORTS MatExpr max(double s, const Mat& a);
    
    min
    CV_EXPORTS MatExpr min(const Mat& a, const Mat& b);
    CV_EXPORTS MatExpr min(const Mat& a, double s);
    CV_EXPORTS MatExpr min(double s, const Mat& a);
    

    实例

    #include <cv.h>
    #include <highgui.h>
    #include <iostream>
    
    using namespace cv;
    
    int main( int argc, char** argv )
    {
     Mat src1, src2, dst;
        /// We use the alpha provided by the user iff it is between 0 and 1
        
        /// Read image ( same size, same type )
        src1 = imread("test.jpg");
        resize(src1, src1, Size(1000, 750));
        src2 = imread("test2.jpg");
        resize(src2, src2, Size(1000, 750));
        if (!src1.data) { printf("Error loading src1 \n"); }
        if (!src2.data) { printf("Error loading src2 \n"); }
    
        /// Create Windows
        namedWindow("Linear Blend", 1);
    
        //add(src1, src2,  dst, Mat()); //各个像素相加
        //multiply(src1, src2,  dst );  //各个像素相乘
        //dst = max(src1, src2); //各个像素点位置取较大的
        dst = min(src1, src2); //各个像素点位置取较小的
    
    
        imshow("Linear Blend", dst );
    
        waitKey(0);
     return 0;
    }
    

    OpenCV 学习(图像的基本运算) - Ivan 的专栏 - CSDN博客 https://blog.csdn.net/liyuanbhu/article/details/48916349
    opencv学习之路(8)、基本图像运算——加减与或 - 进击的小猴子 - 博客园 https://www.cnblogs.com/little-monkey/p/7202628.html
    OpenCV矩阵运算 ._chease新浪博客 http://blog.sina.com.cn/s/blog_afe2af380101bqhz.html

    相关文章

      网友评论

          本文标题:三 (3.1 core 模块) 图像混合和图像运算(加减乘除)

          本文链接:https://www.haomeiwen.com/subject/ziskxqtx.html