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

news2025/2/1 7:23:24

按位逻辑运算是一种对图像进行像素级别的逻辑操作的方法,使用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.coloradmin.cn/o/762783.html

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

相关文章

Java NIO 和 AIO 总结

title: Java NIO 和 AIO 总结 date: 2023-05-10 13:21:26 tags: NIOAIO categories:开发知识及其他 cover: https://cover.png feature: false 1. NIO Java NIO (New IO) is an alternative IO API for Java, meaning alternative to the standard Java IO and Java Networkin…

Unity Arduino 串口通信

一、Unity端发送消息&#xff0c;Arduino端接收消息 通过串口通信 Arduino端 #include <Arduino.h>#define PIN_KEY 5 uint item;void setup() {item 0;Serial.begin(115200);pinMode(PIN_KEY, OUTPUT); }void loop() {if(Serial.available()>0){item Serial.rea…

跨网络的通信过程、路由的作用以及默认网关

如下网络拓扑图&#xff0c;交换机0所在的网段为192.168.1.0/24&#xff0c;交换机1所在网段为192.168.2.0/24&#xff0c;且各自有2台主机&#xff1a; 假设PC0&#xff08;192.168.1.10/32&#xff09;要跟PC4&#xff08;192.168.2.11/32&#xff09;通信&#xff0c;如何实…

上海亚商投顾:沪指缩量调整 3D打印概念股逆势大涨

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数今日缩量调整&#xff0c;午后一度均跌超1%&#xff0c;尾盘跌幅略有收窄&#xff0c;保险等权重板块走低…

【中危】Apache Airflow ODBC Provider 远程代码执行漏洞

漏洞描述 Apache Airflow 是一个开源的任务和工作流管理平台&#xff0c;ODBC Provider 是 Apache Airflow 的一个数据库管理/插件。 Apache Airflow ODBC Provider 受影响版本中&#xff0c;由于 odbc.py#driver 方法未对用户可控的 ODBC 驱动程序参数(driver)有效过滤&…

vue - 常见的性能优化

文章目录 vue使用中常见的性能优化1&#xff0c; v-for 遍历避免同时使用 v-if2&#xff0c; 如果需要使用v-for给每项元素绑定事件时 可以使用事件代理**3&#xff0c; 一些数据不做响应式4&#xff0c;一些页面采用keep-alive缓存组件5&#xff0c;第三方UI库按需导入6&#…

Selenium如何定位动态元素?

在经常做自动化过程中&#xff0c;我们没有打开新页面、没有alert、没有frame、加了挺好的等待时间&#xff0c;但是还是定位不到元素&#xff1f;很有可能是你要定位的元素的属性是动态的&#xff0c;即每次打开页面&#xff0c;这个元素的id或者class等元素属性是动态生成的。…

低代码平台缓解了程序员日渐不足的尴尬局面

编者按&#xff1a;如今即便是编程语言学习难度的降低&#xff0c;也不足以跟上计算机应用的快速发展&#xff0c;为了提高软件开发效率&#xff0c;满足市场需求&#xff0c;低代码平台的可视化开发、组件化和框架化降低了开发的技术门槛&#xff0c;让更多人能参与到软件开发…

通过SSH的方式连接Git仓库

前置条件 git已经安装。 生成公钥私钥 任意调出 git bash 执行&#xff1a; 回车两次&#xff0c;如果已有则需要覆盖确认 Overwrite ssh-keygen -t rsa -C "your_emailexample.com" 生成后的文件路径&#xff1a; C:/user/你的账户/.ssh下&#xff0c;其中 id…

麒麟信安与派盘互认证成功

麒麟信安是中国领先的信息安全技术服务商&#xff0c;具有自主研发的核心安全技术&#xff0c;致力于为企业等各类用户提供高效、安全、可靠的信息安全防护服务。而派盘是深圳科迈爱康科技有限公司的产品&#xff0c;是一款本地云存储解决方案&#xff0c;支持多平台接入&#…

WPF Prims框架详解

文章目录 前言Prism基本使用Prism选择&#xff0c;DryIoc还是UnityPrism基本框架搭建Prism动态更新View和ViewModel对应关系参数动态更新函数动态绑定 prism新建项目模板region使用事例测试是否限制空间 消息订阅如何使用消息订阅使用建议 路由导航对话框/弹窗功能实现代码 前言…

国内什么牌子的ipad手写笔好用?电容笔性价比高推荐

随着平板电脑在校园、办公室中的应用越来越广泛&#xff0c;需要一种具有良好性能的电容笔。苹果品牌原装的这支电容笔&#xff0c;虽然功能很强&#xff0c;但因为其的价格实在是太贵了&#xff0c;所以只是用来学习记笔记&#xff0c;实在是太浪费了。所以&#xff0c;哪个电…

JavaSwing+MySQL的飞机订票系统(内含oracle版本)

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88055544 JDK1.8 MySQL5.7 功能&#xff1a;接收客户端发来的数据、处理客户端发来的数据、发送数据包到客户端&#xff1b;客户端&#xff1a;查询所有航班的信息、查看自己所定的票、订票…

Day 60 小结

1.惰性学习&#xff08;消极学习&#xff09;&#xff1a;在训练数据集的时候不会创建目标函数&#xff0c;只是简单将训练样本存储。后期需要对新样本进行判断的时候分析新样本和已存储的样本之间的关系&#xff0c;并以此确定新样本的输出值。例如&#xff1a;knn算法。 2.急…

LeetCode:4. 寻找两个正序数组的中位数

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340; 算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 题解目录 一、&#x1f331;[4. 寻找两个正序数组的中位数](https://leetcode.cn/proble…

微信朋友圈同步你知道怎么设置吗?

微信关于朋友圈同步 其实没有什么其他方法 但是不想一直复制粘贴 繁琐又麻烦 对于要发布很多条的情况下 就很不方便 如果是有可以同步朋友圈的功能 我们可以先选择一个好友 然后设置好跟圈任务 好友发啥你就会跟TA发出一模一样的朋友圈

CEASC项目环境搭建(训练VisDrone数据集)

CEASC项目环境搭建&#xff08;训练VisDrone数据集&#xff09; 论文地址&#xff1a;https://openaccess.thecvf.com/content/CVPR2023/papers/Du_Adaptive_Sparse_Convolutional_Networks_With_Global_Context_Enhancement_for_Faster_CVPR_2023_paper.pdf Code&#xff1a…

同比环比数据可视化

引言 数据分析和可视化在现代商业环境中变得越来越重要。随着数据的迅速增长&#xff0c;我们需要有效的工具来解释和理解这些数据。 数据可视化提供了一种直观的方式&#xff0c;帮助我们从海量数据中提取有意义的见解&#xff0c;以支持业务决策。 同比环比图作为一种常见的…

AI制图工具丨Midjourney产品功能介绍

了解如何使用Discord上的Midjourney Bot通过简单的文本提示创建自定义图像 Midjourney是一款AI制图工具&#xff0c;只要关键字&#xff0c;就能透过AI算法生成相对应的图片&#xff0c;只需要不到一分钟。 可以选择不同画家的艺术风格&#xff0c;例如安迪华荷、达芬奇、达利…

JavaScript中的JSON

一&#xff1a;分类  简单值&#xff1a;字符串、数值、布尔值和 null 可以在 JSON 中出现&#xff0c;就像在 JavaScript 中一样。特殊 值 undefined 不可以。 对象&#xff1a;第一种复杂数据类型&#xff0c;对象表示有序键/值对。每个值可以是简单值&#xff0c;也可以…