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

概述

位运算与图像掩码的结合允许对图像的特定区域进行精确的操作。通过使用位运算(如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:
在这里插入图片描述

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

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

相关文章

李宏毅2022机器学习/深度学习 个人笔记(1)

本系列用于推导、记录该系列视频中本人不熟悉、或认为有价值的知识点 本篇记录第一讲(选修):神奇宝贝分类 如图,为了估算某个样本属于某类的概率,在二分类问题中,我们需要计算红框所示的4个参数&#xff0…

语义分割知识点:UNet、FCN、SegNet、PSPNet、DeepLab系列

语义分割知识点:UNet、FCN、SegNet、PSPNet、DeepLab系列 前言语义分割网络剖析UNet系列UNetUNet网络有几个主要的特点:从UNet结构图可以知道,收敛路径主要的过程为简要总结: UNet为什么UNet可以被剪枝?如何剪枝? 根据子网络在验…

如何打开局域网共享?

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

lesson03:类和对象(中)

1.类的6个默认的成员函数 2.构造函数 3.析构函数 4.拷贝构造函数 1.类的6个默认的成员函数 空类(类中一个成员都没没有)会有成员函数吗? 其实是有的!如果我们在类中什么都不写,编译器会自动生成6个默认成员函数&a…

33. BI - Graph Embedding 回顾以及 GCN 算法介绍

本文为 「茶桁的 AI 秘籍 - BI 篇 第 33 篇」 文章目录 回顾 Graph Embedding什么是 GCNGCN 算法 Hi,你好。我是茶桁。 咱们终于进入核心 BI 课程的最后一部分内容了,之前咱们的重心一直都是在特征选取上,如何获得更好的特征是重中之重&…

踏上R语言之旅:解锁数据世界的神秘密码(二)

R语言学习 文章目录 R语言学习1.数据的R语言表示2.多元数据的R语言调用3.多元数据的简单R语言分析 总结 1.数据的R语言表示 数据框(data frame) R语言中用函数data.frame()生成数据框,其句法是: data.frame(data1,data2,…),例如…

FPGA - ZYNQ 基于EMIO的PS和PL交互

前言: Xilinx ZYNQ系列的芯片,GPIO分为 MIO 、EMIO、AXI_GPIO三种方式。 MIO :固定管脚,属于PS端,也就是ARM端。 EMIO :通过PL扩展,使用时需要分配PL(FPGA)管脚,消耗PL端资源。…

C语言读取数据检索存档《C语言程序设计》·第6章·用数组处理批量数据

C数组使用 添加链接描述 C语言读取数据检索存档 1 添加链接描述 2 添加链接描述 3 添加链接描述 4 添加链接描述 5 添加链接描述 6 添加链接描述 7 matlab转C 添加链接描述

Qt 拖放功能详解:理论与实践并举的深度指南

拖放(Drag and Drop)作为一种直观且高效的用户交互方式,在现代图形用户界面中扮演着重要角色。Qt 框架提供了完善的拖放支持,允许开发者在应用程序中轻松实现这一功能。本篇博文将详细阐述Qt拖放机制的工作原理,结合详…

Spark-机器学习(3)回归学习之线性回归

在之前的文章中,我们了解我们的机器学习,了解我们spark机器学习中的特征提取和我们的tf-idf,word2vec算法。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你…

OpenCV从入门到精通实战(八)——基于dlib的人脸关键点定位

本文使用Python库dlib和OpenCV来实现面部特征点的检测和标注。 下面是代码的主要步骤和相关的代码片段: 步骤一:导入必要的库和设置参数 首先,代码导入了必要的Python库,并通过argparse设置了输入图像和面部标记预测器的参数。…

全球首份网络空间测绘报告发布(2022年)

美国、俄罗斯网络韧性位居前 2 位,香港、洛杉矶、新德里位列全球安全城市前三甲 日前,第 55 届亚太先进网络学会(APAN)学术会议在尼泊尔首都加德满都举行,来自中国的网络空间测绘联合研究中心 ( 以下简称联合研究中心 …

SpringCloud系列(8)--将服务提供者Provider注册进Eureka Server

前言:上一章节我们介绍了Eureka服务端的安装与配置,本章节则介绍关于微服务如何入职Eureka Server Eureka架构原理图 1、修改provider-payment8001子模块的pom.xml文件,引入Eureka Clinet的依赖,然后reolad一下,下载依…

第十五届蓝桥杯题解-数字接龙

题意:经过所有格子,并且不能进行交叉,走的下一个格子必须是当前格子值1%k,输出路径最小的那一条(有8个方向,一会粘图) 思路:按照8个方向设置偏移量进行dfs,第一个到达终…

【Django】调用django的pbkdf2_sha256加密算法测试

基于django搭建的系统中,用到pbkdf2_sha256((Password-Based Key Derivation Function 2))加密算法,这里做些代码测试、总结。 PBKDF2简介 PBKDF2是一种基于密码的密钥派生函数,用于从用户提供的…

强固型国产化工业电脑,在电子看板行业应用,机器视觉在汽车产线行业应用

电子看板行业应用 智能电子看板的核心是通过实现工厂的全面可视化、自动化管理,最终达到提高效率、降低成本及提高产品质量的目标。电子看板硬件主要有两部分组成:微型工业计算机,显示终端(平板电视、LCD) 方案需求 …

免费使用ChatGPT 4.0 和 文心一言 4.0

前言 今天给大家分享如何免费使用ChatGPT4.0 和 文心一言 4.0,废话就不多说了,我们直接入正题。 ChatGPT 4.0 先来看看如何免费使用ChatGPT 4.0 进入Coze登录 https://www.coze.com 选择大圣-GPT-4 文心一言 4.0 通过文心智能体平台,就…

ADSP-21479的开发详解五(AD1939 C Block-Based Talkthru 48 or 96 kHz)音频直通

硬件准备 ADSP-21479EVB开发板: 产品链接:https://item.taobao.com/item.htm?id555500952801&spma1z10.5-c.w4002-5192690539.11.151441a3Z16RLU AD-HP530ICE仿真器: 产品链接:https://item.taobao.com/item.htm?id38007…

【leetcode面试经典150题】64. 删除排序链表中的重复元素 II(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主,题解使用C语言。(若有使用其他语言的同学也可了解题解思路,本质上语法内容一致&…

4.6 CORS 支持跨域

CORS (Cross-Origin Resource Sharing )是由 W3C 制定的一种跨域资源共享技术标准,其目的就是为了解决前端的跨域请求。在 Java EE 开发中,最常见的前端跨域请求解决方案是 JSONP ,但JSONP 只支持 GET 请求,这是 个很大…