OpenCV Mat实现图像四则运算及常用四则运算的API函数

       装载有图像数据的OpenCV Mat对象,可以说是一个图像矩阵,可以进行加、减、乘、除运算。特别是加运算特别有用。

       一 与常数的四则运算

           与常数的加运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("3.jpeg");if (src1.empty()){cout << "Open Image Failed!" << endl;}elseimshow("src1",src1);src1 += 30;imshow("src1 new", src1);waitKey(0);}

示例代码中 src1 +=  30;即为与常数加运算代码,试运行结果如下:

图像亮度变亮了。

        与常数的加运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("3.jpeg");if (src1.empty()){cout << "Open Image Failed!" << endl;}elseimshow("src1",src1);src1 -= 30; //subtractimshow("src1 new", src1);waitKey(0);}

示例代码中 src1 -=  30;即为与常数加减算代码,试运行结果如下:

图像整体变暗了。

        与常数的乘运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("3.jpeg");if (src1.empty()){cout << "Open Image Failed!" << endl;}elseimshow("src1",src1);src1 *= 1.2; //Multiply imshow("src1 new", src1);waitKey(0);}

示例代码中 src1 *=  1.2;即为与常数乘减算代码,试运行结果如下:

图像亮度变亮了。

          与常数的除运算  示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("3.jpeg");if (src1.empty()){cout << "Open Image Failed!" << endl;}elseimshow("src1",src1);src1 /= 1.5; //divideimshow("src1 new", src1);waitKey(0);}

示例代码中 src1 *=  1.2;即为与常数乘减算代码,试运行结果如下:

图像整体变暗了很多。 

        常用加运算函数

        OpenCV 图像矩阵常用加运算函数有:addWeighted,add,scaleAdd等。

        addWeighted()

        addWeighted()的原型函数如下:

void cv::addWeighted(InputArray  src1,

                                     double      alpha,

                                     InputArray src2,

                                    double       beta,

                                    double      gamma,

                                   OutputArray  dst,

                                   int                 dtype = -1

             )

这个函数是计算两个数组的加权和,其计算方式如下;

其中 I 是数组元素的多维索引。对于多通道阵列,每个通道都是独立处理的。该函数可以用矩阵表达式替换:

参数:

       src1 第一个输入数组。 

       alpha 第一个数组的权重

       src2 第二个输入数组。

       beta 第一个数组的权重

        gamma 添加到每个总和的标量

        dst 输出数组与输入数组具有相同的大小和通道数。

       dtype 输出数组的可选深度;当两个输入数组具有相同的深度时,dtype 可以设置为-1,这相当于 src1.depth()。

     示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{//addWeighted()Mat src1 = imread("3.jpeg");if (src1.empty()){cout << "Open Image Failed!" << endl;return -1;}imshow("src1",src1);Mat src2 = imread("1.bmp");if (src2.empty()){cout << "Open Image Failed!" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;addWeighted(src1, 1.0, src2, 0.3, 0, dst, -1);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

用addWeighted(),将左边的两张图合成到一起了。

        add()

add()函数的原型如下:

void cv::add(InputArray src1,

                        InputArray  src2,

                        OutputArray dst,

                        InputArray    mask = noArray(),

         int    dtype = -1

        )

其原理如下: 

        示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.jpeg");if (src1.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src1", src1);Mat src2 = imread("2.bmp");if (src2.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;add(src1, src2, dst);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

        

用Add同样实现了图像合成。 

        scaleAdd()

        scaleAdd()函数的原型如下:

void cv::scaleAdd(InputArray src1,

                                double alpha,

                                InputArray src2,

                              OutputArray dst

                                )

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.jpeg");if (src1.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src1", src1);Mat src2 = imread("2.bmp");if (src2.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;//add(src1, src2, dst);scaleAdd(src1, 0.7, src2, dst);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

     减运算函数subtract()

subtract的·原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.jpeg");if (src1.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src1", src1);Mat src2 = imread("2.bmp");if (src2.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;//add(src1, src2, dst);//aleAdd(src1, 0.7, src2, dst);subtract(src1, src2, dst);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

        乘运算multiply()

multiply()函数的原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.jpeg");if (src1.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src1", src1);Mat src2 = imread("2.bmp");if (src2.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;//add(src1, src2, dst);//aleAdd(src1, 0.7, src2, dst);//subtract(src1, src2, dst);multiply(src1, src2, dst,0.01);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

         除运算divide()

divide()函数的原型如下:

其原理如下:

示例:

#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;
using namespace std;int main()
{Mat src1 = imread("1.jpeg");if (src1.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src1", src1);Mat src2 = imread("2.bmp");if (src2.empty()){cout << "Cann't open the Image" << endl;return -1;}imshow("src2", src2);resize(src2, src2, src1.size());Mat dst;//add(src1, src2, dst);//aleAdd(src1, 0.7, src2, dst);//subtract(src1, src2, dst);//multiply(src1, src2, dst,0.01);divide(src1, src2, dst, 70);imshow("dst", dst);waitKey(0);}

试运行,结果如下:

本文就介绍到这里,示例代码及所用到的图片已上传到CSDN,如果需要自己查看试运行效果,可以去下载,链接为:https://download.csdn.net/download/billliu66/89469718

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10.华为路由器使用ospf动态路由连通两个部门网络

目的&#xff1a;实验ospf动态路由协议连通A与B部门 AR1配置 [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 1.1.1.1 24 [Huawei]vlan batch 10 [Huawei]int Vlanif 10 [Huawei]int e0/0/0 [Huawei-Ethernet0/0/0]port link-type access [Huawei-Ethernet0/0/0]por…

SpringCloud中Eureka和Nacos的区别和各自的优点

Eureka注册中心 Eureka作为一个注册中心&#xff0c;服务提供者把服务注册到注册中心&#xff0c;服务消费者去注册中心拉取信息&#xff0c; 然后通过负载均衡得到对应的服务器去访问。 服务提供者每隔30s向注册中心发送请求&#xff0c;报告自己的状态&#xff0c;当超过一定…

解析Java中1000个常用类:Arrays类,你学会了吗?

推荐一个我自己写的程序员在线工具站: http://cxytools.com 提供一站式在线工具平台,专为程序员设计,包括时间日期、JSON处理、SQL格式化、随机字符串生成、UUID生成、随机数生成、文本Hash等功能,提升开发效率。 以下是正文。 在 Java 编程中,数组是基础且常用的数据结…

对比学习

对比学习基本概念 对比学习通过对比数据对的“相似”或“不同”以获取数据的高阶信息。 由同一张原始图片扩增而来的两张新的图片&#xff0c;叫做Positive Pairs。将这两张图片送入深度学习模型中&#xff0c;我们希望深度学习模型学习到这两个图像是相似的。 由不同原始图…

Flutter-实现头像叠加动画效果

实现头像叠加动画效果 在这篇文章中&#xff0c;我们将介绍如何使用 Flutter 实现一个带有透明度渐变效果和过渡动画的头像叠加列表。通过这种效果&#xff0c;可以在图片切换时实现平滑的动画&#xff0c;使 UI 更加生动和吸引人。 需求 我们的目标是实现一个头像叠加列表&…

hadoop常见简单基础面试题

文章目录 hadoop简单基础面试题1. 请说下 HDFS 读写流程2. HDFS 在读取文件的时候&#xff0c;如果其中一个块突然损坏了怎么办3. HDFS 在上传文件的时候&#xff0c;如果其中一个 DataNode 突然挂掉了怎么办4. NameNode 在启动的时候会做哪些操作5.Secondary NameNode 了解吗&…

【完全复现】基于改进粒子群算法的微电网多目标优化调度(含matlab代码)

目录 主要内容 部分代码 结果一览 下载链接 主要内容 程序完全复现文献模型《基于改进粒子群算法的微电网多目标优化调度》&#xff0c;以微电网系统运行成本和环境保护成本为目标函数&#xff0c;建立了并网方式下的微网多目标优化调度模型&#xff0c;通过改进…

小山菌_代码随想录算法训练营第三十天|122.买卖股票的最佳时机II、55. 跳跃游戏 、45.跳跃游戏II、1005.K次取反后最大化的数组和

122.买卖股票的最佳时机II 文档讲解&#xff1a;代码随想录.买卖股票的最佳时机II 视频讲解&#xff1a;贪心算法也能解决股票问题&#xff01;LeetCode&#xff1a;122.买卖股票最佳时机II 状态&#xff1a;已完成 代码实现 class Solution { public:int maxProfit(vector<…

游戏大厂“脱钩”安卓商店: 独立渠道TapTap们能否渔利

一纸公告将游戏厂商与渠道的博弈再度摆上了台面。 近日&#xff0c;腾讯控股旗下手游《地下城与勇士&#xff1a;起源》&#xff08;下称“DNF手游”&#xff09;运营团队发布公告称&#xff0c;自6月20日起&#xff0c;DNF手游将不再上架部分安卓平台的头部应用商店。 下架的…

idea添加文档注释

一、easy javadoc插件 在settings的plugins中下载easy javadoc插件。 安装完成后重启idea&#xff0c;再次打开settings界面。会出现easyDoc相关配置。 二、设置模版以及使用 类描述模版参考设置&#xff1a; /** * 类描述 -> * * Author: ywz * Date: $Date$ */ 方法描述…

C++继承与多态—多重继承的那些坑该怎么填

课程总目录 文章目录 一、虚基类和虚继承二、菱形继承的问题 一、虚基类和虚继承 虚基类&#xff1a;被虚继承的类&#xff0c;就称为虚基类 virtual作用&#xff1a; virtual修饰成员方法是虚函数可以修饰继承方式&#xff0c;是虚继承&#xff0c;被虚继承的类就称为虚基类…

知网期刊《新课程导学》投稿要求及收稿方向

知网期刊《新课程导学》投稿要求及收稿方向 知网期刊《新课程导学》作为一份专注于教育领域的学术期刊&#xff0c;一直以来都致力于为广大学术研究者提供一个高质量、高水平的学术交流平台。为了保证期刊的学术质量&#xff0c;编辑部对投稿要求和收稿方向有着严格的规定。 首…

Makefile 编写

通用格式内容 命令列表中的每条命令必须以 TAB 键开始&#xff0c;不能使用空格&#xff01; 基本书写&#xff1a; main: main.o input.o calcu.o gcc -o main main.o input.o calcu.omain.o: main.cgcc -c main.cinput.o: input.cgcc -c input.ccalcu.o: calcu.cgcc -c ca…

【实战分享】雷池社区版助力构建高可用、安全的Web应用架构

引言 在日益复杂的网络环境中&#xff0c;构建坚不可摧的安全防线成为每一位网站守护者的重要使命。本文将深入剖析一套集CDN加速、高效Nginx代理与雷池WAF深度防护于一体的现代网站安全架构设计&#xff0c;特别强调雷池WAF在此架构中的核心作用及其对整体安全性的提升策略。…

分享记录在使用ubuntu部署项目(api接口项目)的步骤+自己踩过的坑(亲身经历,坑挺多的)

安装虚拟机VMware Workstation Player/Pro 优点&#xff1a; 高性能&#xff1a;VMware的虚拟机通常具有更好的性能和稳定性。 丰富的功能&#xff1a;特别是Pro版本&#xff0c;支持快照、多级别快照、克隆虚拟机等高级功能。 商业支持&#xff1a;有商业支持选项&#xff0c;…

C#实现高斯模糊(图像处理)

在C#中实现高斯模糊&#xff0c;可以使用System.Drawing库。高斯模糊是一种基于高斯函数的滤波器&#xff0c;它可以有效地平滑图像。以下是详细的步骤&#xff0c;包括生成高斯核并应用到图像上的代码示例。 1. 生成高斯核 首先&#xff0c;我们需要编写一个方法来生成高斯核…

bert文本分类微调笔记

Bert实现文本分类微调Demo import random from collections import namedtuple 有四种文本需要做分类&#xff0c;请使用bert处理这个分类问题 # 使用namedtuple定义一个类别(Category)&#xff0c;包含两个字段&#xff1a;名称(name)和样例(samples) Category namedtuple(Ca…

Java 和 Kotlin 单例模式写法对比

目录 1、饿汉模式 Java 写法&#xff1a; Kotlin 写法&#xff1a; Kotlin 这段代码反编译&简化后如下&#xff1a; 2、懒汉模式&#xff0c;静态同步方法 Java 写法&#xff1a; Kotlin 写法&#xff1a; Kotlin 这段代码反编译&简化后如下&#xff1a; 3、懒…

Node.js 渲染三维模型并导出为图片

Node.js 渲染三维模型并导出为图片 1. 前言 本文将介绍如何在 Node.js 中使用 Three.js 进行 3D 模型渲染。通过结合 gl 和 canvas 这两个主要依赖库&#xff0c;我们能够在服务器端实现高效的 3D 渲染。这个方法解决了在服务器端生成和处理 3D 图形的需求&#xff0c;使得可…

【mysql】常用操作:维护用户/开启远程/忘记密码/常用命令

一、维护用户 1.1 创建用户 -- 语法 > CREATE USER [username][host] IDENTIFIED BY [password];-- 例子&#xff1a; -- 添加用户user007&#xff0c;密码123456&#xff0c;并且只能在本地可以登录 > CREATE USER user007localhost IDENTIFIED BY 123456; -- 添加用户…