opencv 轻松入门 面向python pdf_面向Python 的OpenCV轻松入门——第三章(3)

2023-11-03

3.3 按位逻辑运算

 逻辑运算是一种非常重要的运算方式,图像处理过程中经常要按照位进行逻辑运算,本节 介绍 Opencv中的按位逻辑运算,简称位运算。

 在 Opencv内,常见的位运算函数如表3-1所示

表3-1 常见的位运算函数

函数名 基本含义
cv2.bitwise_and() 按位与
cv2.bitwise_or() 按位或
cv2.bitwise_xor() 按位异或
cv2.bitwise_not() 按位取反

3.3.1按位与运算

 在与运算中,当参与与运算的两个逻辑值都是真时,结果才为真。其逻辑关系可以类比图3-4所示的串联电路,只有当两个开关都闭合时,灯才会亮.

9427eb7d7e137ca335cfffa4e9485b4b.png
图3.4 与运算电路

表3-2对与运算算子的不同情况进行了说明,表中使用“and”表示与运算。

573d04d052c3db1810ce276d58fd7403.png
表3-2 与运算

按位与运算是指将数值转换为二进制值后,在对应的位置上进行与运算。例如,表3-3展了两个数值进行按位与运算的示例。

0497da4f4495946e7bc6a6de9583a5bc.png
表3-3 按位与运算

在 Opencv中,可以使用cv2.bitwise_and()函数来实现按位与运算,其语法格式为

dst =cv2.bitwise_and( srcl, src2 [, mask])

式中:

  • dst表示与输入值具有同样大小的aray输出值。
  • srcl表示第一个aray或 scalar类型的输入值。
  • src2表示第二个aray或 scalar类型的输入值。
  • mask表示可选操作掩码,8位单通道aray.

按位与操作有如下特点:

  • 将任何数值N与数值0进行按位与操作,都会得到数值0.
  • 将任何数值N(这里仅考虑8位值)与数值255(8位二进制数是11111)进行按位与操作,都会得到数值N本身。

可以通过表3-4观察数值N(表中是219)与特殊值0和255进行按位与运算的结果。

397d2ab8f8a099db9955c70914825d87.png
表3-4 与特殊值0和255进行按位与运算

根据上述特点,可以构造一幅掩模图像M,掩模图像M中只有两种值:一种是数值0,另外种是数值255.将该掩模图像M与一幅灰度图像G进行按位与操作,在得到的结果图像R中:

  • 与掩模图像M中的数值255对应位置上的值,来源于灰度图像G。
  • 与掩模图像M中的数值0对应位置上的值为零(黑色)。

第13章将从另外一个角度对上述情况进行说明,以帮助大家更好地理解掩模及处理方式。

【例3.7】使用数组演示与掩模图像的按位与运算。

 根据题目要求,编写代码如下:

import cv2
import numpy as np
a=np.random.randint(0, 255, (5, 5), dtype=np.uint8)
b=np.zeros((5, 5), dtype=np.uint8)
b[0:3,0:3]=255
b[4,4]=255
c=cv2.bitwise_and(a, b)
print("a=\n",a)
print ("b=\n",b)
print("c=\n",c)

运行上述程序,输出结果如下:

a=
[[ 17 161 75 89 107]
[215 212 111 215 14]
[173 53 82 147 244]
[172 153 128 63 68]
[173 70 188 16 148]]
b=
[[255 255 255 0 0]
[255 255 255 0 0]
[255 255 255 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 255]]
c=
[[ 17 161 75 0 0]
[215 212 111 0 0]
[173 53 82 0 0]
[ 0 0 0 0 0]
[ 0 0 0 0 148]]

从程序可以看出,数组c来源于数组a与数组b的按位与操作。运算结果显示,对于数组c内的值,与数组b中数值255对应位置上的值来源于数组a:与数组b中数值0对应位置上的值为0.

【例3.8】构造一个掩模图像,使用按位与运算保留图像中被掩模指定的部分。

在本例中,我们构造一个掩模图像,保留图像lena的头部.

根据题目要求,编写代码如下:

import cv2
import numpy as np
a = cv2.imread("C://Users//25708//Pictures//picture//1 (1059).jpg")
b=np.zeros(a.shape, dtype=np.uint8)
b[50:350,200:400]=255
b[50:500,100:200]=255
c=cv2.bitwise_and(a, b)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()
1ee93da157a38aea12eacf46c7a8b9d7.png
例3-5 【例3.8】程序的运行结果

除了需要对灰度图像进行掩模处理,还经常需要针对BGR模式的彩色图像使用掩模提取指定部分。由于按位与操作要求参与运算的数据有相同的通道,所以无法直接将彩色图像与单通道的掩模图像进行按位与操作。一般情况下,可以通过将掩模图像转换为BGR模式的彩色图像,让彩色图像与掩模图像进行按位与操作,实现掩模运算。

【例3.9】构造一个掩模图像,使用按位与操作保留图像内被掩模所指定的部分。

根据题目要求,编写代码如下:

import cv2
import numpy as np
a = cv2.imread("C://Users//25708//Pictures//picture//1 (1060).jpg",1)
b=np.zeros(a.shape, dtype=np.uint8)
b[50:350,200:400]=255
b[50:500,100:200]=255
c=cv2.bitwise_and(a, b)
cv2.imshow("a", a)
cv2.imshow("b", b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

运行上述程序,输出结果如图3-6所示,其中左图是原始图像,中间的图是掩模图像,右图是原始图像和掩模图像按位与后提取的图像。

a085851501bed19ef5e07efb2187cf1a.png
例3-6 【例3.9】程序的运行结果

同时,程序还会显示如下结果

a.shape= (355, 500, 3)
b.shape= (355, 500, 3)

3.3.2按位或运算

 或运算的规则是,当参与或运算的两个逻辑值中有一个为真时,结果就为真。其逻辑关系可以类比为如图3-7所示的并联电路,两个开关中只要有任意一个闭合时,灯就会亮。

5b9c91ae2cbb36554f9cdaece65b93f8.png
图3-7 或运算类比电路图

表3-5对参与或运算的算子的不同情况进行了说明,表中使用“or”表示或运算

81f612aad0ffbd5b846ed5319abf2eed.png
表3-5 或运算

按位或运算是指将数值转换为二进制值后,在对应的位置上进行或运算。例如,表3-6展示了两个数值进行按位或运算的示例。

95893f88088df2f2096036cb26df7dde.png
表3-6 按位或运算

在 Opencv中,可以使用cv2.bitwise_or()函数来实现按位或运算,其语法格式为:

dst =cv2.bitwise_or( srcl, src2 [, mask])

式中

  • dst表示与输入值具有同样大小的aray输出值。
  • srcl表示第一个aray或 scalar类型的输入值。
  • src2表示第二个aray或 scalar类型的输入值
  • mask表示可选操作掩码,8位单通道aray值。

3.3.3按位非运算

非运算是取反操作,满足如下逻辑

  • 当运算数为真时,结果为假。
  • 当运算数为假时,结果为真。

表3-7对参与运算算子的不同情况进行了说明,表中使用“not”表示非运算。

2cbfdf4b5441f9f5b2c3b3dc31002076.png
表3-7 非运算

按位非运算是指将数值转换为二进制值后,在对应的位置上进行非运算。例如,表3-8展示了按位非运算的示例。

c05687b522795bb856164bed130b6021.png
表3-8 按位非运算

在 Opencv中,可以使用函数cv2.bitwise_not()来实现按位取反操作,其语法格式为

dst = cv2.bitwise_not(src[, mask]])

式中:

  • dst表示与输入值具有同样大小的 array输出值
  • src表示aray类型的输入值。
  • mask表示可选操作掩码,8位单通道aray值

3.3.4按位异或运算

 异或运算也叫半加运算,其运算法则与不带进位的二进制加法类似,其英文为“ exclusiveOR",因此其函数通常表示为xor.

表3-9对参与异或运算的算子的不同情况进行了说明,其中“xor”表示异或运算。

080f45caf4caa09be4d2aca64cc79c2f.png
表3-9 异或运算

按位异或运算是指将数值转换为二进制值后,在对应的位置上进行异或运算。例如,表3-10展示了两个数值进行按位异或运算的示例。

32fcfe7773429654c0018a3dfa386085.png
表3-10 按位异或运算

在 Opencv中,可以使用函数cv2.bitwise_xor()来实现按位异或运算,其语法格式为:

dst =cv2.bitwise_xor( srcl, src2[, mask]])

式中:

  • dst表示与输入值具有同样大小的aray输出值。
  • srcl表示第一个aray或 scalar类型的输入值。
  • src2表示第二个aray或 scalar类型的输入值。
  • mask表示可选操作掩码,8位单通道aray值。
f57d953e33aecba2ff8d5b9d7a6542cf.gif a82c38d7202291d93be66cc0a5dc0a22.png

joker-wt

扫码|关注我

微信号|joker-wt123

新浪微博|梧tw桐

承蒙关照!!!

我的心愿是——世界和平!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv 轻松入门 面向python pdf_面向Python 的OpenCV轻松入门——第三章(3) 的相关文章

  • WLAN配置

    SW1 sysname SW1 修改名称 undo info center enable 关闭提示 vlan batch 100 to 102 批量创建vlan 100 101 102 interface GigabitEthernet0
  • Ethereum geth 同步区块的三种模式

    Ethereum 以太坊 当前交易多 截止当前 2018 02 04 已经有5029238个区块 区块大小在150G左右 如果全部同步 并且严格逐个验证 需要太多的时间和计算 作者曾经用一台实体机 8核 16GB内存 2TB机械硬盘的del
  • leetcode1921.消灭怪物的最大数量(中等)

    解法 排序 贪心 具体 计算出每个怪物到达城市的时间 然后排序 class Solution public int eliminateMaximum vector
  • 深度学习论文笔记(可解释性)——CAM与Grad-CAM

    文章目录 主要工作 Global Average Pooling的工作机制 CAM Grad CAM 主要工作 CAM与Grad CAM用于解释CNN模型 这两个算法均可得出 c l a s s
  • 【JVM】Java垃圾回收机制(GC)详解

    Java垃圾回收机制 GC 详解 一 为什么需要垃圾回收 如果不进行垃圾回收 内存迟早都会被消耗空 因为我们在不断的分配内存空间而不进行回收 除非内存无限大 我们可以任性的分配不回收 但是事实并非如此 所以 垃圾回收是必须的 二 哪些内存需
  • 【kali】kali环境下安装dvwa

    STEP1 从github下载dvwa git clone https github com ethicalhack3r DVWA Q 我要自己安装git吗 A kali不用啦 一般都自带有 但是普通的ubuntu和debian上是没有的哦
  • Eclipse4.3 swt 插件在线安装

    到eclipse官网下载swt插件 1 点击该网站主菜单 Downloads gt Project 在出现的插件列表中找到 WindowBuilder 并点击 出现如下网页 复制该链接地址 当然该网页讲的就是如何安装swt designer
  • MATLAB地理数据处理 25:植被物候提取及分析模型优化(Savitzky-Golay)

    物候提取模型优化 1 前提 2 MATLAB代码 1 前提 之前我写过一篇使用Savitzky Golay处理遥感数据 获取地面物候信息的MATLAB代码 Python地理数据处理 十七 植被物候提取和分析 Savitzky Golay 但
  • MySQL数据表的约束

    数据表约束 对于某一列的值能添加哪些内容做了一定的限制 这种限制的手段就称为约束 一 约束的类型 NOT NULL 指示某列不能存储 NULL 值 UNIQUE 保证某列的每行必须有唯一的值 DEFAULT 规定没有给列赋值时的默认值 PR
  • Visual Studio 2022编译CMake工程

    用VS2022打开CMakeLists txt文件所在的文件夹 配置缓存 生成完毕 选择启动项 调试启动 运行输出 进入CMake项目视图 启动参数设置 增加args
  • Dll 编程入门指南

    我正在 学习 DLLs 谈不上对其有什么高屋建瓴的见解 本文只是 通过 编码让你看到并想知道代码是如何运行的 在本文中 我假定你知道如何使用你的编译器特性 比如设置目录路径等等 为了建立项目 请选择Win32 控制台项目 Win32 Con
  • 飞机游戏初步

    步骤 1 创建 hellogame项目 tools gt cocos2d console gt bin gt shift 右键 gt 在此处打开命令窗口 gt 路径pythoncocos py new hellogame p com gam
  • 一文说透 MySQL JSON 数据类型(收藏)

    JSON 数据类型是 MySQL 5 7 8 开始支持的 在此之前 只能通过字符类型 CHAR VARCHAR 或 TEXT 来保存 JSON 文档 相对字符类型 原生的 JSON 类型具有以下优势 在插入时能自动校验文档是否满足 JSON
  • 【日志脱敏】Springboot集成日志框架脱敏实战

    针对日志打印而不能泄露用户隐私需求 需要利用相应日志框架实现脱敏 本文基于log4j logback 重写相应方法 匹配出正则并转换为脱敏后的日志 效果展示如下 name 李 idNumber 110106 226X mobile 130
  • Scala编译器的安装

    1 Scala编译器安装 1 1 安装JDK 因为Scala是运行在JVM平台上的 所以安装Scala之前要安装JDK 1 2 安装Scala 1 2 1 Windows安装Scala编译器 访问Scala官网http www scala
  • 两个有序数组合并成一个有序数组——C++实现

    程序分析 这里做的是升序 C 代码 include
  • 如何监控Android模拟器的HTTP访问情况

    前几个月 在调试某个应用时 需要监控应用与服务器之间的HTTP通讯 从搜索引擎找到的方案几乎全错 要么是人云亦云 要么是只能满足旧的平台版本 要么根本就是臆测 不得其解之际 用比较复杂的方法解决了 昨天想起来 觉得太过窝囊 于是重整旗鼓 终
  • react-节点更新与销毁

    文章目录 更新与销毁 节点更新 对比更新 找到了对比目标 没有找到对比目标 更新与销毁 发生更新的场景 重新调用ReactDOM render 触发根节点更新 在类组件中调用setState 会导致该节点更新 节点更新 分为两种 如果调用的
  • Linux学习命令

    cd ls mkdir rmdir rm touch 创建文件 cat 显示文件内容 不适合查看内容较长的文件 n 显示行号 cat n etc issue tac 和cat类似 但是是倒过来显示 more 分页显示文件内容 空格 或f 翻

随机推荐

  • 【CLYZ集训】马可波罗【按位】【博弈论】

    题目大意 有两个人 n n n堆石子 每个人轮流取 每次可以取1 x x x个 最后没得取的人输 两人都采取最优策略 问对于 x
  • 双目视觉标定MATLAB

    双目标定 双目摄像机需要标定的参数 摄像机内参数矩阵 畸变系数 两相机之间的旋转矩阵 R 和平移矩阵 T 其中摄像机内参数矩阵和畸变系数矩阵可以通过单目标定的方法标定出来 双目摄像机标定和单目摄像机标定最主要的区别就是双目摄像机需要标定出左
  • oracle自定义函数function

    遇到的问题 遇到一个数据统计的需求 要求 统计身份证号码性别位填写错误的个数 首先普及身份证性别位 至今为止身份证有18位和15位两种 18位身份证号性别位是17位 第17位数字奇数为男性 偶数为女性 0也是女性 15位身份证号性别位是最后
  • springboot AOP日志

    引入项目依赖
  • STM32单片机,UART的寄存器配置以及工作原理

    UART是重要的片上资源 主流单片机基本上都有该功能 通过UART可以扩展出很多的通信接口 如RS232 RS485 LIN 甚至WIFI 蓝牙模组等 可以说只要搞通讯就会涉及到UART 下面和大家分享STM32的UART配置 1 UART
  • CF1604C Di-visible Confusion

    CF传送门 早上起来看一下昨天的cf div2 后悔昨天没打了 本题是一道很水的思维题 题目的大意就是说 如果选择序列 a a a的第 i i i位 如果 a
  • C语言计算代码执行时间的办法

    在Linux下 sleep 单位为秒 usleep 里面的单位是微秒 在Windows系统中 sleep 单位为毫秒 有两个和计算执行时间相关的函数 在调试分析性能的时候 我们经常需要检查一段代码执行花了多少时间 下面的例子说明在C语言里面
  • OpenCV各个模块介绍

    对于初学opencv的我来说 最头疼和无法下手的就是 都有什么库 那些库都是干什么的 怎么用 我想很多人应该和我一样 我觉得最重要的就是需要先知道opencv有哪些库 都是干什么的 在我们安装opencv的地址下 可以看到opencv2中包
  • 使用rpm包搭建Glusterfs集群

    使用rpm搭建Glusterfs集群步骤 一 环境准备 1 准备搭建glusterfs所需的rpm包 centos release gluster6 1 0 1 el7 centos noarch rpm centos release st
  • mysql中空值和null值的区别及处理方法总结

    一直对空值和null值的概念理解不清晰 所以结合资料以及自己的理解对他们的区别和处理方式进行总结 首先就是在概念上的不同 1 空值不占空间 2 null值占空间 打个比喻就是空值表示一个杯子是真空状态 什么都没有 而null值是杯子中有空气
  • Java 8 中的抽象类和接口到底有啥区别?

    在我们面试时也会经常遇到面试官问抽象类和接口的区别是什么 大部人肯定会说 接口中的所有方法都是抽象的 抽象类中的方法除了抽象方法还可以写实现方法 如果你还这样回答那你就 OUT 啦 要跟上形式 这个问题我在面试一个 39 岁的程序员时 他居
  • Redis配置文件解读

    转载自 http www cnblogs com daizhj articles 1956681 html 对部分配置选项做了一些说明 把配置项目从上到下看了一遍 有了个大致的了解 暂时还用不到一些高级的配置选项 先放在这 用到的时候再回来
  • Teradata SQL 线性回归函数

    基于budget amounts排队得到前三个部门 显示部门号和预算 SELECT department number salary amount RANK salary amount AS Rank FROM dapartment QUA
  • Typescript(九)配置文件 tsconfig.json

    TypeScript 使用 tsconfig json 文件作为其配置文件 当一个目录中存在 tsconfig json 文件 则认为该目录为 TypeScript 项目的根目录 通常 tsconfig json 文件主要包含两部分内容 指
  • unity

    一 理解我们要做的事 原本图片放入文件夹后是Default 默认 模式 但是需要大量处理图片的时候 我们希望它拖进去就是sprite模式 我们想修改unity原本的功能 二 unity是允许我们去修改它本身的一些功能的 你可以定制属于你的u
  • JVM系列(十) 垃圾收集器之 Parallel Scavenge/Old

    上篇文章我们讲解了单线程垃圾收集器 Serial SerialOld 与之相对应的多线程垃圾收集器就是 Parallel Scavenge Old 本文我们讲解下多线程垃圾收集器 Parallel Scavenge Old 垃圾收集器 新生
  • 2018年TI杯电子设计竞赛感悟

    2018年7月27日 电赛结束已经有三四天的时间了 今年的感悟和去年的相比很是不同 去年大一 刚刚入门单片机 搞点东西也都是瞎搞 没有一个像模像样的作品 即使是有也都是一些次品 半成品 得知学校选拔学生参加全国大学生电子设计竞赛 单数年为国
  • linux添加sshkey,linux 配置 ssh密钥登陆

    配置这个其实很简单 一点也不复杂 首先需要在服务器安装openssh 如果你不安装你是找不到配置密钥登陆的配置文件的 yum install y openssh 安装好后就需要去配置密钥登陆了 vi etc ssh sshd config
  • kali持久化U盘镜像安装教程

    https zhuanlan zhihu com p 436210497 utm id 0
  • opencv 轻松入门 面向python pdf_面向Python 的OpenCV轻松入门——第三章(3)

    3 3 按位逻辑运算 逻辑运算是一种非常重要的运算方式 图像处理过程中经常要按照位进行逻辑运算 本节 介绍 Opencv中的按位逻辑运算 简称位运算 在 Opencv内 常见的位运算函数如表3 1所示 表3 1 常见的位运算函数 函数名 基