C++之OpenCV入门到提高006:图像混合
一、介绍
今天是这个系列《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:图像混合的更多相关文章
- 【OpenCV入门教程之三】 图像的载入,显示和输出 一站式完全解析(转)
本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/20537737 作者:毛星云(浅墨) ...
- OpenCV入门:(四:混合两张图片)
1. 原理 对两张图片使用如下公式可以得到两张图片的混合图片, 其中f0(x),f1(x)分别是图片1和图片2同一位置的像素点. 2. OpenCV中的AddWeight函数 函数和参数说明: ) s ...
- 系列文章 -- OpenCV入门教程
<OpenCV3编程入门>内容简介&勘误&配套源代码下载 [OpenCV入门教程之十八]OpenCV仿射变换 & SURF特征点描述合辑 [OpenCV入门教程之 ...
- opencv ,亮度调整【【OpenCV入门教程之六】 创建Trackbar & 图像对比度、亮度值调整
http://blog.csdn.net/poem_qianmo/article/details/21479533 [OpenCV入门教程之六] 创建Trackbar & 图像对比度.亮度值调 ...
- opencv入门系列教学(六)图像上的算术运算(加法、融合、按位运算)
0.序言 这一篇博客我们将学习图像的几种算术运算,例如加法,减法,按位运算等. 1.图像加法 我们可以通过OpenCV函数 cv.add() 或仅通过numpy操作 res=img1+img2 res ...
- 【opencv入门篇】 10个程序快速上手opencv【上】
导言:本系列博客目的在于能够在vs快速上手opencv,理论知识涉及较少,大家有兴趣可以查阅其他博客深入了解相关的理论知识,本博客后续也会对图像方向的理论进一步分析,敬请期待:) PS:官方文档永远是 ...
- 【OpenCV入门指南】第一篇 安装OpenCV
http://blog.csdn.net/morewindows/article/details/8225783/ win10下vs2015配置Opencv3.1.0过程详解(转) http://ww ...
- OpenCV入门学习笔记
OpenCV入门学习笔记 参照OpenCV中文论坛相关文档(http://www.opencv.org.cn/) 一.简介 OpenCV(Open Source Computer Vision),开源 ...
- Android 开发 音视频从入门到提高 任务列表 转载
<Android 音视频从入门到提高 —— 任务列表> 1. 在 Android 平台绘制一张图片,使用至少 3 种不同的 API,ImageView,SurfaceView,自定义 Vi ...
- c#图像处理入门(-bitmap类和图像像素值获取方法)
c#图像处理入门 -bitmap类和图像像素值获取方法 一.Bitmap类 Bitmap对象封装了GDI+中的一个位图,此位图由图形图像及其属性的像素数据组成.因此Bitmap是用于处理由像素数据定义 ...
随机推荐
- Facebook – Reviews (Graph API)
前言 企业网站经常需要放 customer reviews 来增加 conversion. 常见的 Reviews 平台有 Facebook Reviews 和 Google Reviews. 这篇, ...
- 游览器 reflow
refer: https://juejin.im/post/5a9372895188257a6b06132e reflow 伤性能. 所以要闪. 有几个频密触发的东西要留意. 1. scroll 2. ...
- Naive UI 2.38.1
https://www.naiveui.com/zh-CN/os-theme/docs/i18n 配置字体 Naive UI 可以和 vfonts 配合,你可以简单的引入 vfonts 中的字体,包含 ...
- 应聘软件测试 HR 会问到哪些问题?收藏这一篇就够了!
1.你还有收到其他offer吗? 其实hr问你offer情况,是对你感兴趣,想要进一步了解你,看下你的市场竞争力. 但注意不要太坦诚的说:我还没有offer或者收到两个offer还想对比对比:也不要撒 ...
- 【赵渝强老师】Weblogic域和域的组成
一.什么是Weblogic WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于Java EE架构的中间件,WebLogic是用于开发.集成.部署和 ...
- c++中的读写锁
读写锁是一种特殊的锁机制,允许多个线程同时读取共享数据,但在写入共享数据时,只有一个线程可以进行写操作,其他线程必须等待. 这种机制对于读多写少的场景非常有效,可以提高并发性能.以下是通过 share ...
- CNN每层卷积结果视觉展示(3Dircadb肝脏数据为例)
试着展示了肝脏每层卷积之后的结果.代码如下: import torch import torch.nn as nn import SimpleITK as sitk import numpy as n ...
- CSP模拟10--总结
今天是我第一次给模拟赛写正规总结--因为今天的题真的受不了了 四道数学题,一点都不拖泥带水的纯血数学题! T1.黑暗型高松灯 shit 本来是一道放在T4防AK的题,结果学长为了 恶心 锻炼一下我们, ...
- 3.5 Linux命令行下如何识别文件类型?
对于第一次使用 Linux 命令行的用户,可能真的搞不清楚哪个是文件,哪个是目录,究其原因是很难直接通过名字看出来目录和文件的区别. 虽然从名称上不容易分辨,但是可以从颜色上进行区分.一般情况下,Li ...
- 2.15 Linux中一切皆文件[包含优缺点]
Linux 中所有内容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目录(Windows 下称为文件夹)是文件,硬件设备(键盘.监视器.硬盘.打印机)是文件,就连套接字(socket). ...