03 OpenCV图像运算

news2024/12/25 13:34:50

文章目录

  • 1 普通加法
    • 1 加号相加
    • 2 add函数
  • 2 加权相加
  • 3 按位运算
    • 1 按位与运算
    • 2 按位或运算、非运算
  • 4 掩膜

1 普通加法

1 加号相加

在 OpenCV 中,图像加法可以使用加号运算符(+)来实现。例如,如果要将两幅图像相加,可以使用以下代码:

import cv2

img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")

dst = img1 + img2

cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

使用+相加的计算原理是:
y ( x ) = { a + b , a + b ≤ 255 ( a + b ) % 256 , a + b > 255 \begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ (a+b)\%256, \quad a+b>255\\ \end{aligned} \right . \end{equation} y(x)={a+b,a+b255(a+b)%256,a+b>255
即当两份图像相加之后超过上限时,其值为除以256之后的余数。(注意与add函数的计算原理区分)

2 add函数

函数cv2.add()可以用来计算图像像素值相加的和,其语法格式为:

计算结果=cv2.add(像素值a,像素值b)

使用add相加的计算原理是:
y ( x ) = { a + b , a + b ≤ 255 255 , a + b > 255 \begin{equation} y(x)=\left\{ \begin{aligned} a+b, \quad a+b\leq255\\ 255, \quad a+b>255\\ \end{aligned} \right . \end{equation} y(x)={a+b,a+b255255,a+b>255

通过对比可以看出两个方式的差异

import cv2  
  
a = cv2.imread("lenacolor.png", 0)  
b = a  
result1 = a + b  
result2 = cv2.add(a, b)  
cv2.imshow("original", a)  
cv2.imshow("+", result1)  
cv2.imshow("add", result2)  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png

除了两个图像相加之外,图像还可以直接与数字相加:
i m g 1 = ∣ 1 1 1 2 2 2 3 3 3 ∣ img1 = \left| \begin{array}{} 1 & 1 & 1 \\ 2 & 2 & 2\\ 3 & 3 & 3 \end{array} \right| img1= 123123123
执行img2=cv2.add(img1,3)运算后,可得到: i m g 2 = ∣ 4 4 4 5 5 5 6 6 6 ∣ img2 = \left| \begin{array}{} 4 & 4 & 4 \\ 5 & 5 & 5\\ 6 & 6 & 6 \end{array} \right| img2= 456456456

2 加权相加

cv2.addWeighted() 函数是 OpenCV 中的图像加权混合函数。该函数可以将两幅图像按照给定的比例进行混合,得到新的图像。
加权相加的计算方法为: r e s u l t = a c r 1 × a l p h a + a c r 2 × b e t a + g a m m a result = acr1×alpha + acr2×beta + gamma result=acr1×alpha+acr2×beta+gamma
该函数的语法格式如下:

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

参数说明:

  • src1:第一幅图像。
  • alpha:第一幅图像的比例系数。
  • src2:第二幅图像。
  • beta:第二幅图像的比例系数。
  • gamma:结果图像的亮度调节,不调节则填0,但不可省略。
  • dst:结果图像。
  • dtype:结果图像的数据类型。

3 按位运算

1 按位与运算

OpenCV 中的按位与运算的计算原理是二进制位的位与运算。
在计算机中,图像的像素是以二进制位的形式存储的,因此按位与运算就是对两个图像的对应像素的二进制位进行“与”运算。
按位与运算的结果取决于两个数的二进制位上的值,如果两个二进制位都是 1 1 1,则结果为 1 1 1,否则结果为 0 0 0
例如,如果 A = 10 A=10 A=10(二进制为 1010 1010 1010), B = 6 B=6 B=6(二进制为 0110 0110 0110),则 A  and  B = 2 A \ \text{and} \ B = 2 A and B=2(二进制为 0010 0010 0010)。
在 OpenCV 中,按位与运算可以应用于图像的二值化、边缘检测、形状分析等。通过按位与运算,可以将图像的某些部分提取出来,从而获得更多有用的信息。
通过这一特性,可以实现图片的按掩膜提取功能。

import cv2  
import numpy as np  
  
a = cv2.imread("lenacolor.png", 0)  
b = np.zeros(a.shape, dtype=np.uint8)  
b[100:400, 200:400] = 255  
c = cv2.bitwise_and(a, b)  
cv2.imshow("a", a)  
cv2.imshow("b", b)  
cv2.imshow("c", c)  
cv2.waitKey()  
cv2.destroyAllWindows()

image.png

2 按位或运算、非运算

OpenCV 中的按位或运算(Bitwise Or)和非运算(Bitwise Not)是对图像中的每一个像素进行二进制位上的运算。

  • 按位或运算:按位或运算的结果取决于两个数的二进制位上的值,如果两个二进制位中至少有一个是 1 1 1,则结果为 1 1 1,否则结果为 0 0 0
  • 非运算:非运算是对图像中每一个像素的二进制位取反,如果原来是 0 0 0,则结果为 1 1 1;如果原来是 1 1 1,则结果为 0 0 0

在 OpenCV 中,可以使用 cv2.bitwise_or()cv2.bitwise_not() 函数来实现按位或运算和非运算,其使用方法同与运算。

4 掩膜

除了在按位与运算中执行掩膜操作外,在使用add函数时也可以通过mask信息。

import cv2
import numpy as np

img1 = cv2.imread("image1.jpg")
img2 = cv2.imread("image2.jpg")

mask = np.zeros(img1.shape[:2], dtype=np.uint8)
cv2.rectangle(mask, (100, 100), (200, 200), (255, 255, 255), -1)

dst = cv2.add(img1, img2, mask=mask)

cv2.imshow("Result", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在上面的代码中,首先创建了一个全黑的掩膜,然后使用 cv2.rectangle() 函数在掩膜上绘制了一个白色的矩形,该矩形代表了加法运算只需要应用到图像的一部分。
最后,在调用 cv2.add() 函数时,将掩膜作为参数传入,从而只对图像的矩形区域进行加法运算。

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

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

相关文章

JVM - 类加载,连接和初始化

目录 类加载和类加载器 概述 类加载要完成的功能 加载类的方式 类加载器 类加载器的关系 类加载器说明 双亲委派模型 工作过程如下: 双亲委派模型说明: 破坏双亲委派模型: 类连接和初始化 类连接主要验证的内容 类连接中的解析…

c++重中之重:“换个龟壳继续套娃“:运算符重载等的学习

文章目录 前言一.运算符重载二.const成员三.取地址重载总结前言 上一期我们讲到类的6个默认构造函数中的拷贝构造函数,这一期我们继续往下讲,当然难点肯定是运算符重载了。 一、运算符重载 运算符重载是c为了增强代码的可读性引入了运算符重载&#xf…

笑死,面试官又问我SpringBoot自动配置原理

面试官:好久没见,甚是想念。今天来聊聊SpringBoot的自动配置吧? 候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知,SpringBoot有着“约定大于配置”的理念,这一…

亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )

专栏:高并发---前后端分布式项目 👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、…

Spring-事务2

文章目录前言一、事务的特性(ACID)二、事务的隔离级别三、spring中的事务平台事务管理器.事务定义ISOLation_XXX:**事务隔离级别.**PROPAGATION_XXX:**事务的传播行为**.事务状态关系:四、使用XML文件配置事务1、 搭建…

2023前端面试题——JS篇

1.判断 js 类型的方式 1. typeof 可以判断出’string’,‘number’,‘boolean’,‘undefined’,‘symbol’ 但判断 typeof(null) 时值为 ‘object’; 判断数组和对象时值均为 ‘object’ 2. instanceof 原理是 构造函数的 prototype 属性是否出现在对象的原型链中的任何位置 …

Vue原理解析

文章目录1. VUE的响应式原理1.1 ViewModel1.2 双向绑定的基本原理1.3 什么是响应性1.4 Vue 中的响应性是如何工作的2. Vue 渲染机制2.1 虚拟 DOM2.2 渲染管线2.3 带编译时信息的虚拟 DOM2.3.1 静态提升2.3.2 修补标记 Flags2.3.3 树结构打平2.3.4 对 SSR 激活的影响1. VUE的响应…

Zookeeper安装和基本使用

目录标题一、下载二、安装三、启动客户端测试四、使用zk一、下载 注意:自zk3.5.5版本以后,已编译的jar包,尾部有bin,应该使用的是apache-zookeeper-3.8.0-bin.tar.gz。,因此在下载高版本时,因该下载后缀带b…

华为手表开发:WATCH 3 Pro(5)点击按钮弹窗

华为手表开发:WATCH 3 Pro(5)点击按钮弹窗初环境与设备创建项目认识目录结构修改首页 -> 新建按钮 “ 按钮 ”文件名:**index.hml**引用包:system.prompt点击结果初 鸿蒙可穿戴开发 希望能写一些简单的教程和案例…

三大指标继续狂飙!重庆啤酒:不惧强弱分化加剧,深耕高端市场

十多年前,重庆啤酒因为9个跌停而被一片唱衰,资本市场经典的“关灯吃面”典故自此出现,被股民沿用至今。不过自2020年,重庆啤酒开始逆转走势,股价连续上涨。2021年重庆啤酒营收突破百亿大关,净赚11.66亿元&a…

关于小程序,你想知道的这些

近年来,各大平台纷纷上架小程序,迎来了小程序的爆发式增长。今天就来跟大家简单分享一下小程序基本的运行机制和安全机制。 小程序的由来 在小程序没有出来之前,最初微信WebView逐渐成为移动web重要入口,微信发布了一整套网页开…

自监督表征学习方法——BYOL(Bootstrap Your Own Latent)

自监督表征学习方法——BYOL(Bootstrap Your Own Latent) 参考文献:《Bootstrap Your Own Latent A New Approach to Self-Supervised Learning》 1.前言背景 学习良好的图像表示是计算机视觉中的一个关键挑战,因为它允许对下游任务进行有效的训练。许…

POE接口电路设计

首先看到PSE端,主要包含PSE芯片,MOS管(有些PSE芯片MOS管是集成在芯片里面的),自恢复保险丝,还有TVS管,一般这个TVS管保护电压是58V的。这个电阻是用来检测POE传输的电流的,一般是0.几…

vue2 diff算法及虚拟DOM

概括:diff算法,虚拟DOM中采用的算法,把树形结构按照层级分解,只比较同级元素,不同层级的节点只有创建和删除操作。 一、虚拟DOM (1) 什么是虚拟DOM? 虚拟 DOM (Virtual DOM,简称 VDOM) 是一种…

KDDAC-10kV 电缆交流耐压及振荡波局放测试系统

一、概述 目前对电力电缆检修的管理,主要是依据《电力设备交接和预防性试验规程》所规定的项目和试验周期,定期在停电状态下进行绝缘性能试验。其中变频串联谐振试验由于试验状况接近电缆的运行工况,因此成为国内目前应用广泛的试验方法。 …

社科院与杜兰大学中外合作办学金融管理硕士——30+的年龄在职读研有必要吗?

说起读研,年龄在什么区间最合适呢?上次有位咨询的同学反馈年龄已经快35岁了,有一份不错的工作,但又不甘心止步于此,想要通过提升学历升职加薪,但又纠结自己是否能静下心来学习、是否能顺利毕业、拿到的证书…

[HSCSEC 2023] rev,pwn,crypto,Ancient-MISC部分

比赛后有讲解,没赶上,前20比赛完1小时提交WP,谁会大半夜的起来写WP。总的感觉pwn,crypto过于简单,rev有2个难的不会,其它不是我的方向都感觉过于难,一个都没作。revDECOMPILEONEOONE入门题,一个…

12 循环神经网络(基础篇) Basic RNN

文章目录问题引入关于权重权重共享RNN CellRNN原理RNN计算过程代码实现RNN Cell维度说明代码RNN维度说明NumLayers说明计算过程代码参考实例问题分析多分类问题代码RNN CellRNN改进Embedding网络结构Embedding说明Linear说明代码课程来源: 链接课程文本参考&#xf…

前端react面试题指南

概述下 React 中的事件处理逻辑 抹平浏览器差异,实现更好的跨平台。避免垃圾回收,React 引入事件池,在事件池中获取或释放事件对象,避免频繁地去创建和销毁。方便事件统一管理和事务机制。 为了解决跨浏览器兼容性问题&#xff0…

CSS基础:盒子模型和浮动

盒子模型 所有HTML元素可以看作盒子,在CSS中,"box model"这一术语是用来设计和布局时使用 CSS盒模型本质上是一个盒子,封装HTML元素。 它包括:外边距(margin),边框(bord…