python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算
【0】基础定义
按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。
按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。
按位取反运算:一个二进制数,0变1,1变0。
按位异或运算: 两个等长度二进制数上下对齐,相同取0,其余取1。
【1】引言
前序已经学习了cv2.bitwise_and()函数、cv2.bitwise_or()函数和cv2.bitwise_not()函数进行图像按位与计算、按位或运算和按位取反运算,相关文章链接为:
python学opencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十四)原理探究:bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客python学opencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客python学opencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客
python学opencv|读取图像(四十七)使用cv2.bitwise_not()函数实现图像按位取反运算-CSDN博客
在此基础上,我们再次回到两个图像的操作,使用的函数cv2.bitwise_xor()实现图像在各个像素点BGR值的异或。
【2】官网教程
【2.1】cv2.bitwise_xor()函数
点击下方链接,直达函数cv2.bitwise_xor()的官网教程:
OpenCV: Operations on arrays
官网对函数的说明页面为:
图1 cv2.bitwise_xor()的官网教程
在cv2.bitwise_xor()的官网教程可以看到,函数的参数说明为:
void cv::bitwise_xor ( InputArray src1, #输入图像1
InputArray src2, #输入图像2
OutputArray dst, #输出图像
InputArray mask = noArray() ) #掩模矩阵,单通道二维矩阵
和之前的几个位操作函数一样,在函数cv2.bitwise_xor()中,调用掩模效果对应的掩模矩阵为8位单通道二维矩阵 。
【2.2】np.bitwise_xor()函数
点击下方链接,直达函数np.bitwise_xor()的官网教程:
numpy.bitwise_xor — NumPy v2.2 Manual
代码先后使用cv2.bitwise_xor()函数和np.bitwise_xor()函数来展示图像按位异或操作的基本原理。
【3】代码测试
参考前述学习进程中调用的代码,按照输入图像-按位异或-输出图像的顺序规划代码。
首先引入相关模块和图像:
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[:, :, 2] = 120 # 第二个通道值#定义掩模矩阵
mask = np.zeros((gray_src.shape), np.uint8) # 定义一个竖直和水平像素与初始图像等大的全0矩阵
mask[280:350, :] = 155 # 水平区域
mask[:,150:350] = 100 # 竖直区域
然后执行按位异或计算:
#按位异或运算
img=cv.bitwise_xor(src,image) #异或运算
img2=cv.bitwise_xor(src,image,mask=mask) #异或运算
之后读取特定点BGR值进行按位异或计算验证:
#显示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) #定义矩阵#二进制按位异或计算
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_xor(a[i],b[i]) #赋值按位异或计算值print('c',[0,i],'是a[0,',i,']和b[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_xor(c[0,i],d[i]) #赋值按位与计算值print('e',[0,i],'是c[0,',i,']和d[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('xor-n-mask', img) # 显示图像
cv.imwrite('xornmask.png', img) # 保存图像
cv.imshow('xor-w-mask', img2) # 显示图像
cv.imwrite('xor-w-mask.png', img2) # 保存图像
cv.imshow('xor-image', image) # 显示图像
cv.imwrite('xor-image.png', image) # 保存图像
cv.imshow('xor-mask', mask) # 显示图像
cv.imwrite('xor-mask.png', mask) # 保存图像
cv.imshow('ini-xor-n-mask', himg) # 显示图像
cv.imwrite('ini-xor-n-mask.png', himg) # 保存图像
cv.imshow('ini-xor-w-mask', himg2) # 显示图像
cv.imwrite('ini-xor-w-mask.png', himg2) # 保存图像
cv.imshow('xor-n-w', himg3) # 显示图像
cv.imwrite('xor-n-w.png', himg3) # 保存图像
cv.waitKey() # 图像不关闭
cv.destroyAllWindows() # 释放所有窗口
代码运行使用的图像有:
图2 初始图像srcx.png
图3 生成的带掩模的第二张图像xor-image.png
图4 掩模矩阵对应图像or-mask.png
图5 图像按位异或效果-不带掩模矩阵xor-n-mask.png
图6 初始图像和图像按位异或效果-不带掩模矩阵ini-xor-n-mask.png
图7 图像按位异或效果-带掩模矩阵xor-w-mask.png
图8 初始图像和图像按位异或效果-带掩模矩阵ini-xor-w-mask.png
图9 图像按位异或效果-不带和带掩模矩阵xor-n-w-mask.png
由图2至图9可知,对图像按位异或操作后,图像的颜色发生了明显变化,添加掩模矩阵后,只在掩模矩阵显示出图像异或操作的图像效果。
然后读取了特定像素点的BGR值:
图10 特定像素点BGR值异或运算验证
图10中,对第一个图像dst和第二个图像image在特定像素点[300,180]读取了BGR值(矩阵a和b),并调用np.bitwise_xor()函数对这两个值进行了按位异或运算(矩阵c)。
之后,又设置了反异或运算,此时的按位异或图像为:上一步获得的按位异或矩阵和第二个图像image。这两个图像(矩阵c和d)在特定像素点[300,180]的BGR值执行了按位异或操作。
图11 反异或运算代码设置
图10中矩阵形式的BGR值读取效果表明,反按位异或操作执行后,获得的矩阵值(矩阵e)和第一个图像的特定像素点取值相等。
综上所述,基于所有运算结果:使用cv2.bitwise_xor()函数执行图像按位异或计算时,各个像素点的BGR值都是按照十进制转二进制、二进制按位异或计算,然后再转回十进制的顺序进行。
图12 cv2.bitwise_xor()函数实现图像带掩模矩阵按位异或计算
【4】细节说明
由于掩模矩阵是单通道二维矩阵,所以掩模本身只会在黑白色之间变化。
【5】总结
掌握了python+opencv实现使用cv2.bitwise_xor()函数实现图像带掩模矩阵按位异或计算的技巧。
相关文章:

python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算
【0】基础定义 按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。 按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。 按位取反运算:一个二进制数,0变1,1变0。 按…...
YOLOv11-ultralytics-8.3.67部分代码阅读笔记-block.py
block.py ultralytics\nn\modules\block.py 目录 block.py 1.所需的库和模块 2.class DFL(nn.Module): 3.class Proto(nn.Module): 4.class HGStem(nn.Module): 5.class HGBlock(nn.Module): 6.class SPP(nn.Module): 7.class SPPF(nn.Module): 8.class C1(nn…...

c++多态
1.多态的概念 通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同 的状态。 2.多态的定义及实现 2.1多态的构成条件 多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为…...

ResNeSt: Split-Attention Networks 参考论文
参考文献 [1] Tensorflow Efficientnet. https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet. Accessed: 2020-03-04. 中文翻译:[1] TensorFlow EfficientNet. https://github.com/tensorflow/tpu/tree/master/models/official/efficien…...

Blazor-选择循环语句
今天我们来说说Blazor选择语句和循环语句。 下面我们以一个简单的例子来讲解相关的语法,我已经创建好了一个Student类,以此类来进行语法的运用 因为我们需要交互性所以我们将类创建在*.client目录下 if 我们做一个学生信息的显示,Gender为…...

从AD的原理图自动提取引脚网络的小工具
这里跟大家分享一个我自己写的小软件,实现从AD的原理图里自动找出网络名称和引脚的对应。存成文本方便后续做表格或是使用简单行列编辑生成引脚约束文件(如.XDC .UCF .TCL等)。 我们在FPGA设计中需要引脚锁定文件,就是指示TOP层…...
苍穹外卖使用MyBatis-Plus
系列博客目录 文章目录 系列博客目录一、修改sky-take-out项目的pom.xml文件1.修改lombok依赖的版本号2.修改spring-boot-starter-parent父工程的版本号3.增加依赖 二、修改sky-server模块的pom.xml文件1.增加mysql连接的依赖(版本为8.0以上)2.增加两个依…...

Baklib引领数字化内容管理转型提升企业运营效率
内容概要 在数字化迅速发展的背景下,企业正面临着前所未有的内容管理挑战。传统的内容管理方式已难以适应如今的信息爆炸,企业需要更加高效、智能的解决方案以应对复杂的数据处理需求。Baklib作为行业的先锋,以其创新技术对数字化内容管理进…...

【PyTorch】4.张量拼接操作
个人主页:Icomi 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术,能够处理复杂的数据模式。通过 PyTorch࿰…...

MySQL--》深度解析InnoDB引擎的存储与事务机制
目录 InnoDB架构 事务原理 MVCC InnoDB架构 从MySQL5.5版本开始默认使用InnoDB存储引擎,它擅长进行事务处理,具有崩溃恢复的特性,在日常开发中使用非常广泛,其逻辑存储结构图如下所示, 下面是InnoDB架构图…...

Visio2021下载与安装教程
这里写目录标题 软件下载软件介绍安装步骤 软件下载 软件名称:Visio2021软件语言:简体中文软件大小:4.28G系统要求:Windows10或更高,64位操作系统硬件要求:CPU2GHz ,RAM4G或更高下载链接&#…...

实战纪实 | 真实HW漏洞流量告警分析
视频教程在我主页简介和专栏里 目录: 一、web.xml 文件泄露 二、Fastjson 远程代码执行漏洞 三、hydra工具爆破 四、绕过验证,SQL攻击成功 五、Struts2代码执行 今年七月,我去到了北京某大厂参加HW行动,因为是重点领域—-jr&…...

【AI论文】扩散对抗后训练用于一步视频生成总结
摘要:扩散模型被广泛应用于图像和视频生成,但其迭代生成过程缓慢且资源消耗大。尽管现有的蒸馏方法已显示出在图像领域实现一步生成的潜力,但它们仍存在显著的质量退化问题。在本研究中,我们提出了一种在扩散预训练后针对真实数据…...
重回C语言之老兵重装上阵(十六)C语言可变参数
C语言可变参数 在C语言中,标准库提供了一些函数允许接收可变数量的参数。最典型的例子就是 printf 和 scanf,它们能够处理不确定数量的参数。为了实现这一功能,C语言提供了可变参数函数的概念。 1. 可变参数函数的概念 可变参数函数是指函数…...
深拷贝、浅拷贝、移动语义
C 中的拷贝方式 1. 深拷贝(Deep Copy) 定义 深拷贝会复制对象的全部内容,包括对象中动态分配的资源。新对象与原对象完全独立,任何对新对象的修改都不会影响原对象。 实现 通常通过显式的拷贝构造函数或拷贝赋值运算符&#…...
双向链表在系统调度、游戏、文本编辑及组态方面的应用
在编程的奇妙世界里,数据结构就像是一把把神奇的钥匙(前面我们介绍过单向链表的基础了,这里我们更进一步),能帮我们打开解决各种问题的大门。今天,咱们就来聊聊其中一把特别的钥匙——双向链表。双向链表和…...

实践网络安全:常见威胁与应对策略详解
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 引言 在数字化转型的浪潮中,网络安全的重要性已达到前所未有的高度。无论是个人用户、企业,还是政府机构…...
关于2024年
关于2024年 十分钟前我从床上爬起来,坐在电脑面前先后听了《黄金时代》——声音碎片和《Song F》——达达两首歌,我觉得躺着有些无聊,又或者除夕夜的晚上躺着让我觉得有些不适,我觉得自己应该爬起来,爬起来记录一下我…...

Hive:Hive Shell技巧
在终端命令窗口不能直接执行select,creat等HQL命令,需要先进入hive之后才能执行,比较麻烦,但是如果使用Hive Shell就可以直接执行 在终端只执行一次Hive命令 -e 参数, "execute"(执行),使用-e参数后会在执行完Hive的命令后退出Hive 使用场景:…...

Markdown Viewer 浏览器, vscode
使用VS Code插件打造完美的MarkDown编辑器(插件安装、插件配置、markdown语法)_vscode markdown-CSDN博客 右键 .md 文件,选择打开 方式 (安装一些markdown的插件) vscode如何预览markdown文件 | Fromidea GitCode - 全球开发者…...

网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...

Java面试专项一-准备篇
一、企业简历筛选规则 一般企业的简历筛选流程:首先由HR先筛选一部分简历后,在将简历给到对应的项目负责人后再进行下一步的操作。 HR如何筛选简历 例如:Boss直聘(招聘方平台) 直接按照条件进行筛选 例如:…...

图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...
CppCon 2015 学习:Time Programming Fundamentals
Civil Time 公历时间 特点: 共 6 个字段: Year(年)Month(月)Day(日)Hour(小时)Minute(分钟)Second(秒) 表示…...