一、介绍
    今天是这个系列《C++之 Opencv 入门到提高》的第六篇文章。这篇文章也不难,介绍如何图像的混合操作。图像本质上也是数据,既然是数据,我们就可以针对两张或者多张图片进行加、减、乘、除的操作,这些操作太生硬了,这种混和并不是我们想要的,针对混合有专门的接口实现,我们可以对比一下之间的差异。这都是基础,为以后的学习做好铺垫。虽然操作很简单,但是背后有很多东西需要我们深究,才能做到知其然知其所以然。OpenCV 具体的简介内容,我就不多说了,网上很多,大家可以自行脑补。
    OpenCV 的官网地址:https://opencv.org/,组件下载地址:https://opencv.org/releases/
    OpenCV 官网学习网站:https://docs.opencv.ac.cn/4.10.0/index.html

    我需要进行说明,以防大家不清楚,具体情况我已经罗列出来。
        操作系统:Windows Professional 10(64位)
        开发组件:OpenCV – 4.10.0
        开发工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
        开发语言:C++(VC16)

二、知识学习
    接口很简单,不用多说,仔细研究一下原理更有用。

 1 #include <opencv2/opencv.hpp>
2 #include <iostream>
3 #include <math.h>
4
5 using namespace std;
6 using namespace cv;
7
8 /// <summary>
9 /// 图像混合
10 /// 1、理论介绍
11 /// 2、相关API(addWeighted)
12 /// </summary>
13 /// <returns></returns>
14 int main6()
15 {
16 //1、理论介绍
17 //线性混合操作:g(x)=(1-a)f0(x)+af1(x) 其中 a 的取值范围 0-1 之间。
18 // f0(x) 表示第一幅输入图像,f1(x) 表示第二幅输入图像,a 表示权重,表示第一幅图占的权重,或者是第二幅图占的权重,g(x)表示生成后的图像。
19 // Mat 图像是一个二维矩阵,就是具有行和列的数据数组,如果我们针对两张图片的每个像素点进行上述操作,最后就会得到混合后的图像。
20
21 //2、void addWeighted(InputArray src1, double alpha, InputArray src2,double beta, double gamma, OutputArray dst, int dtype = -1)
22 /*
23 函数 addWeighted 计算两个数组的加权和,如下所示:
24 \f[\texttt{ dst } (I) = \texttt{ saturate } (\texttt{ src1 } (I) * \texttt{ alpha } + \texttt{ src2 } (I) * \texttt{ beta } + \texttt{ gamma })\f]
25 其中 I 是数组元素的多维索引。对于多通道数组,每个通道都是独立处理的。
26 该函数可以替换为矩阵表达式:dst = src1*alpha + src2*beta + gamma;
27
28 @note Saturation is not applied when the output array has the depth CV_32S.You may even get
29 result of an incorrect sign in the case of overflow.
30 @param src1 第一张输入的图像数组.
31 @param alpha 第一张输入图像的 alpha 值.
32 @param src2 第二个输入图像数组的大小和通道号与 src1 相同。
33 @param beta 第二个输入图像的 alpha 权重。
34 @param gamma 添加到每个 sum 的标量。
35 @param dst 输出图像数组,该数组具有与 Input 图像数组相同的大小和通道数.
36 @param dtype 输出图像的可选深度:当两个输入图像具有相同的深度时,可以将 dtype 设置为-1,这相当于src1.depth()。
37 @sa add, subtract, scaleAdd, Mat::convertTo
38 */
39
40
41 //注意:图像大小和类型必须一致。
42 Mat src1,src2;
43 src1 = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu.jpg",IMREAD_COLOR);
44 src2 = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu2.jpg", IMREAD_COLOR);
45 if (src1.empty())
46 {
47 cout << "图像1加载失败!!!" << endl;
48 return -1;
49 }
50 if (!src2.data)
51 {
52 cout << "图像2加载失败!!!" << endl;
53 return -1;
54 }
55
56 if (src1.rows == src2.rows && src1.cols == src2.cols && src1.type() == src2.type())
57 {
58 Mat dst = Mat::zeros(src1.size(),src1.type());
59 double alpha = 0.1;
60 addWeighted(src1, alpha, src2, (1 - alpha), 0, dst);
61 //add(src1, src2, dst);
62 //multiply(src1, src2, dst);
63
64 imshow("原图1", src1);
65 imshow("原图2", src2);
66 namedWindow("混合窗口", WINDOW_AUTOSIZE);
67 imshow("混合窗口", dst);
68 }
69 else
70 {
71 cout << "图像1和图像2不同!!!" << endl;
72 }
73
74 waitKey(0);
75
76 return 0;
77 }

    图像混合的效果:

        原图1:
        

        原图2:
        

        混合图:

        

        仔细看背景,是有另外一张图的。

    图像相加的效果:

        

    图像相乘的效果:

        

      没法看了,太亮了,相乘的结果就是接近255最大值,也就是接近白色了。

三、总结
    这是 C++ 使用 OpenCV 的第六篇文章,其实也没那么难,感觉是不是还是很好入门的,那就继续。初见成效,继续努力。皇天不负有心人,不忘初心,继续努力,做自己喜欢做的,开心就好。

C++之OpenCV入门到提高006:图像混合的更多相关文章

  1. 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨)  ...

  2. OpenCV入门:(四:混合两张图片)

    1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...

  3. 系列文章 -- OpenCV入门教程

     <OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...

  4. opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整

    http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...

  5. opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)

    0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...

  6. 【opencv入门篇】 10个程序快速上手opencv【上】

    导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...

  7. 【OpenCV入门指南】第一篇 安装OpenCV

    http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...

  8. OpenCV入门学习笔记

    OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...

  9. Android 开发 音视频从入门到提高 任务列表 转载

    <Android 音视频从入门到提高 —— 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...

  10. c#图像处理入门(-bitmap类和图像像素值获取方法)

    c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...

随机推荐

  1. Angular 18+ 高级教程 – Component 组件 の Angular Component vs Web Component

    前言 在 初识 Angular 中我有提到, Angular 团队是一群不爱创新.爱 follow 标准.爱小题大做的一群人. 所以,要理解 Angular Component,我们就非得要先搞懂远古 ...

  2. JavaScript – 解构赋值 Destructuring Assignment

    参考 阮一峰 – 变量的解构赋值 Array Destructuring Assignment old school const items = [1, 2, 3]; const item1 = it ...

  3. Asp.net Core – CSS Isolation

    前言 ASP.NET Core 6.0 Razor Pages 新功能, 我是用 webpack 做打包的, 所以这个对我没有什么帮助. 但是了解一下是可以的. 希望 .NET 会继续发展的更好, 多 ...

  4. JSON——简介

    JSON--简介    JSON--基础语法    JSON--json数据与java对象的转换       // 将java对象转为json字符串 User user = new User(1,&q ...

  5. foobar2000 v1.6.14 汉化版(2023.01.12更新)

    foobar2000 v1.6.14 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...

  6. linux kernel 中tracing buffer

    Linux内核的tracing buffer是一种用于存储内核跟踪数据的特殊缓冲区.它用于记录内核中发生的事件和活动,以帮助开发人员进行性能分析和故障排查.该缓冲区可以在内核运行时启用,并且可以通过特 ...

  7. Java日期时间API系列33-----Jdk8中java.time包中的新的日期时间API类应用,格式化常用模板大全,新增Excel常用格式。

    从Java日期时间API系列10-----Jdk8中java.time包中的新的日期时间API类的DateTimeFormatter中可以知道常用字符有超过20几种,各种组合结果非常多.但常用的组合就 ...

  8. .NET 白板书写预测-曲线拟合

    白板软件书写速度是其最核心的功能,注册StylusPlugin从触摸线程拿触摸点数据并在另一UI线程绘制渲染是比较稳妥的方案,具体的可以查看小伙伴德熙的2019-1-28-WPF-高性能笔 - lin ...

  9. maven的pom.xml基础配置

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  10. 删除 KubeSphere 中一直卡在 Terminating 的 Namespace

    介绍 最近一直在玩 EKS(Elastic Kubernetes Service -- Amazon EKS) 和 KubeSphere. 因为之前没有使用过 EKS 和 KubeSphere,所以这 ...