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是用于处理由像素数据定义 ...
随机推荐
- 搭建ipv6并发代理池
声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 学习目标 ounter(l ...
- MoCov1: 无监督视觉表征学习的动量对比《Momentum Contrast for Unsupervised Visual Representation Learning》(MoCo、动量对比、动态字典、队列维护、对比损失InfoNCE)
现在是2024年6月11日,21:49,刚找好要看的论文,师兄推荐的. 先占个坑,明天看,我累了(我没脑子了). 现在是6月12日,15:49,干正事了(又被别人影响了情绪,这不好,希望你改掉,好的, ...
- foobar2000 v1.6.10 汉化版(2022.05.01)
foobar2000 v1.6.10 汉化版 -----------------------[软件截图]---------------------- -----------------------[软 ...
- 深入理解HDFS 错误恢复
我们从动态的角度来看 hdfs 先从场景出发,我们知道 hdfs 的写文件的流程是这样的: 数据以 pipeline 的方式写入 hdfs ,然后对于读取操作,客户端选择其中一个保存块副本的 Data ...
- Java日期时间API系列18-----Jdk8中java.time包中的新的日期时间API类,java日期计算5,其他常用日期计算,星期计算,闰年计算等
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析中可以看出,java8中的方法特别丰富,一些常用的计算如星期计算,闰年计算等 ...
- 使用rancher cli对接k8s
一.获得rancher的token 1.进入rancher,点击右上角弹出框的ApI&Keys 2.进入页面后选择添加key 3.注意,这里的作用集群范围必须不能指定,否则在jenkins服务 ...
- KubeSphere 社区双周报 | 2023.12.21-2024.01.04
KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书.新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列 ...
- KubeSphere 边缘节点 IP 冲突的分析和解决思路分享
在上一篇监控问题排查的文章中,笔者分析了 KubeSphere 3.1.0 集成 KubeEdge 中的边缘监控原理和问题排查思路,在介绍 EdgeWatcher 组件时提到了"边缘节点的内 ...
- KubeSphere 社区双周报 | 2022-10-28
KubeSphere 从诞生的第一天起便秉持着开源.开放的理念,并且以社区的方式成长,如今 KubeSphere 已经成为全球最受欢迎的开源容器平台之一.这些都离不开社区小伙伴的共同努力,你们为 Ku ...
- Power BI 网关无法添加My SQL数据集
今天第一次发布数据类型为MySQL的数据集到Power BI报表服务器,desktop的连接正常,但是发布到web端后,添加网关时却提示以下错误,如下图所示: 错误信息: 无法创建连接,原因如下: 无 ...