python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算
【0】基础定义
按位与运算:全1取1,其余取0。按位或运算:全0取0,其余取1。
【1】引言
前序学习进程中,已经对图像按位与计算进行了详细探究,相关文章链接如下:
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十四)原理探究:bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
图像的按位与运算,是将各个像素点的BGR值先由十进制转二进制,在二进制环境下进行按位与运算后,再转回十进制的过程。
当三个图像进行按位与运算时,先前两个图像按位与运算,再将按位与运算结果和第三个图像执行按位与运算。
在此基础上,本次文章进一步探究图像的按位或运算。
在按位与运算的学习基础上,不妨大胆猜测图像的按位或运算工作原理:将各个像素点的BGR值先由十进制转二进制,在二进制环境下进行按位或运算后,再转回十进制。
【2】官网教程
点击下方链接,直达按位或运算的官网教程:
OpenCV: Operations on arrays
官网对按位或运算函数cv2.bitwise_or()的解释为:
图1
在这里,对应的参数意义为:
具体的,参数意义为:
void cv::bitwise_or ( InputArray src1, #第一个图像
InputArray src2, #第二个图像
OutputArray dst, #输出图像
InputArray mask = noArray() ) #掩模,单通道数据,可选参数
按位或运算要求数据的大小一致,对于三通道图像,会逐个通道进行按位或运算。
按位或运算的mask掩模参数也要求是单通道的二维矩阵。
【3】代码测试
由于前述对bitwise_and()函数的探究已经足够详细,所以可以直接借用先前代码的大部分内容,稍加修改就能获得bitwise_or()函数的完整代码:
import cv2 as cv # 引入CV模块
import numpy as np #引入numpy模块# 读取图片-直接转化灰度图
src = cv.imread('srcx.png') #读取图像
dst=src #输出图像
gray_src=cv.cvtColor(src,cv.COLOR_BGR2GRAY) #转化为灰度图
dstg=gray_src #输出图像
print('初始图像像素大小为',src.shape)
print('初始图像灰度图像素大小为',gray_src.shape)# 定义第二个图像
image = np.zeros(src.shape, np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
print('初始图像像素大小为',src.shape)
image[50:350, :, :] = 180 # 行掩模
image[:,120:200,: ] = 255 # 列掩模
image[:, :, 1] = 180 # 第二个通道值#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155 # 水平区域
mask[:,150:350] = 100 # 竖直区域#按位与运算
img=cv.bitwise_or(src,image) #与运算
img2=cv.bitwise_or(src,image,mask=mask) #与运算#显示BGR值
print("dst像素数为[300,180]位置处的BGR=", dst[300,180]) # 获取像素数为[100,100]位置处的BGR
print("image像素数为[300,180]位置处的BGR=", image[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img像素数为[300,180]位置处的BGR=", img[300,180]) # 获取像素数为[100,100]位置处的BGR
print("img2像素数为[300,180]位置处的BGR=", img2[300,180]) # 获取像素数为[100,100]位置处的BGRa=np.zeros((1,3),np.uint8) #定义矩阵
a=dst[300,180] #将像素点BGR直接赋值给矩阵
b=np.zeros((1,3),np.uint8) #定义矩阵
b=image[300,180] #将像素点BGR直接赋值给矩阵
c=np.zeros((1,3),np.uint8) #定义矩阵
d=np.zeros((1,3),np.uint8) #定义矩阵
d=image[300,180] #将像素点BGR直接赋值给矩阵
e=np.zeros((1,3),np.uint8) #定义矩阵#二进制按位与计算e
for i in range(3): #计数print('a','[0,',i,']=',a[i],'的二进制转化值=', bin(a[i]), ',b=','[0,',i,']=', b[i],'的二进制转化值=',bin(b[i])) #输出二进制转化值c[0,i]=np.bitwise_and(a[i],b[i]) #赋值按位与计算值print('c',[0,i],'=',c[0,i]) #输出按位与计算值print('c','[0,',i,']=',[0,i],'的二进制转化值=', bin(c[0,i]), ',d=','[0,',i,']=', d[i],'的二进制转化值=',bin(d[i])) #输出二进制转化值e[0,i]=np.bitwise_and(c[0,i],d[i]) #赋值按位与计算值print('e',[0,i],'=',e[0,i]) #输出按位与计算值#输出矩阵结果
print('a=',a) #输出矩阵
print('b=',b) #输出矩阵
print('c=',c) #输出矩阵
print('d=',d) #输出矩阵
print('e=',e) #输出矩阵#合并图像
himg=np.hstack((src,img))
himg2=np.hstack((src,img2))
himg3=np.hstack((img,img2))
# 显示和保存定义的图像
cv.imshow('dst', dst) # 显示图像
cv.imshow('or-img', img) # 显示图像
cv.imwrite('or-img.png', img) # 保存图像
cv.imshow('or-img2', img2) # 显示图像
cv.imwrite('or-img2.png', img2) # 保存图像
cv.imshow('or-image', image) # 显示图像
cv.imwrite('or-image.png', image) # 保存图像
cv.imshow('or-mask', mask) # 显示图像
cv.imwrite('or-mask.png', mask) # 保存图像
cv.imshow('or-himg', himg) # 显示图像
cv.imwrite('or-himg.png', himg) # 保存图像
cv.imshow('or-himg2', himg2) # 显示图像
cv.imwrite('or-himg2.png', himg2) # 保存图像
cv.imshow('or-himg3', himg3) # 显示图像
cv.imwrite('or-himg3.png', himg3) # 保存图像
cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
代码里给出了两种按位或运算的执行过程,第一个不带掩模参数,第二个带有掩模参数:
#按位与运算 img=cv.bitwise_or(src,image) #与运算 img2=cv.bitwise_or(src,image,mask=mask) #与运算
另外将特定像素点的BGR值按位与运算改为了按位或运算:
#二进制按位与计算e for i in range(3): #计数print('a','[0,',i,']=',a[i],'的二进制转化值=', bin(a[i]), ',b=','[0,',i,']=', b[i],'的二进制转化值=',bin(b[i])) #输出二进制转化值c[0,i]=np.bitwise_or(a[i],b[i]) #赋值按位与计算值print('c',[0,i],'=',c[0,i]) #输出按位与计算值print('c','[0,',i,']=',[0,i],'的二进制转化值=', bin(c[0,i]), ',d=','[0,',i,']=', d[i],'的二进制转化值=',bin(d[i])) #输出二进制转化值e[0,i]=np.bitwise_or(c[0,i],d[i]) #赋值按位与计算值print('e',[0,i],'=',e[0,i]) #输出按位与计算值
代码运行相关的图像为:
图2 初始图像srcx.png
图3 带掩模的第二张图像or-image.png
图3 掩模矩阵对应的第三张图像or-mask.png
图4 不带掩模矩阵的按位或运算效果or-img.png
图5 带掩模矩阵的按位或运算效果or-img2.png
图6 不带掩模矩阵VS带掩模矩阵的按位或运算效果or-himg3.png
由图2至图6可见,随着按位或运算函数cv2.bitwise_or()的功能执行,图像的色彩出现了明显变化。为增强对比效果,继续输出图像:
图7 初始图像和不带掩模矩阵的按位或运算效果or-himg.png
图8 初始图像和不带掩模矩阵的按位或运算效果or-himg2.png
综合图7和图8,按位或运算函数cv2.bitwise_or()执行后,只在带有掩模的区域出现了图像。为此查看特定像素点的BGR值:
图9 特定像素点BGR按位或运算验证
由图9读取的数据可知:使用cv2.bitwise_or()函数执行图像按位或计算时,当面向两张图像时,各个像素点的BGR值都是按照十进制转二进制、二进制按位或计算,然后再转回十进制的顺序进行。当面向三张图像时,先对前两张图像执行按位或计算,此时会获得一张中间图像,然后中间图像和第三个图像再次执行按位或计算。
图10 cv2.bitwise_or()函数工作流程
【3】总结
掌握了python+opencv实现使用cv2.bitwise_or()函数实现图像带掩模矩阵按位或计算的技巧。
相关文章:

python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算
【0】基础定义 按位与运算:全1取1,其余取0。按位或运算:全0取0,其余取1。 【1】引言 前序学习进程中,已经对图像按位与计算进行了详细探究,相关文章链接如下: python学opencv|读取图像&…...

C# 添加、替换、提取、或删除Excel中的图片
在Excel中插入与数据相关的图片,能将关键数据或信息以更直观的方式呈现出来,使文档更加美观。此外,对于已有图片,你有事可能需要更新图片以确保信息的准确性,或者将Excel 中的图片单独保存,用于资料归档、备…...
工作总结:压测篇
前言 压测是测试需要会的一项技能,作为开发,有点时候也要会一点压测。也是被逼着现学现卖的。 一、压测是什么,以及压测工具的选择 压测,即压力测试,是一种性能测试手段,通过模拟大量用户同时访问系统&am…...

11JavaWeb——SpringBootWeb案例02
前面我们已经实现了员工信息的条件分页查询以及删除操作。 关于员工管理的功能,还有两个需要实现: 新增员工 修改员工 首先我们先完成"新增员工"的功能开发,再完成"修改员工"的功能开发。而在"新增员工"中…...

vs2022+tesseract ocr识别中英文 编译好的库下载
测试图片 效果 编译其实挺麻烦的,可参考:在Windows上用Visual Studio编译Tesseract_windows编译tesseract-CSDN博客 #include "baseapi.h" #include "allheaders.h" #include <iostream> #include <fstream> // 用于文…...

状态模式——C++实现
目录 1. 状态模式简介 2. 代码示例 3. 单例状态对象 4. 状态模式与策略模式的辨析 1. 状态模式简介 状态模式是一种行为型模式。 状态模式的定义:状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。 通俗的说就是一个对象…...
3.观察者模式(Observer)
组件协作模式 现代软件专业分工之后的第一个结果是 “框架与应用程序的划分”,“组件协作” 模式通过晚期绑定,来实现框架与应用程序直接的松耦合,是二者之间协作时常用的模式 典型模式 Template Method Strategy Observer /Event 动机(M…...
Kotlin判空辅助工具
1)?.操作符 //执行逻辑 if (person ! null) {person.doSomething() } //表达式 person?.doSomething() 2)?:操作符 //执行逻辑 val c if (a ! null) {a } else {b } //表达式 val c a ?: b 3)!!表达式 var message: String? &qu…...

Electron学习笔记,安装环境(1)
1、支持win7的Electron 的版本是18,这里node.js用的是14版本(node-v14.21.3-x86.msi)云盘有安装包 Electron 18.x (截至2023年仍在维护中): Chromium: 96 Node.js: 14.17.0 2、安装node环境,node-v14.21.3-x86.msi双击运行选择安…...

将 OneLake 数据索引到 Elasticsearch - 第 1 部分
作者:来自 Elastic Gustavo Llermaly 学习配置 OneLake,使用 Python 消费数据并在 Elasticsearch 中索引文档,然后运行语义搜索。 OneLake 是一款工具,可让你连接到不同的 Microsoft 数据源,例如 Power BI、Data Activ…...

【C++】STL介绍 + string类使用介绍 + 模拟实现string类
目录 前言 一、STL简介 二、string类 1.为什么学习string类 2.标准库中的string类 3.auto和范围for 4.迭代器 5.string类的常用接口说明 三、模拟实现 string类 前言 本文带大家入坑STL,学习第一个容器string。 一、STL简介 在学习C数据结构和算法前,我…...

Hive:基本查询语法
和oracle一致的部分 和oracle不一样的部分 排序 oracle中,在升序排序中,NULL 值被视为最大的值;在降序排序中,NULL 值被视为最小的值。 在MySQL中,NULL 被视为小于任何非空值。 在Hive中, NULL是最小的; Hive除了可以用order…...
日志收集Day008
1.zk集群优化 修改zookeeper的堆内存大小,一般情况下,生产环境给到2G足以,如果规模较大可以适当调大到4G。 (1)配置ZK的堆内存 vim /app/softwares/zk/conf/java.env export JAVA_HOME/sortwares/jdk1.8.0_291 export JVMFLAGS"-Xms2…...

【解决方案】VMware虚拟机adb连接宿主机夜神模拟器
1、本机(宿主机,系统windows10)ip为192.168.31.108 2、运行模拟器后本机cmd查看端口为62026 3、VMware虚拟机(系统,kali)adb连接192.168.31.108:62026报错 failed to connect to 192.168.31.108:16416: Co…...

基于金融新闻的大型语言模型强化学习在投资组合管理中的应用
“Financial News-Driven LLM Reinforcement Learning for Portfolio Management” 论文地址:https://arxiv.org/pdf/2411.11059 摘要 本研究探索了如何通过将大语言模型(LLM)支持的情感分析融入强化学习(RL)中&#…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...

借DeepSeek-R1东风,开启创业新机遇
DeepSeek-R1的崛起 DeepSeek-R1的推出引发了广泛关注,在AI领域引起了一阵旋风。作为新一代的智能模型,它在多项任务中表现出了卓越的能力。普通人可以借助这个强大的工具,开启属于自己的创业之路,抓住时代带来的机遇。 内容创作…...
C# lock使用详解
总目录 前言 在 C# 多线程编程中,lock 关键字是一种非常重要的同步机制,用于确保同一时间只有一个线程可以访问特定的代码块,从而避免多个线程同时操作共享资源时可能出现的数据竞争和不一致问题。以下是关于 lock 关键字的详细使用介绍。 一…...

简易CPU设计入门:控制总线的剩余信号(四)
项目代码下载 请大家首先准备好本项目所用的源代码。如果已经下载了,那就不用重复下载了。如果还没有下载,那么,请大家点击下方链接,来了解下载本项目的CPU源代码的方法。 CSDN文章:下载本项目代码 上述链接为本项目…...
使用 lock4j-redis-template-spring-boot-starter 实现 Redis 分布式锁
在分布式系统中,多个服务实例可能同时访问和修改共享资源,从而导致数据不一致的问题。为了解决这个问题,分布式锁成为了关键技术之一。本文将介绍如何使用 lock4j-redis-template-spring-boot-starter 来实现 Redis 分布式锁,从而…...

SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...

goreplay
1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具,可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长,测试它所需的工作量也会呈指数级增长。GoRepl…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能
vxe-table vue 表格复选框多选数据,实现快捷键 Shift 批量选择功能 查看官网:https://vxetable.cn 效果 代码 通过 checkbox-config.isShift 启用批量选中,启用后按住快捷键和鼠标批量选取 <template><div><vxe-grid v-bind"gri…...