OpenCV学习笔记5——图像的数值计算

目录

一、简单数值计算

二、opencv中提供函数进行计算

三、cv2.addWeighted


 

 

一、简单数值计算

在opencv中,我们有许多可以获取图像各类数值的办法,许多函数能获得各种方面的数据。但如果我们什么都不用,仅仅对图像上每一个点做加法运算会发生什么?

import cv2

img1 = cv2.imread('3.jpg')

img2 = img1 + 10

print(img1[:5,:,0])
print(img2[:5,:,0])

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

cv2.waitKey(0)

这里,我们先导入opencv库,然后将名为“3.jpg”的图片读进来。 回忆一下,imread()函数返回的是一个Numpy数组,这个数组通常是三维数组,包含了高度、宽度、通道数。对于彩色图像,通道数一般为3。

第4行让img2=img1+10,相当于给读进来的图像的每一像素的三个通道都加了10

代码第6行使用数组的知识,创建了一个图像的前 5 行像素的第一个通道的切片,并将其打印出来,最后将原来的图像和改变后的图像显示出来,如下图所示:

46d655606ae34347b97cdb8d4a4f9384.png

bbbfef6e1e314f57bdbec3bf54b3c552.png

可以看到,新的图像已经不成样子了。对比前后输出的两个二维列表可以发现,列表中的每一个值都加了10,但有的直接变成了个位数。 这是因为,列表中的每个值只能从0~255这256个值中选择一个,但254+10=264,已经超出了255的范围,所以在求余256后得到了新的图像值。

接下来我们让两个图像的值直接相加,看看会发生什么。

import cv2

img1 = cv2.imread('3.jpg')
img2 = cv2.imread('4.jpg')

img3 = img1 + img2

print(img3[:5,:,1])

cv2.imshow('img3', img3)

cv2.waitKey(0)

这里,前面的步骤与上面一样,这里多读进来一张图片,并将两张图片直接相加,结果赋值给img3,并将img3显示出来。

可是运行却出现了如下报错:

4623e776821c406886c2c2f878c84a17.png

这个报错的意思是,在执行img1+img2的代码时,程序发现用来相加的两个数组高度、宽度不一样,所以没有办法相加。这告诉我们,在执行图像加法时,两个图像的高度、宽度、通道都必须一致。 

我们修改一下代码:

import cv2

img1 = cv2.imread('3.jpg')
img2 = cv2.imread('4.jpg')

img1 = cv2.resize(img1, (272, 245))

img3 = img1 + img2

print(img3[:5,:,1])

cv2.imshow('img3', img3)

cv2.waitKey(0)

这里,我们在执行加法之前加了一个cv2.resize函数,重新设定了img1图像的大小使其与img2相同。这样就能执行加法了,运行结果如下:

05d6362b7df740aea813d9b7b7e30d12.png

4b5243aad92f44f8a3b49ee41e003ed0.png

看起来还是蛮掉san的。 

二、opencv中提供函数进行计算

但其实,opencv中给我们提供了一个加法函数cv2.add(),它与加法的区别在哪里,我们来运行看一下:

import cv2

img1 = cv2.imread('3.jpg')
img2 = cv2.imread('4.jpg')

img1 = cv2.resize(img1, (272, 245))

img3 = cv2.add(img1, img2)

print(img3[:5,:,1])

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)

8da3cd643e344f26a8bdb2e722d6d2bd.png 

00af1e0cec254aa092224595d66accd0.png

在输出的列表中可以看到,上次超出255范围被求余的数值,现在统统变成了255,相当于越界的数值被强制设置为了255,不再进行求余操作。

但是很明显,这样的图像相加并没有满足我们的要求,得到的图像都没法看。怎么办呢?opencv也提供了相应的函数给我们使用。

三、cv2.addWeighted

在opencv中,cv2.addWeighted函数用于更加精准的图片叠加。数学计算的公式为:

eq?R%3D%5Calpha%20x_%7B1%7D+%5Cbeta%20x_%7B2%7D+b

其中,R代表叠加后的图像,eq?x_%7B1%7D ,eq?x_%7B2%7D代表参与叠加的两个图像,eq?%5Calphaeq?%5Cbeta分别代表两张图像的权重,b代表标量值,加到加权和上。

在代码中,需要这么写:

import cv2

img1 = cv2.imread('3.jpg')
img2 = cv2.imread('4.jpg')

img1 = cv2.resize(img1, (272, 245))

img3 = cv2.addWeighted(img1, 0.4, img2, 0.6, 0)

print(img3[:5,:,1])

cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
cv2.imshow('img3', img3)

cv2.waitKey(0)

这段代码中,cv2.addWeight()传入了五个参数,分别是叠加图像1eq?x_%7B1%7D,图像1的权重eq?%5Calpha,叠加图像2eq?x_%7B2%7D,图像2的权重eq?%5Cbeta以及标量值b。

运行结果如下:

75cb0356ac884a79abe22f5f0448382d.png

 这样看起来,图像的叠加就不会显得生硬了。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络:数据链路层 —— 扩展共享式以太网

文章目录 共享式以太网共享式以太网存在的问题在物理层扩展以太网扩展站点与集线器之间的距离扩展共享式以太网的覆盖范围和站点数量 在链路层扩展以太网网桥的主要结构网桥的基本工作原理透明网桥自学习和转发帧生成树协议STP 共享式以太网 共享式以太网是当今局域网中广泛采…

【MySQL】表的约束、基本查询、内置函数

目录 1. 表的约束1.1 空属性1.2 默认值1.3 列描述1.4 zerofill1.5 主键1.6 自增长1.7 唯一键1.8 外键 2. 基本查询2.1 表的增删改查2.1.1 插入数据2.1.2 插入否则更新2.1.3 替换插入 2.2 Retrieve2.2.1 select ----- 查询2.2.2 where ----- 筛选2.2.3 order by ----- 结果排序2…

全方面熟悉Maven项目管理工具(一)认识Maven、Maven如何安装?

1. Maven 1.1 应用场景: 本地仓库: 我们使用的jar依赖于maven的本地仓库 自动部署: 本地仓库推送到远程仓库, 远程库通知 Jenkins工具,Jenkins 调用Maven构建war包,Jenkins 再调用准备好的脚本程序&…

linux jdk环境变量变量新配置方式

1.jdk17--> jdk8环境变量配置,source /etc/profile了也不生效 which java #假设上命令运行结果为/usr/bin/java rm -rf /usr/bin/javaln -s $JAVA_HOME/bin/java /usr/bin/java source /etc/profile# 断开本次远程连接,重连检查java -version 2.jdk环境变量变…

UDP和TCP的区别

UDP(User Datagram Protocol)和TCP(Transmission Control Protocol)是两种不同的传输层协议,它们在数据传输的方式和可靠性方面有显著区别: 连接方式: TCP:面向连接的协议&#xff0…

Unity DOTS中的Archetype与Chunk

Unity DOTS中的Archetype与Chunk 在Unity中,archetype(原型)用来表示一个world里具有相同component类型组合的entity。也就是说,相同component类型的entity在Unity内部会存储到一起,共享同一个archetype。 使用这样的设…

Linux系统:本机(物理主机)访问不了虚拟机中的apache服务问题的解决方案

学习目标: 提示:本文主要讲述-本机(物理主机)访问不了虚拟机中的apache服务情况下的解决方案 Linux系统:Ubuntu 23.04; 文中提到的“本机”:代表,宿主机,物理主机; 首先&#xff0c…

linux 中mysql my.cnf 配置模版

前置准备 sudo systemctl stop mysqld 注意: 原本配置重命名做备份 备份数据 删文件 直接新建 my.cnf 把配置 11要粘进去的内容 直接粘进去 注意:尽管log-bin 和 log_bin 都可以启用二进制日志,但为了保持与现代MySQL版本的兼容性和一…

物流行业创新:SpringBoot技术应用

2相关技术 2.1 MYSQL数据库 MySQL是一个真正的多用户、多线程SQL数据库服务器。 是基于SQL的客户/服务器模式的关系数据库管理系统,它的有点有有功能强大、使用简单、管理方便、安全可靠性高、运行速度快、多线程、跨平台性、完全网络化、稳定性等,非常…

24.安卓逆向-frida基础-objection工具3-实战

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 内容参考于:图灵Python学院 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。 工…

全方面熟悉Maven项目管理工具(五)教你IDEA创建Maven基本项目、导入工程和模块,并为你讲解Maven的生命周期

1. IDEA 配置 Maven 本身 IDEA 就可以在一个项目中创建多个子模块。 1.1 创建父工程 如果要构建不同的 Maven 工程类型,可以勾选【从原型创建】在列表中选择工程类型 1.2 IDEA 配置 Maven 本地仓库 在设置中前往:构建、执行、部署 >> 构建工具…

鸿蒙网络编程系列28-服务端证书锁定防范中间人攻击示例

1. TLS通讯中间人攻击及防范简介 TLS安全通讯的基础是基于对操作系统或者浏览器根证书的信任,如果CA证书签发机构被入侵,或者设备内置证书被篡改,都会导致TLS握手环节面临中间人攻击的风险。其实,这种风险被善意利用的情况还是很…

Linux基础项目开发day06:量产工具——业务系统

文章目录 前言一、流程代码框架1、业务系统框架流程2、主页面流程图3、main.c实现流程 二、处理配置文件1、配置文件是啥?config.h 2、怎么处理配置文件?config.c 三、生成界面1、计算每个按钮的Region2、逐个生成按钮画面->生成页面 四、读取输入事件…

记录一次hiveserver2卡死(假死)问题

问题描述 给开发人员开通了个账号,连接hive进行查询,后来发现,hive服务有时候会卡死,查询不了,连不上(所有账号/客户端都连不上hive),但在chd里面看监控,服务器资源状态…

物联网之超声波测距模块、arduino、esp32

MENU 原理硬件电路设计软件程序设计 原理 超声波是一种频率高于20000Hz的声波,功率密度为p≥0.3W/cm,它的方向性好,反射能力强,易于获得较集中的声能。超声波用于许多不同的领域,比如检测物体和测量距离,清…

Unity 2d UI 实时跟随场景3d物体

2d UI 实时跟随场景3d物体位置&#xff0c;显示 3d 物体头顶信息&#xff0c;看起来像是场景中的3dUI&#xff0c;实质是2d UIusing System.Collections; using System.Collections.Generic; using UnityEngine; using DG.Tweening; using UnityEngine.UI; /// <summary>…

【JS】无法阻止屏幕滚动

监听滚轮事件&#xff0c;阻止默认行为&#xff0c;但未生效&#xff0c;且控制台报错。 window.addEventListener(wheel, (e) > {e.preventDefault(); })这是因为现代浏览器使用 Passive 事件监听器&#xff0c;默认启用了 passive 模式以确保性能&#xff0c;不会调用 pr…

Cancer Cell|最新发表的单细胞成纤维细胞分析代码,速来学习!!!

简介 成纤维细胞在维持组织稳态、应对炎症和纤维化状况、帮助伤口愈合以及促进癌症进展的复杂舞蹈中起着关键作用。在癌症领域&#xff0c;成纤维细胞已成为肿瘤微环境&#xff08;TME&#xff09;中的核心人物&#xff0c;发挥着多方面的作用。这些作用包括细胞外基质&#xf…

【深度学习实战—12】:基于MediaPipe的手势识别

✨博客主页&#xff1a;王乐予&#x1f388; ✨年轻人要&#xff1a;Living for the moment&#xff08;活在当下&#xff09;&#xff01;&#x1f4aa; &#x1f3c6;推荐专栏&#xff1a;【图像处理】【千锤百炼Python】【深度学习】【排序算法】 目录 &#x1f63a;一、Med…

Java设计模式梳理:行为型模式(策略,观察者等)

行为型模式 行为型模式关注的是各个类之间的相互作用&#xff0c;将职责划分清楚&#xff0c;使得我们的代码更加地清晰。 策略模式 策略模式太常用了&#xff0c;所以把它放到最前面进行介绍。它比较简单&#xff0c;我就不废话&#xff0c;直接用代码说事吧。 下面设计的…