opencv -11 图像运算之按位逻辑运算(图像融合图像修复和去除)

按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法,使用OpenCV的按位逻辑运算函数可以对图像进行位与(AND)、位或(OR)、位非(NOT)和位异或(XOR)等操作。

通俗点就是将像素点的十进制值转成二进制 来运算
在这里插入图片描述

以下是一些常见的按位逻辑运算的应用场景:

图像融合:按位逻辑运算可以用于图像融合,通过对两个图像进行位与、位或或位异或操作,可以实现图像的混合、叠加、过渡和融合效果。这在图像处理、特效制作和图像合成中常用于创建创意效果和特殊效果。

图像分割和掩膜:按位逻辑运算可以用于图像分割和掩膜操作。通过使用掩膜图像(二进制图像),可以通过位与运算提取图像中感兴趣的区域,或者通过位或运算将不同的图像部分进行组合。这在图像分析、目标提取和图像编辑中常用于区域选择和图像掩膜操作。

图像修复和去除:按位逻辑运算可以用于图像修复和去除。通过将损坏或缺失的区域与参考图像进行位与或位或运算,可以实现对损坏区域的修复或去除。这在图像修复、恢复和去噪中常用于修复缺失区域或去除不需要的内容。

图像处理和特征提取:按位逻辑运算可以用于图像处理和特征提取中的特定操作。例如,通过使用位异或运算,可以检测出两个图像之间的差异和变化。这在图像比较、图像匹配和特征提取等领域中常用于分析和检测图像之间的差异。

图像二值化和阈值操作:按位逻辑运算可以用于图像二值化和阈值操作。通过与二值掩膜图像进行位与运算,可以将图像中的像素根据阈值进行分割和二值化。这在图像分割、图像阈值化和图像二值化等领域中常用于分割图像和提取感兴趣的目标。

这些只是按位逻辑运算的一些常见应用场景,实际上,按位逻辑运算在图像处理和计算机视觉中具有广泛的应用。通过灵活运用按位逻辑运算,可以实现各种图像处理和分析的需求。

按位与运算

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

在这里插入图片描述
3-2 对与运算算子的不同情况进行了说明,表中使用“and”表示与运算。

在这里插入图片描述
在 OpenCV 中,可以使用 cv2.bitwise_and()函数来实现按位与运算,其语法格式为:
dst = cv2.bitwise_and( src1, src2[, mask]] )
式中:
 dst 表示与输入值具有同样大小的 array 输出值。
 src1 表示第一个 array 或 scalar 类型的输入值。
 src2 表示第二个 array 或 scalar 类型的输入值。
 mask 表示可选操作掩码,8 位单通道 array。

按位与操作有如下特点:
 将任何数值 N 与数值 0 进行按位与操作,都会得到数值 0。
 将任何数值 N(这里仅考虑 8 位值)与数值 255(8 位二进制数是 1111 1111)进行按位与操作,都会得到数值 N 本身。
可以通过表 3-4 观察数值 N(表中是 219)与特殊值 0 和 255 进行按位与运算的结果。

在这里插入图片描述
根据上述特点,可以构造一幅掩模(具体后面会讲到什么是掩膜)图像 M,掩模图像 M 中只有两种值:一种是数值 0,另外
一种是数值 255。将该掩模图像 M 与一幅灰度图像 G 进行按位与操作,在得到的结果图像 R 中:
 与掩模图像 M 中的数值 255 对应位置上的值,来源于灰度图像 G。
 与掩模图像 M 中的数值 0 对应位置上的值为零(黑色)。

下面使用数组演示与掩模图像的按位与运算

import cv2
import numpy as np
#定义一个5行5列的随机数组,数据类型为 uint8
a=np.random.randint(0,255,(5,5),dtype=np.uint8)
#定义一个5行5列的全零数组,数据类型为 uint8
b=np.zeros((5,5),dtype=np.uint8)
#将数组 b 的第 1 行到第 3 行、第 1 列到第 3 列的元素设置为 255
b[0:3,0:3]=255
#将数组 b 的第 5 行、第 5 列的元素设置为 255
b[4,4]=255
#位与运算
c=cv2.bitwise_and(a,b)
print("a=\n",a)
print("b=\n",b)
print("c=\n",c)

运行结果:

a=
 [[218  43  29 157 202]
 [ 22 109 168  88 136]
 [208 114 177  23   8]
 [ 17 245 173  96 137]
 [136 127 200 179  25]]
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=
 [[218  43  29   0   0]
 [ 22 109 168   0   0]
 [208 114 177   0   0]
 [  0   0   0   0   0]
 [  0   0   0   0  25]]

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

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

下面我们用图片来构造一个掩模图像,使用按位与运算保留图像中被掩模指定的部分

import cv2
import numpy as np
a=cv2.imread("lena.png",0)
#将 a 的像素值全部设置为 0,及黑色
b=np.zeros(a.shape,dtype=np.uint8)
#将 b 的这个roi 区域 的像素值全部设置为 255,及白色
b[100:400,200:400]=255
#将 b 的这个roi 区域 的像素值全部设置为 255,及白色
b[100:500,100:200]=255
#将 a 和 b 进行按位与运算,得到图像 c
c=cv2.bitwise_and(a,b)

cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述

运行上述程序,输出结果 左图是原始图像 lena,中间的图是掩模图像,右图是按位与结果图像,可以看到,被掩模指定的头部图像被保留在了运算结果中。

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

a=cv2.imread("lena.png",0) 中的0 改成1 

整体代码如下:


import cv2
import numpy as np
a=cv2.imread("lena.png",1)
b=np.zeros(a.shape,dtype=np.uint8)
b[100:400,200:400]=255
b[100:500,100:200]=255
c=cv2.bitwise_and(a,b)
print("a.shape=",a.shape)
print("b.shape=",b.shape)
print("c.shape=",c.shape)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.imshow("c",c)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

i.MX6ULL(十六) linux 设备驱动

一 简介 Linux设备驱动是指驱动Linux内核与硬件设备进行通信的软件模块。设备驱动通常分为两类:字符设备驱动和块设备驱动。 设备驱动的主要功能包括: 设备初始化:在系统启动时,设备驱动需要初始化相应的硬件设备,设…

8、链路层以太网协议,ARP协议32

网络层IP协议描述了通信中的起点到终点,但是数据不是飞过去的,是经过了大量的中间节点转发完成的。 一、以太网协议 1、MAC地址 物理硬件地址,是每一块网卡在出厂时设定的地址,固定且不可修改(早期,现在可…

密码学学习笔记(十五):ECDSA - 椭圆曲线数字签名算法

椭圆曲线数字签名算法是DSA的一种椭圆曲线变体,它发明的初衷只是避免使用Schnorr签名的专利。椭圆曲线数字签名算法依赖于验证器中的私钥和主机用于验证验证器的公钥。它的缺点和DSA一样,它也没有提供安全性证明。 椭圆曲线算法 DSS(数字签…

【Vue面试题系列】四

VNode有哪些属性? Vue内部定义的Vnode对象包含了以下属性: __v_isVNode: true,内部属性,有该属性表示为Vnode __v_skip: true,内部属性,表示跳过响应式转换,reactive转换时会根据此属性进行判断…

Django实现接口自动化平台(十四)测试用例模块Testcases序列化器及视图【持续更新中】

相关文章: Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: python django…

一条命令解决端口占用,开启mysql

注:最后有面试挑战,看看自己掌握了吗 文章目录 端口占用开启mysql 端口占用 如果发现 8080 端口被占用可以使用命令 sudo lsof -t -i:8080 | sudo xargs kill -9 查找并杀死相应的进程。 开启mysql 打开命令提示符或终端。如果您已经安装了MySQL&…

Cesium Terrain Builder (CTB) 简单使用_地形切片

Cesium Terrain Builder (CTB) 简单使用_地形切片 目录 Cesium Terrain Builder (CTB) 简单使用_地形切片 官网地址: winr(cmd)打开命令提示符工具运行: Create a GDAL Virtual Dataset (optional) Create Cesium Terrain fi…

EasyCVR视频融合平台能正常播放其他协议流,但无法播放HLS流的原因排查

EasyCVR基于云边端一体化架构,支持海量视频汇聚管理,平台支持多协议与多类型设备接入,具体包括国标GB28181、RTMP、RTSP/Onvif、海康Ehome、海康SDK、大华SDK、宇视SDK等,能对外分发RTMP、RTSP、HTTP-FLV、WS-FLV、HLS、WebRTC等。…

部署langchain+chatglm

先参考:window零基础部署langchain-ChatGLM_飞奔的屎壳郎的博客-CSDN博客 安装一部分, 1.GCC安装 gcc64位下载 一定要装64位的gcc,因为我的电脑是w10 64位的,装32位运行langchain报错并配置环境变量 可直接用压缩包中的文件&am…

八股文(消息队列)

文章目录 1. RabbitMQ特点2. 如何保证消息的可靠性3. RabbitMQ消息的顺序性4. 实现RabbitMQ的高可用性5. 如何解决消息队列的延时以及过期失效问题?6. RabbitMQ死信队列7. RabbitMQ延迟队列8.RabbitMQ的工作模式9. RabbitMQ消息如何传输10. 核心概念10.1 生产者和消…

python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)

简介 上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其实很简单,就是…

python_day11_pymysql

SQL基础语法回忆 show DATABASES;use world;-- SELECT DATABASES();show TABLES;CREATE TABLE Student(id int,name VARCHAR(10),age int,gender VARCHAR(5) );删除表 # 删除表 DROP TABLE Student;插入操作 insert into student(id) VALUES(1),(2),(3);insert i…

HTML+CSS+JavaScript:渲染柱形统计图

一、需求 用户输入四个季度的数据&#xff0c;根据数据生成柱形统计图&#xff0c;浏览器预览效果如下 二、完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content&q…

vue-sticky简单使用(实现吸顶效果)

参考链接 vue-sticky&#xff1a;在页面滚动时将指定元素固定在窗口上的某个位置 生效条件如下&#xff1a; 1、父元素不能设置 overflow:hidden 或者 overflow:auto 属性 2、至少指定 top 、bottom 、left 、right 4 个值中的一个&#xff0c;否则只会处于相对定位 3、父元素…

云曦期末复现

serialize 代码审计&#xff0c;给1传参&#xff0c;满足password的值为yunxi&#xff0c;那么反序列化前就会执行__wakeup函数&#xff0c;从而得到flag.php&#xff0c;但是password的值被定死为1&#xff0c;利用PHP反序列化的字符逃逸: <?php error_reporting(0); hig…

android studio 离线打包配置push模块

1.依赖引入 SDK\libs aps-release.aar, aps-unipush-release.aar, gtc.aar, gtsdk-3.2.11.0.aar, 从android studio的sdk中找到对应的包放到HBuilder-Integrate-AS\simpleDemo\libs下面 2.打开build.gradle&#xff0c;在defaultConfig添加manifestPlaceholders节点&#xff0c…

【数据结构导论】第 7 章:排序

目录 一、概述 &#xff08;1&#xff09;基本概念 &#xff08;2&#xff09;排序分类 &#xff08;3&#xff09;排序文件的物理表示 —— 数组表示 二、插入排序&#xff08;通过比较插入实现排序&#xff09; &#xff08;1&#xff09;直接插入排序 ① 过程 ② 算…

SqlServer数据库【基础-更删改查】

一、创建语句 &#xff08;1&#xff09;创建数据库 1.检查系统中是否存在这个数据库&#xff0c;存在则删除 格式&#xff1a; if exists(select * from sysdatabases where name数据库名) drop database 数据库名 go例子&#xff1a; if exists(select * from sysdataba…

C 知识积累 替换gets函数 Linux C 语法分析 switch和if else的比较

目录 替换gets函数gets()用处gets()的危险之处gets()的几种替代方法一、用%c循环输入直到遇到换行结束二、用getchar()循环输入直到遇到换行结束三、scanf的另一种用法四、c中的getline()方法五、解决方案使用fgets代替 回车与换行一.知其然二.知其所以然 关键字&#xff0c;操…

BI-SQL丨XML

XML SQL Server中&#xff0c;存在一种特殊类型的数据&#xff0c;就是XML数据类型。 可能看到这里&#xff0c;小伙伴都会产生疑惑&#xff0c;XML不是Web语言么&#xff1f;为什么在SQL Server里面也会有XML数据类型&#xff1f; 这个就要从SQL Server的应用开始说起了&am…