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

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

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

相关文章

使用vhd虚拟磁盘安装两个win10系统

使用vhd虚拟磁盘安装两个win10系统 前言vhd虚拟磁盘技术简介准备工具开始动手实践1.winX选择磁盘管理2.选择“操作”--“创建VHD”3.自定义一个位置,输入虚拟磁盘大小4.右键初始化磁盘5.选择GPT分区表格式6.右键新建简单卷7.给卷起个名字,用于区分8.打开…

基于云计算、大数据与YOLO设计的火灾/火焰目标检测

摘要:本研究针对火灾早期预警检测需求,采用在Kaggle平台获取数据、采用云计算部署的方式,以YOLOv11构建模型,使用云计算服务器训练模型。经训练,box loss从约3.5降至1.0,cls loss从约4.0降至1.0&#xff0c…

计算机毕业设计Python+CNN卷积神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习

温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…

小程序-基础加强-自定义组件

前言 这次讲自定义组件 1. 准备今天要用到的项目 2. 初步创建并使用自定义组件 这样就成功在home中引入了test组件 在json中引用了这个组件才能用这个组件 现在我们来实现全局引用组件 在app.json这样使用就可以了 3. 自定义组件的样式 发现页面里面的文本和组件里面的文…

docker安装emqx

emqx安装 拉取emqx镜像 docker pull emqx/emqx:v4.1.0 运行docker容器 docker run -tid --name emqx -p 1883:1883 -p 8083:8083 -p 8081:8081 -p 8883:8883 -p 8084:8084 -p 18083:18083 emqx/emqx:v4.1.0 放行端口 1、如果要是自己的虚拟机,并且关闭了防火墙&a…

【4Day创客实践入门教程】Day4 迈向高手之路——进一步学习!

Day4 迈向高手之路——进一步学习! 目录 Day4 迈向高手之路——进一步学习!更多的开发板外壳制作 Day0 创想启程——课程与项目预览Day1 工具箱构建——开发环境的构建Day2 探秘微控制器——单片机与MicroPython初步Day3 实战演练——桌面迷你番茄钟Day4…

深度学习之“缺失数据处理”

缺失值检测 缺失数据就是我们没有的数据。如果数据集是由向量表示的特征组成,那么缺失值可能表现为某些样本的一个或多个特征因为某些原因而没有测量的值。通常情况下,缺失值由特殊的编码方式。如果正常值都是正数,那么缺失值可能被标记为-1…

日志收集Day007

1.配置ES集群TLS认证: (1)elk101节点生成证书文件 cd /usr/share/elasticsearch ./bin/elasticsearch-certutil cert -out config/elastic-certificates.p12 -pass "" --days 3650 (2)elk101节点为证书文件修改属主和属组 chown elasticsearch:elasticsearch con…

arm-linux-gnueabihf安装

Linaro Releases windows下打开wsl2中的ubuntu,资源管理器中输入: \\wsl$gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 复制到/home/ark01/tool 在 Ubuntu 中创建目录: /usr/local/arm,命令如下: …

LabVIEW透镜多参数自动检测系统

在现代制造业中,提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统,该系统能够在单一工位上完成透镜的多项质量参数检测,并实现透镜的自动搬运与分选,极大地提升了检…

【算法】动态规划专题① ——线性DP python

目录 引入简单实现稍加变形举一反三实战演练总结 引入 楼梯有个台阶,每次可以一步上1阶或2阶。一共有多少种不同的上楼方法? 怎么去思考? 假设就只有1个台阶,走法只有:1 只有2台阶: 11,2 只有3台…

C++11(中)

新增默认成员函数 C11之前,默认成员函数有六个,构造函数,析构函数,拷贝构造,拷贝赋值重载,取地址重载,const 取地址重载。 C11增加了 移动构造 和 移动赋值重载 如果类没有实现移动构造&…

强化学习笔记——4策略迭代、值迭代、TD算法

基于策略迭代的贝尔曼方程和基于值迭代的贝尔曼方程,关系还是不太理解 首先梳理一下: 通过贝尔曼方程将强化学习转化为值迭代和策略迭代两种问题 求解上述两种贝尔曼方程有三种方法:DP(有模型),MC&#xff…

计算机网络 笔记 网络层 3

IPv6 IPv6 是互联网协议第 6 版(Internet Protocol Version 6)的缩写,它是下一代互联网协议,旨在解决 IPv4 面临的一些问题,以下是关于 IPv6 的详细介绍: 产生背景: 随着互联网的迅速发展&…

【搜索回溯算法篇】:拓宽算法视野--BFS如何解决拓扑排序问题

✨感谢您阅读本篇文章,文章内容是个人学习笔记的整理,如果哪里有误的话还请您指正噢✨ ✨ 个人主页:余辉zmh–CSDN博客 ✨ 文章所属专栏:搜索回溯算法篇–CSDN博客 文章目录 一.广度优先搜索(BFS)解决拓扑排…

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张:纸张大小:宽度/高度→页边距:上下左右→版式:页眉页脚→文档网格:勾选只指定行网格✔→ 每页:…

视频脚本生成器(基于openai API和streamlit)

utils.py: # 所有和ai交互的代码放进utils.py里(utils 通常是 “utilities” 的缩写,意为 “实用工具” 或 “实用函数”)from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from lan…

Android --- CameraX讲解

预备知识 surface surfaceView SurfaceHolder surface 是什么? 一句话来说: surface是一块用于填充图像数据的内存。 surfaceView 是什么? 它是一个显示surface 的View。 在app中仍在 ViewHierachy 中,但在wms 中可以理解为…

Longformer:处理长文档的Transformer模型

Longformer:处理长文档的Transformer模型 摘要 基于Transformer的模型由于自注意力操作的二次复杂度,无法处理长序列。为了解决这一限制,我们引入了Longformer,其注意力机制与序列长度呈线性关系,使其能够轻松处理数…

python学opencv|读取图像(五十二)使用cv.matchTemplate()函数实现最佳图像匹配

【1】引言 前序学习了图像的常规读取和基本按位操作技巧,相关文章包括且不限于: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(四十九)原理探究:使用cv2.bitwise()系列函数实现图像按位运算-CSDN博客…