实现简单的图像运算-加法 cv::add cv::addWeighted cv::scaleAdd

用法

把两幅图像相加。这种方法可以用于创建特效图或覆盖图像中的信息。我们可以使用cv::add(),cv::addWeighted函数:

    // c[i]= a[i]+b[i];
    cv::add(imageA, imageB, resultC);
    // c[i]= a[i]+k;
    cv::add(imageA, cv::Scalar(k), resultC);
    // c[i]= k1*a[i]+k2*b[i]+k3;
    cv::addWeighted(imageA, k1, imageB, k2, k3, resultC);
    // c[i]= k*a[i]+b[i];
     (imageA, k, imageB, resultC);
    // 如果(mask[i]) c[i]= a[i]+b[i];
    cv::add(imageA, imageB, resultC, mask);

小案例测试

需要注意的是两个图片通道数和大小,要一样。

//
// Created by zhongcheng Dai on 2023/5/9.
//
#include <random>
#include <iostream>
#include "opencv2/opencv.hpp"

void salt(cv::Mat image,int n){
    
    
    //随机数生成器
    std::default_random_engine generator;
    std::uniform_int_distribution<int> randomRow(0,image.rows-1);
    std::uniform_int_distribution<int> randomCol(0,image.cols-1);

    int i,j;
    for(int k = 0; k<n;k++){
    
    
        //随机生成图形位置
        i = randomCol(generator);
        j = randomRow(generator);
        if(image.type() == CV_8UC1){
    
     //灰度图像
          image.at<uchar>(j,i) = 0;
        }else if(image.type() == CV_8UC3){
    
    
            image.at<cv::Vec3b>(j,i)[0] = 0;
            image.at<cv::Vec3b>(j,i)[1] = 0;
            image.at<cv::Vec3b>(j,i)[2] = 0;
        }
    }
}





int main(){
    
    

    
    cv::Mat a = cv::imread("../../a.png",1);

    cv::Mat b = cv::imread("../../qw.png",1);

    cv::Mat c = cv::imread("../../c.png",1);

    salt(b,7000);

    cv::Mat result;

    cv::addWeighted( c,1,b,0.8,0.,result);

    cv::imshow("add_",result);

    cv::waitKey(0);

    cv::imshow("image",a);

    salt(a,1000);

    cv::imshow("image_salt",a);

    cv::waitKey(0);

    std::cout<<"test the main!"<<std::endl;

    return 0;
}

两张图片相加的结果

请添加图片描述

猜你喜欢

转载自blog.csdn.net/m0_49302377/article/details/130598342
CV