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.mzph.cn/news/3433.shtml

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

相关文章

docker-compose搭建prometheus+grafana+钉钉告警

前言: 本文将介绍使用docker-compose部署搭建promtheus监控容器、主机、服务等相关状态; 配合granfana面板构建监控大屏; 由于grafana的报警不是很友好,使用dingtalk,配合altermanager,实现钉钉报警。 …

认识Spring(1)

hi,大家好,今天继续为大家带来Spring的相关内容 文章目录 🧁1.理解Spring和IOC🧁2.DI和DF🍸2.1什么是DI🍸2.2什么是DF🍸2.3DI和DF的区别 🧁3 Spring创建和使用🍸3.1创建Spring项目&#x1f361…

【机器人模拟-02】 模拟移动机器人设置里程计

一、说明 在本教程中,我将向您展示如何设置移动机器人的测程。本教程是“机器人模拟”指南中的第二个教程。测量位移是仿真中的重要内容,设置测程的官方教程在此页面上,但我将逐步引导您完成整个过程。 您可以在此处获取此项目的完整代码。让我们开始吧! 二、ROS 2 中的里程…

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

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

torch分布式通信基础

torch分布式通信基础 1. 点到点通信2. 集群通信 官网文档:WRITING DISTRIBUTED APPLICATIONS WITH PYTORCH 1. 点到点通信 # 同步,peer-2-peer数据传递 import os import torch import torch.distributed as dist import torch.multiprocessing as mpdef…

php 开发微信 h5 支付 APIv3 接入超详细流程

✨ 目录 🎈 申请商户号🎈 申请商户证书🎈 设置V3密钥🎈 开通H5支付🎈 设置支付域名🎈 SDK 下载🎈 第一次下载平台证书🎈非第一次下载平台证书🎈 H5下单 🎈 申…

【前端知识】React 基础巩固(二十八)——StrictMode

React 基础巩固(二十八)——StrictMode StrictMode StrictMode 是一个用来突出显示应用程序中潜在问题的工具 与 Fragment 一样,StrictMode 不会渲染任何可见的 UI为后代出发额外的检测和警告严格模式检查仅在开发模式下运行,不影响生产构建 严格模式检…

【DBA课程-笔记】第 3 章:MongoDB数据库核心知识

内容 一、MongoDB 数据库架构 A. MongoDB数据库体系架构 1. 存储引擎(MongoDB Storage Engines): 2. MongoDB 数据逻辑架构 二、MongoDB 存储引擎 A. 查看mongodb服务器的状态 B. 查看引擎信息(4.2.1 没有这个命令&#xf…

搭载下一代人工智能技术,微软推出Power Automate流程挖掘产品

在近日的Microsoft Inspire大会中,微软揭晓了他们即将推出的Power Automate流程挖掘产品,并计划在8月1日正式对外开放。 试用地址:https://powerautomate.microsoft.com/zh-cn/#home-signup 这款产品搭载了下一代人工智能技术,有…

基于 Fedora 38 的预期版本 Nobara 38 发布

导读基于 Fedora 38 的预期版本 Nobara 38 终于发布了,它带来了一系列用户友好的修复和功能增强。Nobara 是 Fedora Linux 的修改版本,旨在解决用户面临的常见问题,并提供开箱即用的顺滑的游戏、流媒体和内容创建体验。凭借一系列附加软件包和…

深度学习ai学习方向如何规划,算法竞赛,机器学习,搭建环境等答疑

目录 1了解人工智能的背景知识 2 补充数学或编程知识 3 熟悉机器学习工具库 4 系统的学习人工智能 5 动手去做一些AI应用 1了解人工智能的背景知识 一些虽然存在但是在研究或者工业上不常用的知识,为自己腾出更多的时间来去学习,研究。 人工智能里…

天翎MyApps低代码平台唯品会金牌客服管理系统

项目痛点: 作为一家知名的创新大型电商,唯品会秉承“传承品质生活,提升幸福体验”的企业使命。基于客服铁军锻造项目,实现基于金牌案例的提交、评审、积分,学习功能。 项目中的晋升机制、案例产生学习机制、双激励机制…

linux 基于debian_ubuntu AB系统适配(三)- overlayroot

Overlayroot Overlayroot是一个实用工具,允许您创建一个只读的根文件系统和一个可写的覆盖文件系统。这对于创建一个更安全和稳定的系统很有用,因为对系统所做的任何更改都将存储在覆盖文件系统中,可以很容易地丢弃或重置。 在Debian下,分离的系统在/userdata/rootfs_ove…

手把手教你搭建SpringCloud项目(九)集成OpenFeign服务接口调用

什么是微服务?一看就会系列! 一、手把手教你搭建SpringCloud项目(一)图文详解,傻瓜式操作 二、手把手教你搭建SpringCloud项目(二)生产者与消费者 三、手把手教你搭建SpringCloud项目&#x…

【iOS】ARC实现

ARC由以下工具来实现: clang(LLVM编译器)3.0以上objc4 Objective-C运行时库493.9以上 下面我们,我们将围绕clang汇编输出和objc4库的源代码探究ARC实现 1. __strong修饰符 1.1 赋值给附有__strong修饰符的变量 看下面代码 {…

注释气泡图函数(更新)

之前我们写过一个原创可视化函数Dotplot_anno.R,nature级别图表:一个注释气泡热图函数(适用于单细胞及普通数据)。主要解决的问题是1) 单细胞基因可视化分组注释。2) Bulk RNA差异基因热图、气泡图。3) 富集分析结果气泡图展示。这…

【分布式训练】基于Pytorch的分布式数据并行训练

基于Pytorch的分布式数据并行训练 动机为什么要并行分布数据?现有资料的不足 Outline整体框架图带解释的最小demo示例没有multiprocessing开启multiprocessing 分布式训练启动方式混合精度训练(采用apex) 参考资料 简介: 在PyTorc…

【ROS】ROS1人机界面开发:第一个最简ROS+QtGui程序(按钮启动发布者)

【ROS】郭老二博文之:ROS目录 1、创建工程 1)新建工程:Other Project --> ROS Workspace 2)设置工程名称、路径 3)可以通过点击“Browse”来创建目录 注意:使用自带ros插件的qtcreator-ros,无法创建目录、也不能选择目录,这是个bug,因此需要在终端手动创建目录…

密码学学习笔记(十六 ):Schnorr签名算法

交互式零知识证明 零知识证明(ZKP)就是不会将证据泄露给验证者的知识证明。Schnorr身份认证识别协议是一个交互式ZKP,它满足了完备性、可靠性、零知识性。所谓的交互式ZKP方案通常包含3个步骤(承诺、挑战和证明),在文献中通常被称…

django框架向DRF框架演变过程详解

一、Django框架实现项目查询接口 主要知识点: Django框架视图函数 1、在 Django 项目中创建一个应用(如果还没有创建): python manage.py startapp projects 2、在项目的 models.py 文件中定义项目模型 from django.db impor…