10.opencv按位(AND/OR/XOR/NOT)运算

在本博文中,您将学习如何在 OpenCV 中应用按位 AND、OR、XOR 和 NOT在这里插入图片描述

一、OpenCV 按位 AND、OR、XOR 和 NOT

在我们深入本教程之前,我将假设您了解四个基本的按位运算符:

二、项目结构和代码讲解

1.项目结构

通过博文末尾或此处的的代码下载
下载本博文对应的代码项目,以下是下载解压后的项目结构:在这里插入图片描述

我们今天只有一个脚本, opencv_bitwise.py,这会将 AND、OR、XOR 和 NOR 运算符应用于示例图像。

2.代码讲解

在本节中,我们将回顾四个按位运算:AND,OR,XOR和NOT。虽然非常基础和低级,但这四个操作对于图像处理至关重要 。
按位运算以二进制方式运行,并表示为灰度图像。如果给定的像素值为 0,则它会“关闭”,如果像素的值大于零,则它会“打开”。

让我们继续并跳入一些代码:
在这里插入图片描述
对于前几行代码导入,我们需要的包包括:NumPy 和我们的 OpenCV 绑定。

我们在第 6行将矩形图像初始化为300 x 300 NumPy 数组。然后我们在图像的中心绘制一个250 x 250 的白色矩形。

类似地,在第 11 行,我们初始化另一个图像以包含我们的圆,我们在第 12 行再次以图像的中间为中心绘制圆,半径为 150 像素。

下图显示了我们的两个形状:在这里插入图片描述
如果考虑这些输入图像,我们将看到它们只有两个像素强度值-一个像素是 0(黑色)或像素大于零(白色)。我们称只有两个像素强度值的图像为二进制图像。

另一种看待二进制图像的方式就像我们客厅里的开/关开关。想象一下300 x 300图像中的每个像素都是一个灯开关。如果开关关闭,则像素的值为零。但是如果像素是on,它的值大于零。

在图 2 中,我们可以看到分别构成矩形和圆形的白色像素,它们的像素值为on,而周围像素的值为off。

在我们演示按位运算时,根据这种开/关的概念:

在这里插入图片描述

正如我上面提到的,如果一个给定的像素的值大于零,它就会“打开”,如果它的值为零,它就会“关闭”。按位函数在这些二进制条件下运行。

为了利用按位函数,我们假设(在大多数情况下)我们正在比较两个像素(唯一的例外是 NOT 函数)。我们将比较每个像素,然后构建我们的按位表示。

让我们快速回顾一下我们的二元运算:

  • AND:当且仅当两个像素都大于零时,按位 AND 为真。
  • OR:如果两个像素中的任何一个大于零,则按位 OR 为真。
  • XOR:当且仅当两个像素之一大于零时,按位 XOR 为真,但不是两个都大于零。
  • NOT:按位非反转图像中的“开”和“关”像素。
    在第 21 行,我们使用按位 AND 对矩形和圆形图像应用cv2.bitwise_and功能。正如上面的列表所提到的,当且仅当两个像素都大于零时,按位 AND 才为真。我们的按位 AND 的输出可以在下图中看到:在这里插入图片描述

我们可以看到正方形的边缘丢失了——这是有道理的,因为我们的矩形没有像圆形那样覆盖面积大,因此两个像素都没有“打开”。

现在让我们应用按位或在这里插入图片描述
我们在第 28 行应用按位 OR使用cv2.bitwise_or功能。如果两个像素中的任何一个大于零,则按位 OR 为真。看一下下图中按位 OR 的输出:在这里插入图片描述

在这种情况下,我们的正方形和矩形已经组合在一起。

接下来是按位异或:

在这里插入图片描述
我们在第 35 行应用按位异或,使用cv2.bitwise_xor 功能。

当且仅当两个像素之一大于零时,XOR 运算才为真,但两个像素都不能大于零。

XOR 运算的输出如下图所示:

在这里插入图片描述

在这里,我们看到正方形的中心已被移除。同样,这是有道理的,因为 XOR 操作不能让两个像素都大于零。

最后,我们到达按位非函数:在这里插入图片描述
我们在第 42 行应用按位 NOT使用cv2.bitwise_not功能。本质上,按位非函数翻转像素值。所有大于零的像素都设置为零,所有等于零的像素都设置为255:在这里插入图片描述
注意我们的圆圈是如何改变的
——最初,圆圈是黑色背景上的白色,现在圆圈是白色背景上的黑色。

3.运行代码**

在这里插入图片描述

三、代码下载

代码下载

### OpenCV运算的使用 #### 什么是运算运算是指按二进制数逐进行逻辑操作的过程。常见的运算有 `AND`、`OR`、`XOR` 和 `NOT`。这些运算符可以在图像处理中用来组合多个掩码或者修改图像的内容。 #### Bitwise_OR 的应用实例 在实际应用中,可以用 `bitwise_or` 来合并两个图像的感兴趣区域。例如,可以通过如下代码实现两张图片特定部分的融合: ```csharp using OpenCvSharp; class Program { static void Main() { // 读取图像 📷 Mat src1 = Cv2.ImRead("image1.jpg"); Mat src2 = Cv2.ImRead("image2.jpg"); // 创建输出图像 🖼️ Mat dst = new Mat(); // 进行或运算 🔗 Cv2.BitwiseOr(src1, src2, dst); // 保存结果 💾 Cv2.ImWrite("result_or.jpg", dst); } } ``` 这段代码展示了如何加载两幅输入图像并执行 OR 操作以创建一个新的合成图[^2]。 #### Bitwise_AND 的功能解释 当涉及到 `Bitwise_AND` 函数时,在 OpenCV 库里该方法会返回两个数组对应置上元素相乘的结果(即只有当两个对应的 bit 都为 1 时才得到 1)。这通常被应用于提取重叠区域内共同存在的特征点或是构建基于模板匹配的任务。 对于想要学习更多关于 OpenCV 中其他类型的运算及其应用场景的人而言,可以参考一些基础教程资源来深入理解其工作原理以及最佳实践案例[^3]。 #### 形态学操作中的膨胀 除了简单的运算外,形态学变换也是计算机视觉领域的重要工具之一。其中一种常见的方式叫做“膨胀”,它能够帮助扩大前景对象边界,填补内部孔洞,并且让彼此接近的对象相互连通起来。具体来说,`cv2.dilate()` 方法接受三个主要参数:源图像、结构化元素(也称为核)、迭代次数。下面是一个简单例子说明怎样运用此技术扩展目标轮廓: ```python import cv2 mask = thresh.copy() mask = cv2.dilate(mask, None, iterations=5) # 显示膨胀后的图像 cv2.imshow("Dilated", mask) cv2.waitKey(0) ``` 这里演示了复制阈值化的二值图像作为初始状态,接着调用 `dilate` 对象来进行多轮扩张处理,最终呈现出更宽广的目标范围。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

·菜鸟看世界

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值