OpenCV-图像处理(05、图像混合)

版权声明:本文由 Micheal 超 博客 创作,转载请附带链接,有问题欢迎交流。 https://blog.csdn.net/qq_42887760/article/details/85809659

理论-线性混合操作(图像混合有 ·加·减·乘·除·比重 等方式)

  1. addWeighted:
    1.1 比重公式: g ( x ) = ( 1 α ) f g(x) = (1-α)f 0 ( x ) + α f (x) + αf 1 ( x ) (x) ,其中 α 的取值范围为0~1之间,f0(x)表示一张图像x位置像素点的颜色数据,f1(x)表示另一张图像x位置像素点的颜色数据
    1.2 输出的混合图像计算公式 : dst(I) = saturate_cast(src1(I)*alpha + src2(I)*beta + gamma) 这里计算的是两张图像对应位置像素点的颜色数据
    1.3 参数:输入图像1、图像1的比重、输入图像2、图像2的比重、gamma值(如果混合的图像较暗,可以使其变量)、输出混合图像。 两张图像的大小和类型必须一致才可以
    在这里插入图片描述
    示例:由计算公式可以看出dst是由src1、src2个一半合成的
    addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
  2. add:对应像素点的值相加,如果>255,则取255,如果<0,则取0
    示例1:dst(I) = saturate_cast(src1(I) + src2(I)) 将对应位置像素点颜色数据直接相加
    addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
    示例2:dst(I) = saturate_cast(src1(I) + Scalar(I)) 将对应位置像素点颜色数据直接加上固定颜色像素值,这里src是三通道的RGB,所以Scalar也是3
    addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);
  3. subtract:
    示例:dst(I) = saturate_cast(src1(I) - src2(I)) 将对应位置像素点颜色数据直接相减,同add一样,也可以减Scalar
    subtract(src1, src2, dst4, Mat());
  4. multiply:
    示例:dst(I) = saturate_cast(src1(I) * src2(I) * scale) 将对应位置像素点颜色数据相乘再乘scale,同add一样,也可以乘Scalar
    multiply(src1, src2, dst5, 1.0);
  5. divide:
    示例:dst(I) = saturate_cast((src1(I)/src2(I)) * scale) 将对应位置像素点颜色数据相除再乘scale,同add一样,也可以除Scalar
    divide(src2, src1, dst6, 2.0);

代码

#include<opencv2/opencv.hpp>
#include<iostream>
#include<math.h>

using namespace std;
using namespace cv;

int main(int argv,char** argc){
	Mat src1,src2,dst;
	src1=imread("E:/Experiment/OpenCV/Pictures/WindowsLogo.jpg");
	src2=imread("E:/Experiment/OpenCV/Pictures/LinuxLogo.jpg");
	if(!src1.data || !src2.data){
		cout<<"图片读取不到"<<endl;
		return -1;
	}
	imshow("Windows Logo",src1);
	imshow("Linux Logo",src2);

	if(src1.size()==src2.size() && src1.type()==src2.type()){

		Mat dst1, dst2, dst3, dst4, dst5, dst6;
        double alpha = 0.5;
        //理论-线性混合操作: g(x) = (1-α)*f0(x) + α*f1(x)  其中α的取值范围为0~1之间,f0(x)表示一张图像x位置像素点的颜色数据,f1(x)表示另一张
        //输出的混合图像计算公式 : dst(I) = saturate_cast(src1(I)*alpha + src2(I)*beta + gamma)  这里计算的是两张图像对应位置像素点的颜色数据
        //参数:输入图像1、图像1的比重、输入图像2、图像2的比重、gamma值(如果混合的图像较暗,可以使其变量)、输出混合图像。  两张图像的大小和类型必须一致才可以
        addWeighted(src1, alpha, src2, 1 - alpha, 0.0, dst1);//由计算公式可以看出dst是由src1、src2个一半合成的
        add(src1, src2, dst2, Mat());// dst(I) = saturate_cast(src1(I) + src2(I))  将对应位置像素点颜色数据直接相加
        add(src1, Scalar(0, 0, 55), dst3);// dst(I) = saturate_cast(src1(I) + Scalar(I))  将对应位置像素点颜色数据直接加上固定颜色像素值,这里src是三通道的RGB,所以Scalar也是3
        subtract(src1, src2, dst4, Mat());// dst(I) = saturate_cast(src1(I) - src2(I))  将对应位置像素点颜色数据直接相减,同add一样,也可以减Scalar
        multiply(src1, src2, dst5, 1.0);// dst(I) = saturate_cast(src1(I) * src2(I) * scale)  将对应位置像素点颜色数据相乘再乘scale,同add一样,也可以乘Scalar
        divide(src2, src1, dst6, 2.0);// dst(I) = saturate_cast((src1(I)/src2(I)) * scale)  将对应位置像素点颜色数据相除再乘scale,同add一样,也可以除Scalar

        imshow("addWeighted", dst1);
        imshow("add_src2", dst2);
        imshow("add_scalar", dst3);
        imshow("subtract", dst4);
        imshow("multiply", dst5);
        imshow("divide", dst6);



	}else{
		cout<<"两张图片大小不一致"<<endl;
		return -1;
	}

	waitKey(0);
	return 0;
}

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

推荐参考博客:
https://blog.csdn.net/huanghuangjin/article/details/80875691

猜你喜欢

转载自blog.csdn.net/qq_42887760/article/details/85809659