计算机视觉——OpenCV Python位运算与图像掩码

news2024/12/24 9:51:48

概述

位运算与图像掩码的结合允许对图像的特定区域进行精确的操作。通过使用位运算(如AND、OR、XOR和NOT),可以基于掩码的选择性地修改图像数据。位运算与图像掩码结合使用的一些关键点和应用场景:

  1. 选择性修改
    通过位运算AND,我们可以将图像的特定区域(由掩码定义)与其他图像或图形元素结合。例如,如果我们有一个对象的掩码,我们可以使用这个掩码来保留原始图像中的对象,同时将其他区域替换为另一张图像的内容。

  2. 区域保护
    位运算AND也可以用于保护图像的某些区域不受更改。例如,如果我们想要在图像的某个区域上添加效果,但不想影响其他区域,我们可以创建一个掩码,将效果应用于该区域,同时保持其他区域不变。

  3. 图像融合
    使用位运算OR,我们可以将两个图像的重叠区域合并,同时保留各自的独特区域。这对于图像融合和创建合成图像特别有用。

  4. 图像反转
    位运算NOT可以用来反转图像的颜色。通过将整个图像应用掩码(其中所有像素都是1),我们可以创建图像的负片。

  5. 对象提取
    通过结合使用掩码和位运算,我们可以从复杂背景中提取对象。例如,我们可以创建一个掩码来隔离感兴趣的对象,然后使用位运算AND将其从原始图像中分离出来。

  6. 图像修复
    在图像修复任务中,我们可以使用掩码来标识需要修复的区域。然后,可以使用位运算将修复区域与周围区域融合,以实现自然的过渡。

在实际应用中,图像掩码通常是由图像处理算法生成的,例如阈值化、边缘检测、颜色分割等。一旦有了掩码,就可以使用OpenCV等图像处理库提供的位运算函数来执行上述操作。

位运算AND

在 OpenCV 中,位运算AND是一种按位操作,它允许你逐像素地比较两个图像,并根据指定的掩码保留那些在两个图像中都为非零的像素。这种操作通常用于图像处理中,例如提取两个图像的交集或者根据掩码保留特定区域的像素。
为了应用位运算,首先创建两个黑色图像,一个带有垂直白色矩形,另一个带有水平白色矩形:

import cv2
import numpy as np

# 画一个垂直矩形

image1 = np.zeros((400, 600), dtype="uint8")

cv2.rectangle(image1, (50, 50), (250, 350), 255, -1)

# 画一个水平矩形

image2 = np.zeros((400, 600), dtype="uint8")

cv2.rectangle(image2, (50, 200), (550, 350), 255, -1)

cv2.imshow("image1", image1)

cv2.imshow("image2", image2)

cv2.waitKey(0)

要创建一个黑色图像,我们np.zeros函数。这个函数将创建一个充满零(黑色图像)的(400, 600)图像。在第一个黑色图像中,使用cv2.rectangle函数画了一个垂直白色矩形。这个白色矩形的宽度为250 - 50 = 200,高度为350 - 50 = 300。

在第二个黑色图像中,画了一个水平白色矩形,宽度为550 - 50 = 500,高度为350 - 200 = 150。

两个图像如下所示:
在这里插入图片描述

要应用位运算AND,可以使用cv2.bitwise_and函数:

bitwise_and = cv2.bitwise_and(image1, image2)
cv2.imshow("bitwise_and", bitwise_and)
cv2.waitKey(0)

cv2.bitwise_and 函数确实是用于计算两个数组的逐元素位逻辑“与”(AND)运算。这个函数会将输入图像中的每个像素位置的像素值进行比较,并根据比较结果设置输出图像中相应位置的像素值。

在位运算中,逻辑“与”运算的规则如下:

  • 如果两个比较位都是1(非零),则结果位也是1。
  • 如果两个比较位中有任何一个是0,则结果位是0。

在图像处理的上下文中,这通常意味着:

  • 如果 image1image2 中相应位置的像素值都大于0(在8位图像中,像素值的范围是0到255),那么这两个像素都被认为是有效的,输出图像中对应位置的像素值将被设置为最大值,通常是255(代表白色)。
  • 如果 image1image2 中任一像素值为0(代表黑色或透明),或者两者都是0,那么输出图像中对应位置的像素值将被设置为0(代表黑色或完全不透明)。
a = np.array([255])  # 两个像素都大于0

b = np.array([255])  # 大于0

cv2.bitwise_and(a, b)  # 输出255
array([[255]], dtype=int32)

a = np.array([0])  # 两个像素中的一个等于0

b = np.array([255])

cv2.bitwise_and(a, b)  # 输出0
array([[0]], dtype=int32)

位运算AND函数的下面图像所示,唯一留下的白色(255)区域是两个矩形重叠的区域,其他都是黑色(0):
在这里插入图片描述

位运算OR

cv2.bitwise_or 函数是 OpenCV 库中用于执行逐元素位逻辑“或”(OR)运算的函数。这个函数比较两个输入数组的对应元素,并根据比较结果计算输出数组的元素值。位运算 OR 的基本原则是:

  • 如果两个比较位中任何一个为1(非零),结果位为1。
  • 如果两个比较位都为0(零),结果位也为0。

在图像处理的上下文中,cv2.bitwise_or 函数的行为如下:

  • 如果 image1image2 中任一位置的像素值大于0(在8位图像中,像素值的范围是0到255),那么输出图像中对应位置的像素值将被设置为最大值(通常是255,代表白色)。
  • 如果 image1image2 中所有位置的像素值都为0(代表黑色),那么输出图像中对应位置的像素值也将是0(黑色)。

这种操作在图像处理中可以用于多种目的,例如:

  • 合并两个图像中的所有非黑像素。
  • 提取两个图像共有的区域和独有的区域。
  • 实现某些特殊的图像融合效果。

下面是一个使用 cv2.bitwise_or 函数的简单示例:

import cv2
import numpy as np

# 读取或创建两个图像
image1 = cv2.imread('image1.png', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.png', cv2.IMREAD_GRAYSCALE)

# 确保两个图像大小相同
# 如果需要,可以使用 cv2.resize() 函数调整图像大小

# 应用位运算OR
result = cv2.bitwise_or(image1, image2)

# 显示结果
cv2.imshow('Result of Bitwise OR', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,image1image2 是两个单通道灰度图像。cv2.bitwise_or 函数将这两个图像进行逐元素的 OR 运算,并将结果存储在 result 中。
在这里插入图片描述

位运算XOR

cv2.bitwise_xor 函数是 OpenCV 库中用于执行逐元素位逻辑“异或”(XOR)运算的函数。这个操作比较两个输入数组的对应元素,并根据比较结果计算输出数组的元素值。位运算 XOR 的基本原则是:

  • 如果两个比较位中的一个为1而另一个为0,结果位为1。
  • 如果两个比较位相同(都为1或都为0),结果位为0。

在图像处理的上下文中,cv2.bitwise_xor 函数的行为如下:

  • 如果 image1image2 中相应位置的像素值中只有一个大于0(例如一个为白色而另一个为黑色),那么输出图像中对应位置的像素值将被设置为最大值(通常是255,代表白色)。
  • 如果 image1image2 中相应位置的像素值都是0(黑色)或者都是非零值(白色),那么输出图像中对应位置的像素值将被设置为0(黑色)。

这种操作在图像处理中可以用于多种目的,例如:

  • 比较两个图像的差异。
  • 从两个图像中提取相互独立的区域。
  • 实现某些特殊的图像融合效果。

下面是一个使用 cv2.bitwise_xor 函数的简单示例:

import cv2
import numpy as np

# 读取或创建两个图像
image1 = cv2.imread('image1.png', cv2.IMREAD_GRAYSCALE)
image2 = cv2.imread('image2.png', cv2.IMREAD_GRAYSCALE)

# 确保两个图像大小相同
# 如果需要,可以使用 cv2.resize() 函数调整图像大小

# 应用位运算XOR
result = cv2.bitwise_xor(image1, image2)

# 显示结果
cv2.imshow('Result of Bitwise XOR', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,image1image2 是两个单通道灰度图像。cv2.bitwise_xor 函数将这两个图像进行逐元素的 XOR 运算,并将结果存储在 result 中。然后,我们使用 cv2.imshow 函数显示结果图像。

两个矩形重叠的区域被移除(黑色),因为在这个区域中两个像素都大于0:
在这里插入图片描述

位运算NOT

cv2.bitwise_not 函数是 OpenCV 库中用于执行逐元素位逻辑“非”(NOT)运算的函数。这个操作通常被称为位求反或位翻转,它将输入数组中的每个像素的位进行翻转:将0变为1,将1变为0。在图像处理中,这个操作可以用来反转图像的颜色,即把白色变成黑色,把黑色变成白色。

位运算 NOT 的基本原则是:

  • 如果输入位是0(零),则结果位是1(一)。
  • 如果输入位是1(一),则结果位是0(零)。

在图像处理的上下文中,cv2.bitwise_not 函数的行为如下:

  • 如果输入图像中的像素值为0(黑色),那么输出图像中对应位置的像素值将被设置为最大值(通常是255,代表白色)。
  • 如果输入图像中的像素值大于0(白色或其他颜色),那么输出图像中对应位置的像素值将被设置为0(黑色)。

这种操作在图像处理中可以用于创建图像的负片效果,或者在某些特殊情况下作为图像预处理步骤。

下面是一个使用 cv2.bitwise_not 函数的简单示例:

import cv2
import numpy as np

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/fd7499108e1f4a8595ada89dade36c95.png)


# 显示结果
cv2.imshow('Result of Bitwise NOT', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个示例中,image 是一个单通道灰度图像。cv2.bitwise_not 函数将这个图像进行逐元素的 NOT 运算,这个操作将反转图像中的所有像素值,创建一个负片效果:
在这里插入图片描述

图像掩码

图像掩码是一种用于控制图像中哪些部分应该被处理或忽略的技术。掩码通常是一个与原始图像大小相同的二值图像,其中像素值通常是0或255(或其他与图像深度相对应的最大值)。掩码可以用于多种目的,包括但不限于图像编辑、特征提取、对象选择和图像融合。

掩码的一些主要用途:

  1. 区域选择
    掩码可以用来选择图像中的特定区域。例如,如果你只对图像中的某个对象感兴趣,你可以创建一个掩码,其中该对象是白色(255)的,其余部分是黑色(0)的。然后,你可以使用这个掩码与原始图像进行位运算,如AND运算,以仅保留你感兴趣的对象。

  2. 图像编辑
    掩码可以用于图像编辑中,例如在原始图像上添加文本或图形元素。你可以创建一个包含所需编辑的掩码,然后将其与原始图像合并。

  3. 图像融合
    在图像融合中,掩码可以用来决定不同图像之间的哪些部分应该可见。例如,你可以使用掩码将两个图像的重叠区域混合在一起,而保留其他区域的原始外观。

  4. 对象检测和分割
    掩码可以用于对象检测和分割任务中,通过识别和隔离感兴趣的对象或特征。这通常涉及到图像分割算法,它们可以根据像素值或颜色信息创建掩码。

  5. 图像预处理
    在某些图像预处理步骤中,掩码可以用来忽略不相关的图像部分,例如背景,而只关注前景中的特定元素。

moon = cv2.imread("moon.jpg")

# 创建一个与我们的图像相同大小的黑色图像,然后创建一个白色圆形

mask = np.zeros(moon.shape[:2], dtype="uint8")

cv2.circle(mask, (202, 133), 34, 255, -1)

# 将掩蔽应用到图像
masked = cv2.bitwise_and(moon, moon, mask=mask)

cv2.imshow("moon", moon)

cv2.imshow("mask", mask)

cv2.imshow("Mask applied to image", masked)

cv2.waitKey(0)

首先从磁盘加载我们的图像。然后,创建一个与原始图像相同大小的黑色图像。接下来,在掩蔽图像上创建一个白色圆形。白色圆形完全对应于原始图像中的月亮区域。这步可以用HSV颜色识别来获取月亮的区域。

该函数接受一个可选的第三个参数,即掩蔽。如果提供了掩蔽,函数将输出原始图像中的像素,如果掩蔽中的对应像素非零,则输出0:
在这里插入图片描述

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

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

相关文章

视频质量评价 PSNR 算法详细介绍

PSNR PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用的评价图像质量的指标,尤其在图像压缩和图像处理领域。它基于最大可能的图像信号功率和图像的噪声功率之间的比率,通常用于衡量图像恢复或图像压缩算法的效果。 原理 PSNR是基于MSE(Mean Squared Error,均…

【网站项目】高校毕业论文管理系统小程序

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

【java解决线程间变量不可见性的方案】

解决线程间变量不可见性的方案 一、 背景 所有的实例变量和类变量都存储在主内存,但每个线程都有自己的工作内存,保留了主内存的共享变量的副本,线程修改的是共享变量,但是每个线程每次只能读取工作内存里的值,所以会…

Flink窗口机制

1.窗口的概念 时间是为窗口服务的。窗口是什么?为什么会有窗口呢? (1)Flink要处理的数据,一般是从Kafka过来的流式数据,如果只是单纯地统计流的数据量,是没办法统计的。 (2&#xff…

2024蓝桥杯每日一题(组合计数)

备战2024年蓝桥杯 -- 每日一题 Python大学A组 试题一:计算系数 试题二:求组合数1 试题三:求组合数2 试题四:杨辉三角形 试题一:计算系数 【题目描述】 给定一个多项式 (axby)k,请…

Google Earth Engine 洪水制图 - 使用 Sentinel-1 SAR GRD

Sentinel-1 提供从具有双极化功能的 C 波段合成孔径雷达 (SAR) 设备获得的信息。该数据包括地面范围检测 (GRD) 场景,这些场景已通过 Sentinel-1 工具箱进行处理,以创建经过校准和正射校正的产品。该集合每天都会更新,新获得的资产会在可用后两天内添加。 该集合包含所有 G…

【研发管理】产品经理知识体系-产品创新管理

导读: 产品创新管理对企业的发展具有深远的影响,它不仅是企业保持竞争优势的关键,也是推动企业持续稳定发展的重要动力。因此,企业应高度重视产品创新管理,并采取有效的策略和方法来推动产品创新活动的开展。对于产品经…

.NET 邮件发送 SMTP邮件发送

SMTP(Simple Mail Transfer Protocol)是用于电子邮件传输的规则集,可以从邮件客户端向接收电子邮件服务器发送、中继或转发邮件。发件人可使用SMTP 服务器来执行发送电子邮件的过程。SMTP服务器则是按照这些规则中转电子邮件的服务器。 IMAP…

Java web应用性能分析之【MySQL安装注意事项】

本文主要是针对以前LAMP,以及默认用apt安装的mysql。数据文件、日志文件都在一起;innodb_buffer_pool默认用128M。如果你排查问题,最后发现是因为mysql的安装配置不对,是否一口老血要喷出来。同时给MySQL数据库安装做参考。 关于M…

Docker - HelloWorld

原文地址,使用效果更佳! Docker - HelloWorld | CoderMast编程桅杆https://www.codermast.com/dev-tools/docker/docker-helloworld.html 开始之前 在学习本小节之前,你必须确保你正确安装了 Docker,正确安装 Docker 是后续学习的…

【树莓派学习】hello,world!

系统安装及环境配置详见【树莓派学习】系统烧录及VNC连接、文件传输-CSDN博客 树莓派内置python3,可以直接利用python输出。

linux中如何挂载yum云仓库进行软件的安装

1.首先在根目录下建立文件,用来挂载镜像文件 [rootclient ~]# mkdir /rhel9 2.挂载镜像文件: [rootclient ~]# mount /dev/cdrom /rhel9 3.切换到 /etc/yum.repos.d 下的目录并查看 ,创建 rhel9.repo文件,并编辑云仓库域名&am…

基于机器学习的车辆状态异常检测

基于马氏距离的车辆状态异常检测(单一传感器) 基于多元自动编码器的车辆状态异常检测 基于单传感器平滑马氏距离的车辆状态异常检测 工学博士,担任《Mechanical System and Signal Processing》等期刊审稿专家,擅长领域&#xff1…

HCIP-Datacom-ARST必选题库_10_IPv4【1道题】

一、单选 1.IPV4报文发送方式包括哪三种? 任意播组播单播广播 2.如图所示是一个IP报文头部,则以下说法正确的是? 协议号51,代表该IPHeader后的报文为AH头部 该报文一定是只有AH装的IPsecVPN报文 协议号51,代表该IPHeader后的报文为ESP头部 该报文为Ipsec VPN报文,并且该报文…

【NRND】SCT2401 4.5V-40V输入,600mA同步降压DCDC变换器,建议使用LGS5148替代

DCDC丝印2401替代原因: 国产器件未提供中文说明书,截止到2024年4月20日。 批量价格约9毛,比LGS5148贵50%,且输入电压没有LGS5148高,而LGS5148还提供了中文说明书。 2者引脚定义相同。 LGS5148详情请点此处打开CSDN连接…

知道做到 一篇总结学习方法的笔记

元数据 [!abstract] 知道做到:跃迁式学习 书名: 知道做到:跃迁式学习作者: 彼得•霍林斯简介: 学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程,让你事半功倍。技能、信息和能力…

linux下摄像头设置固定的设备名

目录 2.热插拔udev机制 3.设置udev的规则 1.查看usb ID 2. 查看usb设备的信息 3.编译规则 4.拓展 1.问题的出现 通过我之前的文章配置完摄像头的开机自启动之后我们会发现有的时候会出现启动不了的情况,通过实验我发现是摄像头的设备名发生了改变,…

如何打开局域网共享?

局域网共享是一种方便实现文件共享、打印共享和资源访问的技术。通过局域网共享,不同设备之间可以方便地共享文件和资源,提高工作效率和便利性。在网络环境中,使用天联组网工具可以更加快速地实现局域网共享,解决不同地区间的远程…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d},试求出由 X X X 导出的所有关联规则。 解: 首先生成项集的所有非空真子集。这包括: { a } , { b } , { c } , {…

Java测试编程题

题目1 1.创建5个线程对象 线程名设置为(Thread01,Thread02,Thread03,Thread04,Thread05)使用 代码实现5个线程有序的循环打印,效果如下: Thread01正在打印1 Thread02正在打印2 Threa…