实战OpenCV之图像的数学运算

news2024/11/13 8:59:50

基础入门

        在OpenCV中,图像的数学运算是一种基本而强大的工具,可以用于多种图像处理任务,包括:图像增强、图像融合、特征提取等。这些运算包括加法、减法、乘法和除法等基本的数学操作。

        加法运算:可以用来合并两个图像,或者调整图像的亮度。对于两个图像的加法,OpenCV会逐像素地将两个图像对应位置上的像素值相加。对于图像与常数的加法,就是将该常数加到图像的每个像素值上,一般用于跳转图像的亮度。

        减法运算:通常用来突出图像间的差异,如比较同一场景的不同图像以发现变化的部分。对于两个图像的减法,OpenCV会逐像素地将两个图像对应位置的像素值相减。减法运算还可用于从前景图像中减去背景图像,以突出前景物体。

        乘法运算:通常用于图像融合,或者调整图像的亮度和对比度。OpenCV中的图像乘法是逐像素进行的,并且通常需要将结果归一化到0到255之间。

        除法运算:通常用来调整图像的动态范围,或者对比度。由于直接除法可能会导致像素值溢出或者精度丢失,因此通常需要将图像转换为浮点数类型。

        注意:在进行加法和减法运算时,OpenCV会自动处理溢出问题。乘法和除法需要特别注意数据类型转换,以避免精度损失。

接口介绍

        在OpenCV中,加法运算可以使用cv::add函数,其函数原型如下。

void add(const InputArray& src1, const InputArray& src2, OutputArray& dst,
    const InputArray& mask = noArray(), int dtype = -1);

        各个参数的含义如下。

        src1和src2:输入图像,必须具有相同的尺寸和深度。

        dst:输出图像,与输入图像具有相同的尺寸和深度(除非指定了不同的数据类型)。

        mask:可选的掩模图像,与输入图像具有相同的尺寸,非零值位置将被应用于加法运算。

        dtype:输出图像的数据类型。如果设置为-1,则输出图像的数据类型与输入图像相同。

        减法运算可以使用cv::subtract函数,其参数与cv::add函数基本相同,故这里不再赘述。

        乘法运算可以使用cv::multiply函数,其函数原型如下。

void cv::multiply(const InputArray& src1, const InputArray& src2,
    OutputArray& dst, double scale = 1, int dtype = -1);

        各个参数的含义如下。

        src1和src2:输入图像,必须具有相同的尺寸和深度。

        dst:输出图像,与输入图像具有相同的尺寸和深度(除非指定了不同的数据类型)。

        scale:乘法结果的缩放因子,通常用于将结果映射到正确的范围。

        dtype:输出图像的数据类型。如果设置为-1,则输出图像的数据类型与输入图像相同。

        除法运算可以使用cv::divide函数,其参数与cv::multiply函数基本相同,故这里不再赘述。

实战解析

        下面的实战代码首先尝试读取两张图片,并将它们存储在Mat类型的变量img1和img2中。如果图片未能成功加载,程序将输出错误信息并终止。接下来,代码检查两张图片的尺寸是否相同。如果不相同,则输出错误信息并终止程序。这是因为,图像的数学运算要求两张图片必须具有相同的尺寸。

        然后,代码执行以下四个数学运算。

        1、加法运算。将两张图片相加,并将结果存储在outputAdd中。

        2、减法运算。从img1中减去img2,并将结果存储在outputSub中。

        3、乘法运算。将两张图片逐像素相乘,并将结果存储在outputMul中。乘法结果需要进行归一化处理,即将结果除以255。

        4、除法运算。为了执行除法运算,首先将两张图片转换为浮点数类型CV_32F。执行除法运算后,再将结果转换回8位整数类型CV_8U,并将结果存储在outputDiv中。

        最后,我们使用imshow函数分别显示了加法、减法、乘法和除法运算的结果。

#include <opencv2/opencv.hpp>
using namespace cv;

#include <iostream>
using namespace std;

int main()
{
    Mat img1 = imread("C++.png");
    Mat img2 = imread("Hello.png");
    if (img1.empty() || img2.empty())
    {
        cout << "Can not open or find the image" << endl;
        return -1;
    }

    // 确保两个图像大小相同
    if (img1.size() != img2.size())
    {
        cout << "Images must be same size" << endl;
        return -1;
    }

    // 加法运算
    Mat outputAdd;
    add(img1, img2, outputAdd);

    // 减法运算
    Mat outputSub;
    subtract(img1, img2, outputSub);

    // 乘法运算
    Mat outputMul;
    multiply(img1, img2, outputMul, 1.0 / 255.0);

    // 除法运算
    Mat outputDiv;
    Mat img1Float, img2Float;
    img1.convertTo(img1Float, CV_32F);
    img2.convertTo(img2Float, CV_32F);
    divide(img1Float, img2Float, outputDiv, 1.0);
    outputDiv.convertTo(outputDiv, CV_8U);

    // 显示结果
    imshow("Add", outputAdd);
    imshow("Subtract", outputSub);
    imshow("Multiply", outputMul);
    imshow("Divide", outputDiv);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

        执行上面的示例代码,运行效果可参考下图。

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

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

相关文章

【JS】卢小姐排队问题(100) |思路参考+代码解析(C++)

题目 LYA 的班级要进行一次班级活动&#xff0c;全班同学按照学号从小到大排成一列。但是卢小姐来晚了&#xff0c;没有来得及排队。现在卢小姐想知道&#xff0c;她应该插入到队列的哪个位置&#xff0c;才能保证队列仍然是按照学号从小到大排列的。请你帮助卢小姐找到她应该…

微服务框架之Kitex

Kitex: 高性能的 Golang 微服务框架 Kitex 是由字节跳动&#xff08;ByteDance&#xff09;开发并开源的一款高性能微服务框架&#xff0c;专为构建分布式系统和微服务架构设计。Kitex 基于 Golang&#xff0c;旨在提供一个简单、高效、灵活的开发体验&#xff0c;帮助开发者快…

ST表(区间查询

解决的问题&#xff1a; 数组区间查询最大值和最小值对于解决数组的树状数组的区间修改 ------- 线段树倍增思想 核心代码&#xff1a; #include<bits/stdc.h> using namespace std; const int N1e5; int num[N]; int f[N][N]; int main(){int n;cin>>n;//输入默…

无线通信频率分配

首先看看无线电信号的频谱如何划分&#xff1a; 一、5G NR 3GPP已指定5G NR 支持的频段列表&#xff0c;5G NR频谱范围可达100GHz&#xff0c;指定了两大频率范围&#xff1a; ① Frequency range 1 &#xff08;FR1&#xff09;&#xff1a;就是我们通常讲的6GHz以下频段 频率…

Lesson07---STL简介(了解)

1. 什么是STL 2. STL的版本 3. STL的六大组件 4. STL的重要性 5. 如何学习STL 6.STL的缺陷 1. 什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与…

【网络】P2P打洞原理

本文首发于 ❄️慕雪的寒舍 1. 引入 如果你折腾过NAS或者BT下载等等玩意&#xff0c;可能听说过“P2P打洞”这一技术名词。简单来说&#xff0c;P2P打洞可以让我们直接在外网访问内网的设备&#xff0c;从而让没有公网IP的家庭设备也能获得“公网直连”的速度。 比如绿联、极…

【JAVA]DAY 2在网页中输出日期和时间,实时还是静止?

一、如何输出日期文本 使用document.write(Date()); 会在网页中输出当前的日期和时间。在 2024 年 8 月 28 日星期三执行这段代码&#xff0c;可能会输出类似 “Wed Aug 28 2024 [具体时间]” 这样的内容。 Date()是 JavaScript 中的一个内置对象&#xff0c;用于处理日期和…

【机器学习】数据预处理-特征工程与特征选择

目录 一、特征工程 二、数据变换 1.变换 2.归一化 三、数据清洗 1.异常数据 2.数据清洗 四、特征选择 1.Filter过滤法 2.Wrapper包裹法 ... 3.Embedded嵌入法 ... 五、降维算法 1.SVD 2.PCA 一、特征工程 特征工程就是从原始数据提取特征的过程&#xff0c;这些…

免费可商用插画素材网站

1、https://undraw.co/illustrations 2、https://iradesign.io/ 3、https://storyset.com/ 4、https://delesign.com/free-designs/graphics/

【Linux篇】三分钟速通Linux基础命令

目录 1. Linux的目录结构 1.1 Linux的目录结构 1.2 /在Linux系统中的表示 2. linux命令基础 2.1 什么是命令和命令行 2.2 Linux命令的通用格式 2.3 ls命令 2.3.1 ls命令的参数的作用&#xff1a; 2.3.2 ls命令的选项 2.3.3 命令的选项组合使用 2.4 cd切换工作目录 2…

宋志平《有效的经营者》首发 高质量经营与企业高质量发展读书分享会圆满举办

走遍人生繁华&#xff0c;醉美江南水乡。8月25日&#xff0c;“美好生活&#xff0c;书香中国”城市行第七站——杭州站&#xff0c;在杭州市兴耀科创城•杭州双碳技术产业园圆满举办。本次活动以高质量经营与企业高质量发展读书分享会为主题&#xff0c;旨在深入推进全民阅读&…

Java基础(泛型)

文章目录 前言 一、泛型类的定义 1.1 泛型类的定义语法 1.2 代码使用示例 二、泛型类的使用语法 2.1 使用语法 2.2 泛型类注意事项 2.3 泛型类的使用小案例 三、从泛型类派生子类&#xff08;2种情况&#xff09; 3.1 子类和父类的泛型类型要保持一致 3.2 子类没有使用…

苹果秋季发布会前瞻:iPhone 16领衔新品盛宴

苹果定档9月9日&#xff0c;揭开新品神秘面纱 苹果公司近日正式宣布&#xff0c;将于9月9日在加州库比蒂诺的Apple Park&#xff0c;史蒂夫乔布斯剧院举办年度秋季新品发布会&#xff0c;主题为“It’s Glowtime”&#xff0c;预示着Siri界面将迎来一场华丽变身。此次发布会较原…

AUTOSAR_EXP_ARAComAPI.pdf的第4章笔记

为了理解AUTOSAR_EXP_ARAComAPI.pdf的第4章内容&#xff0c;生搬硬套的翻译了一把&#xff0c;准备先囫囵吞枣&#xff0c;再仔细理解。因为这些内容的理解也不是一时半会儿的。所以先放上来。 1.AUTOSAR_EXP_ARAComAPI.pdf的介绍 通常&#xff0c;阅读正式的规范并不是学习和…

【扩散模型(六)】IP-Adapter 是如何训练的?2 源码篇(IP-Adapter Plus)

系列文章目录 【扩散模型&#xff08;二&#xff09;】IP-Adapter 从条件分支的视角&#xff0c;快速理解相关的可控生成研究【扩散模型&#xff08;三&#xff09;】IP-Adapter 源码详解1-训练输入 介绍了训练代码中的 image prompt 的输入部分&#xff0c;即 img projection…

ASP.NET MVC+LayUI视频上传完整教程

前言 前段时间在使用APS.NET MVCLayUI做视频上传功能的时&#xff0c;发现当上传一些内存比较大的视频就会提示上传失败&#xff0c;后来通过查阅相关资料发现.NET MVC框架为考虑安全问题&#xff0c;在运行时对请求的文件的长度&#xff08;大小&#xff09;做了限制默认为4M…

缓存Mybatis一级缓存与二级缓存

缓存 为什么使用缓存 缓存(cache)的作用是为了减去数据库的压力,提高查询性能,缓存实现原理是从数据库中查询出来的对象在使用完后不销毁,而是存储在内存(缓存)中,当再次需要获取对象时,直接从内存(缓存)中提取,不再向数据库执行select语句,从而减少了对数据库的查询次数,因此…

力扣之字母异位词分组(python)

题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例 1: 输入: strs ["eat", "tea", "tan", "ate", "nat&qu…

回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法

回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法| 文章目录 前言回归预测|基于鹅GOOSE优化LightGBM的数据回归预测Matlab程序 多特征输入单输出 2024年优化算法GOOSE-LightGBM 一、GOOSE-LightGBM模型原理&#xff1a;流程&#xf…

【STM32】IIC

超级常见的外设通信方式&#xff0c;一般叫做I方C。 大部分图片来源&#xff1a;正点原子HAL库课程 专栏目录&#xff1a;记录自己的嵌入式学习之路-CSDN博客 目录 1 基本概念 1.1 总线结构 1.2 IIC协议 1.3 软件模拟IIC逻辑 2 AT24C02 2.1 设备地址与…