OpenCV for Python 第六天:图像的加法运算和加法加权运算

news2024/10/3 18:23:22

上一篇博客当中,我们认识了如何获取图片的属性,那么这一篇博客我们就来了解一下有关图像的加法和位运算是什么样的,并通过这些运算完成图片的相关操作

文章目录

  • 加法运算
    • cv2.add()
    • cv2.addWeighted()
    • 基础操作符 +
    • add() 与基础操作符+ 的对比
  • 每日总结

加法运算

图像的加法运算可以理解为将两个图像进行像素级别的叠加操作。在加法运算中,对应位置的像素值相加,得到的结果将成为新图像中该位置的像素值。

具体而言,假设有两个图像A和B,它们具有相同的尺寸和通道数。那么对于每一个像素点(x, y)和通道c,加法运算可以表示为:

新像素值 = A(x, y, c) + B(x, y, c)

这个过程对每个像素位置和通道分别进行操作,可以用于图像融合、图像叠加等应用。需要注意的是,加法运算可能导致像素值溢出,所以一般需要进行像素值归一化或截断操作,以保证结果图像的准确性和可视化效果。

也就是说,我们在图片处理当中会对两张图片相同位置的像素点进行读取,然后两个数的和就是咱们型的加法运算。但是我们都知道,我们的图像的取值范围是[0,255],那么要是超过255,我们就需要使用其他方法进行处理。

cv2.add()

cv2.add() 方法是OpenCV中用于图像加法运算的函数之一。下面是一个 cv2.add() 方法的示例:

import cv2
import numpy as np

# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 执行图像加法运算
result = cv2.add(img1, img2)

# 显示结果图像
cv2.imshow('Result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,首先使用 cv2.imread() 函数读取了两张图像,分别命名为 img1img2。然后使用 cv2.add() 方法将这两张图像进行加法运算,结果保存在 result 变量中。

最后,使用 cv2.imshow() 方法显示结果图像,使用 cv2.waitKey() 等待用户按下键盘上的任意键来关闭窗口,并使用 cv2.destroyAllWindows() 关闭所有窗口。

在这里插入图片描述


可能有的朋友会遇到下面的错误

cv2.error: OpenCV(4.8.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'

在这里插入图片描述
实际上,这是由于我们图像大小和通道可能不一致而导致的。我们使用上一节课学习的属性更改方法,将两张图片改成大小和通道数相同。

在这里插入图片描述

我们稍微了解一下resize()这个函数的作用和需要传入的参数。


cv2.resize()是OpenCV中的一个图像几何变换函数,用于调整图像的大小。它可以按比例缩小或放大图像,也可以通过指定输出图像的大小来进行缩放。

语法:

cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst

参数:

  • src:要调整大小的输入图像。
  • dsize:目标输出图像的大小,可以是一个整数,表示输出图像的边长大小,也可以是一个元组,表示输出图像的宽度和高度。
  • dst:输出图像,可选参数。如果未提供,则函数会自动创建一个与目标输出图像大小相同的图像。
  • fx:在水平方向上的缩放因子。如果未提供,则默认值为0。
  • fy:在垂直方向上的缩放因子。如果未提供,则默认值为0。
  • interpolation:插值方法。指定了图像缩放时所使用的插值方法。默认值为 INTER_LINEAR

常用的插值方法有:

  • INTER_NEAREST:最近邻插值
  • INTER_LINEAR:双线性插值(默认)
  • INTER_AREA:区域插值
  • INTER_CUBIC:双三次插值
  • INTER_LANCZOS4:Lanczos插值

以下是一个cv2.resize()方法的例子:

import cv2

# 读取图像
img = cv2.imread('image.jpg')

# 缩放图像
resized_img = cv2.resize(img, (800, 600))

# 显示原始图像和缩放后的图像
cv2.imshow('Original Image', img)
cv2.imshow('Resized Image', resized_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们首先读取了一张图像,然后使用cv2.resize()方法将图像的大小调整为800x600。最后,我们显示了原始图像和缩放后的图像。


需要注意的是,使用 cv2.add() 方法进行加法运算时,OpenCV会自动进行像素值截断(即使用能够表达的最大值),确保结果图像的像素值在0到255之间。

cv2.addWeighted()

cv2.addWeighted()是OpenCV中的一种线性混合函数,用于将两个图像进行加权混合。 它可以将两个图像按照一定的权重进行加权混合,并输出一个新的图像。

语法:

cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]]) → dst

参数:

  • src1:第一个输入图像。
  • alpha:第一个输入图像的权重系数。
  • src2:第二个输入图像。
  • beta:第二个输入图像的权重系数。
  • gamma:标量值,用于加到加权和中的每个像素。
  • dst:输出图像,可选参数。如果未提供,则函数会自动创建一个与输入图像大小相同的图像。
  • dtype:输出图像的数据类型,可选参数。如果未提供,则自动使用输入图像的数据类型。

以下是一个cv2.addWeighted()方法的例子:

import cv2
import numpy as np

# 读取图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')

# 调整图像大小一致
img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))

# 加权混合两个图像
dst = cv2.addWeighted(img1, 0.7, img2, 0.3, 0)

# 显示混合后的图像
cv2.imshow('Blended Image', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,我们首先读取了两张图像,然后使用cv2.resize()方法将其中一个图像的大小调整为与另一个图像相同。

接着,我们使用cv2.addWeighted()方法对两个图像进行加权混合。在这里,我们将第一个图像的权重系数设置为0.7,第二个图像的权重系数设置为0.3,并将gamma值设置为0。

最后,我们显示混合后的图像。

在这里插入图片描述

我们可以调整权值来显示不同样式的照片

在这里插入图片描述

甚至我们可以不用两次权值相加为1

在这里插入图片描述

基础操作符 +

实际上这样的方法我们之前已经演示过了,由于这个方法过于简单,所以我们在这里不做过多的解释。如果我们的取值超过了255,它会进行取余运算

add() 与基础操作符+ 的对比

通过对比,我们能发现二者加法运算中的不同

import cv2
import numpy as np

# 读取两张图像
img1 = cv2.imread('COLOR_LFS.jpg')
img2 = cv2.imread('COLOR_BIRD.jpg')

# 调整图像尺寸使其相同
img1 = cv2.resize(img1, (img2.shape[1], img2.shape[0]))
result1 = img1+img2

# 执行图像加法运算
result2 = cv2.add(img1, img2)

# 显示结果图像
cv2.imshow('PLUS Result', result1)
cv2.imshow('ADD Result', result2)
cv2.imshow('COLOR_LFS', img1)
cv2.imshow('COLOR_BIRD', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

每日总结

今天我们虚席了图像的加法运算,add()和直接使用"+"进行运算。他们之中的区别是,add()会停留在能够取到的最高值,而+会进行取余运算。我们还学习了addWeighted()方法,他可以按照不同的权值进行加权运算,实现不同的图片显示。

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

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

相关文章

【golang】12、gin 源码解析

文章目录 快速使用返回响应路由匹配pathqueryMultipart/Urlencoded Form 解析请求MultipartFrom MiddleWare github.com/gin-gonic/gin 是 golang 的 web 框架,其用字典树做路由匹配、支持中间件,本文介绍其源码实现。 快速使用 package mainimport (&…

C语言字符串函数学习

前面已经学习了strcpy和strcmp函数;下面继续学习其他的字符串函数; strcat(字符数组1,字符数组2) 字符串连接 把两个字符数组中的字符串连接起来,把字符串2连接到字符串1的后面,结果放在字符数组1中; …

Microsoft Outlook如何撤回已发送的邮件?

打开想要撤回的邮件→More Move Actions→Recall This Message→成功撤回的前提是对方尚未阅读此邮件

vs Qt工程界面无法使用中文,报编译错误问题解决方案

vs Qt工程界面无法使用中文,报编译错误问题解决方案 若基于visual studio 开发Qt 界面程序时,若想界面显示中文时,如设置按钮文字为“按钮”,编译时报错,如")",这个是由于文件编码问题 1. 可以…

Prompt 技巧指南-让 ChatGPT 回答更准确

随着 ChatGPT 等大型语言模型 (LLM)的兴起,人们慢慢发现,怎么样向 LLM 提问、以什么技巧提问,是获得更加准确的回答的关键,也由此产生了提示工程这个全新的领域。 提示工程(prompt engineering)是一门相对较新的领域,用…

Milk-V Duo开发板之TF扩容

起因 开发板正式进入系统后,然后通过SSH的方案登录进入,进入以后,使用df -h命令查看,会发现ROOTFS的容量仅仅只有245.9MB,而我们的boot分区的容量也不过128MB,那么我的TF卡一共32GB,剩下的容量…

windows mysql 自动启动bat脚本

上一篇:windows mysql服务自动启动 错误模块名称:ntdll.dll_csdn_aspnet的博客-CSDN博客 根据上一篇文章进行手动启动mysql服务补充,由于演示机器系统安装的为win11家庭版,为了安全起见,在项目演示期间,避免数据库使用…

基于 Junit 的接口自动化测试框架实现

目录 前言: 分层的自动化测试 接口测试的意义 接口测试框架选型 我们封装的接口测试框架 接口测试关键实践 测试代码规范 (仅供参考) 前言: 基于JUnit的接口自动化测试框架可以实现对接口进行自动化测试,并提供了丰富的断言和报告功能…

PALO ALTO NETWORKS 的新一代防火墙如何保护企业安全

轻松采用创新技术、阻止网络攻击得逞并专注更重要的工作 IT 的快速发展已改变网络边界的面貌。数据无处不在,用户可随时随地从各类设备访问这些数据。同时,IT 团队正在采用云、分析和自动化来加速新应用的交付以及推动业务发展。这些根本性的转变带来了…

Kakfa - 多副本架构

文章目录 基本架构Kafka 多副本架构概念优点缺点 图解多副本架构小结 基本架构 Kafka 多副本架构 概念 Kafka 是一个高性能、分布式的消息系统,被广泛应用于各种场景中。在 Kafka 中,多副本架构是保证数据可靠性的重要手段之一。 多副本架构指的是将同…

【动手学深度学习】--12.深度卷积神经网络AlexNet

文章目录 深度卷积神经网络AlexNet1.AlexNet2.模型设计3.激活函数4.模型实现5.读取数据集6.训练AlexNet 深度卷积神经网络AlexNet 学习视频:深度卷积神经网络 AlexNet【动手学深度学习v2】 官方笔记:深度卷积神经网络(AlexNet) …

Qt的三大优势,打造高效工业软件开发:

强大的跨平台特性:Qt拥有优良的跨平台支持,可以在众多操作系统上运行,包括Microsoft Windows、Linux、Solaris、HP-UX、FreeBSD、QNX等等。这使得开发者可以轻松地将应用程序部署到不同的平台上,提高开发效率和覆盖范围。 面向对…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型案例实践

在水利、环境、生态、机械以及航天等领域中,数学模型已经成为一种常用的技术手段。同时,为了提高模型的性能,减小模型误用带来的风险;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

linux之Ubuntu系列(七)用户管理 终端命令 su 切换用户

# 切换用户 zenxx:su - sup # 录入sup 密码 supxx:$ 切换root用户

Bard:Google AI开始支持中文对话和看图说话了

说起时下火爆的生成式AI,并不是只有ChatGPT。Bard也是一个很优秀的产品,并且刚刚发布的很多有趣的新功能。文末告诉你如何访问Bard。 Google AI在最近的更新中发布了Bard,一个新的语言模型。Bard支持多种语言,包括中文&#xff0…

linux之Ubuntu系列(五)用户管理、查看用户信息 终端命令

创建用户 、删除用户、修改其他用户密码的终端命令都需要通过 sudo 执行 创建用户 设置密码 删除用户 sudo useradd -m -g 组名 新建用户名 添加新用户 -m:自动建立用户 家目录 -g:指定用户所在的组。否则会建立一个和用户同名的组 设置新增用户的密码&…

7、PHP语法要点2

1、or 和 ||,&& 和 and 都是逻辑运算符,效果一样,但是其优先级却不一样。&&、||的优先级在赋值运算符之前,or和and在赋值运算符之后。 2、字符串变量及数组可以在echo输出时双引号内、双引号外均可引用&#xff…

Android Studio Flutter 开发配置

近来比较闲,就研究下Flutter 开发,在此记录下studio 配置过程,时间是2023.7.19 在 Windows 操作系统上安装和配置 Flutter 开发环境 1.首先下载 Flutter SDKhttps://storage.flutter-io.cn/flutter_infra_release/releases/stable/windows/…

【极简,亲测,解决】Too many levels of symbolic links

前言(与内容无关) 帖子看多了,让我产生一种错觉,就是生产这些帖子的人都是机器人吗?是活着的吗?乱七八糟的转载和明显错误的结论太多了。 原因 原因是 链接的层数过多,已经产生了回路。 大概…

【案例教程】基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用能力

Python是功能强大、免费、开源,实现面向对象的编程语言,能够在不同操作系统和平台使用,简洁的语法和解释性语言使其成为理想的脚本语言。除了标准库,还有丰富的第三方库,Python在数据处理、科学计算、数学建模、数据挖…