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.hqwc.cn/news/27583.html

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

相关文章

郭东白的架构课学习笔笔记(1)

1.架构师的品质 自信和勇气(正确的废话)拥有战略意图,所谓战略意图,就是拥有与其资源和能力极不相称的雄心壮志。使用演绎法寻找架构原理,而不是归纳法。 2.如何提升自己的架构能力 向身边比自己厉害的优秀架构师或…

ubuntu 20.04 4090 显卡驱动安装 深度学习环境配置

1. 显卡驱动安装 准备工作: 换源安装输入法:重启的步骤先不管(自选)sudo apt update && sudo apt upgrade 禁用nouveau驱动(这个驱动是ubuntu开源小组逆向破解NVIDIA的开源驱动,与英伟达的原有驱…

设计模式之原型模式

写在前面 但我们看某个电影,或者是某个电视剧的时候,总会提到某某人是某某角色的原型,这里某某角色就好像是某某人的复制品一样,这里的原型设计模式也是如此,不过,这里的原型是一个对象,而原型…

云计算——云计算与虚拟化的关系

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 目录 前言 一.虚拟化 1.什么是虚拟化 2.虚拟化技术作用 二.云计算与虚拟化的关系 三.虚…

ThunderScope开源示波器

简介 4CH,1GSa/S 开源示波器。前端很简洁,BUF802LMH6518,ADC是HMCAD1511,用Xilinx A7 FPGA进行控制,数据通过PCIE总线传输到上位机处理。目前这个项目已经被挂到了Xilinx官网,强。 设计日志:h…

【Docker】Docker镜像和Docker容器

文章目录 Docker镜像镜像基本概念为什么需要镜像?Union FS(联合文件挂载)docker镜像原理 Docker镜像命令docker rmidocker savedocker loaddocker historydocker image prune docker镜像实战离线迁移镜像镜像存储的压缩与共享 Docker容器容器…

Spring设计模式及部分技术讲解

讲师:邓澎波 Spring面试专题 1.Spring应该很熟悉吧?来介绍下你的Spring的理解 有些同学可能会抢答,不熟悉!!! 好了,不开玩笑,面对这个问题我们应该怎么来回答呢?我们给大家梳理这个几个维度来回答 1.1 Spring的发展历程 先介绍Spring是怎么来的,发展中有哪些核心的节…

mysql 2 -- 数据库基本操作、数据表的操作、mysql查询操作

一、数据库基本操作 1、数据库的登录及退出 连接数据库: mysql -u用户名 -h主机地址(省略代表本机) -p 密码(格式为123...);注: 刚下载安装的时候需要通过管理员进入 退出数据库,以下三种方式都可以: exit quit …

大数据学习02-Hadoop分布式集群部署

操作系统:centos7 软件环境:jdk8、hadoop-2.8.5 一、创建虚拟机 1.下载VMware,建议支持正版 2.安装到Widows目录下任意位置即可,安装目录自定义。打开VMware,界面如下: 3.创建虚拟机 创建虚拟机—>选择自定义 …

android 下载源码 一路踩坑

python 从 2.0 升级到3.0 从官网下载 pyhon3.0 安装器,然后更改配置 # Setting PATH for Python 3.8# The original version is saved in .bash_profile.pysaveexport PATH"/Library/Frameworks/Python.framework/Versions/3.11/bin:$PATH"alias python"/Libr…

SpringCloud(四)Hystrix服务降级、熔断、监控页面

一、服务熔断 官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/1.3.5.RELEASE/single/spring-cloud-netflix.html#_circuit_breaker_hystrix_clients 我们知道,微服务之间是可以进行相互调用的,那么如果出现了…

如何创建 Spring Boot 项目

目录 一、Spring Boot 项目的创建 1. 安装 Spring Boot Helper 插件 2. 创建 Spring Boot 项目 3. 项目目录详解 4. 运行 Spring Boot 项目 二、Spring Boot 的优点 前言 Spring Boot 的意思就是 Spring Boot 脚手架的意思,已经总结完成 Spring 的学习&#x…