python学opencv|读取图像(四十八)使用cv2.bitwise_xor()函数实现图像按位异或运算

server/2025/2/5 3:11:16/

【0】基础定义

按位与运算:两个等长度二进制数上下对齐,全1取1,其余取0。

按位或运算:两个等长度二进制数上下对齐,有1取1,其余取0。

按位取反运算:一个二进制数,0变1,1变0。

按位异或运算: 两个等长度二进制数上下对齐,相同取0,其余取1。

【1】引言

前序已经学习了cv2.bitwise_and()函数、cv2.bitwise_or()函数和cv2.bitwise_not()函数进行图像按位与计算、按位或运算和按位取反运算,相关文章链接为:

pythonopencv|读取图像(四十三)使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

pythonopencv|读取图像(四十四)原理探究:bitwise_and()函数实现图像按位与运算-CSDN博客

pythonopencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客pythonopencv|读取图像(四十六)使用cv2.bitwise_or()函数实现图像按位或运算-CSDN博客pythonopencv|读取图像(四十五)增加掩模:使用cv2.bitwise_and()函数实现图像按位与运算-CSDN博客

pythonopencv|读取图像(四十七)使用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】代码测试

参考前述学习进程中调用的代码,按照输入图像-按位异或-输出图像的顺序规划代码。

首先引入相关模块和图像:

python">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)

然后定义第二张图像和掩模矩阵:

python"># 定义第二个图像
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  # 竖直区域

然后执行按位异或计算:

python">#按位异或运算
img=cv.bitwise_xor(src,image) #异或运算
img2=cv.bitwise_xor(src,image,mask=mask) #异或运算

之后读取特定点BGR值进行按位异或计算验证:

python">#显示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) #输出矩阵

然后显示和保存图像:

python">#合并图像
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()函数实现图像带掩模矩阵按位异或计算的技巧。


http://www.ppmy.cn/server/165053.html

相关文章

SSH笔记

文章目录 SSH笔记一、远程登录相关命令二、SSH远程登录服务器认证过程三、两种认证方式安全性对比四、ssh远程连接配置文件4.1 配置文件位置4.2 客户端配置 SSH笔记 一、远程登录相关命令 远程登录命令ssh 一般格式ssh [-p port] [user]remotehost使用默认端口号22时&#xff…

C#面试常考随笔7:什么是匿名⽅法?还有Lambda表达式?

匿名方法本质上是一种没有显式名称的方法,它可以作为参数传递给需要委托类型的方法,常用于事件处理、回调函数等场景,能够让代码更加简洁和紧凑。 使用场景 事件处理:在处理事件时,不需要为每个事件处理程序单独定义…

循环神经网络(RNN)+pytorch实现情感分析

目录 一、背景引入 二、网络介绍 2.1 输入层 2.2 循环层 2.3 输出层 2.4 举例 2.5 深层网络 三、网络的训练 3.1 训练过程举例 1)输出层 2)循环层 3.2 BPTT 算法 1)输出层 2)循环层 3)算法流程 四、循…

五、定时器实现呼吸灯

5.1 定时器与计数器简介 定时器是一种通过对内部时钟脉冲计数来测量时间间隔的模块。它的核心是一个递增或递减的寄存器(计数器值)。如果系统时钟为 1 MHz,定时器每 1 μs 计数一次。 计数器是一种对外部事件(如脉冲信号&#xff…

【huawei】云计算的备份和容灾

目录 1 备份和容灾 2 灾备的作用? ① 备份的作用 ② 容灾的作用 3 灾备的衡量指标 ① 数据恢复时间点(RPO,Recoyery Point Objective) ② 应用恢复时间(RTO,Recoyery Time Objective) 4…

aws(学习笔记第二十七课) 使用aws API Gateway+lambda体验REST API

aws(学习笔记第二十七课) 使用aws API Gatewaylambda体验REST API 学习内容: 使用aws API Gatewaylambda 1. 使用aws API Gatewaylambda 作成概要 使用api gateway定义REST API,之后再接收到了http request之后,redirect到lambda进行执行。…

【PyQt】学习PyQt进行GUI开发从基础到进阶逐步掌握详细路线图和关键知识点

学习PyQt的必要性 PyQt是开发跨平台GUI应用的强大工具,适合需要构建复杂、高性能界面的开发者。无论是职业发展还是项目需求,学习PyQt都具有重要意义。 1. 跨平台GUI开发 跨平台支持:PyQt基于Qt框架,支持Windows、macOS、Linux…

【景区导游——LCA】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; const int N 1e5 10; const int M 2 * N; int p[N][18], d[N], a[N]; ll dis[N][18]; //注意这里要开long long int h[N], e[M], ne[M], idx, w[M]; int n, k; void add(int a, int b, …