用法
把两幅图像相加。这种方法可以用于创建特效图或覆盖图像中的信息。我们可以使用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;
}