在 OpenCV 中是按位掩码和操作

Awo*_*ing 6 c++ opencv

我从 python 中的 opencv 开始,我有一个关于如何应用掩码的问题

bitwise_and(src1, src2, mask=mask)

以下哪些描述了实现:

  • A. 全部按位,先屏蔽

    1. src1 与掩码进行 AND 运算
    2. src2 与掩码进行 AND 运算
    3. src1 和 src2 的剩余部分被 AND 连接在一起
  • B. 全部按位,图像优先

    1. src1 与 src2 进行 AND 运算
    2. 结果与掩码进行 AND 运算
  • C. 有条件的 AND

    1. 掩码通过(例如循环)“迭代”
    2. 对于掩码中的每个像素,如果它不为零,则将 src1,src2 中的相应像素与并复制到输出

我认为每个的性能特征可能略有不同。

其中哪些(或其他方式)是实际实现?(以及为什么,如果我可以问)

我试图查看源代码,但无法完全弄清楚他们做了什么:https : //github.com/opencv/opencv/blob/ca0b6fbb952899a1c7de91b909d3acd8e682cedf/modules/core/src/arithm.cpp

Jer*_*uke 9

我已经制定了cv2.bitwise_and()使用彩色图像和二进制图像的两种实现方式。

1. 使用二进制图像

让我们假设我们有以下二进制图像:

屏幕 1:

在此处输入图片说明

屏幕 2:

在此处输入图片说明

按位执行时:

fin = cv2.bitwise_and(screen1, screen2)
cv2.imwrite("Final image.jpg", fin)
Run Code Online (Sandbox Code Playgroud)

我们得到以下信息:

在此处输入图片说明

2. 对彩色图像进行遮罩:

您也可以使用相同的功能屏蔽给定彩色图像的某个区域。

考虑下图:

在此处输入图片说明

并考虑将屏幕 1(上面给出)作为掩码

fin = cv2.bitwise_and(image, image, mask = screen1)
cv2.imwrite("Masked image.jpg", fin)
Run Code Online (Sandbox Code Playgroud)

给你:

在此处输入图片说明

注意:在执行按位与操作时,图像必须具有相同的大小

  • 它实际上比这更深。例如,我发现 ANDing 两个图像字面上的 AND 位,所以如果一个图像中的一个像素是 (50,50,50) 而另一个是 (150,150,150) 结果是每个像素的颜色完全不同(按位二进制和)。然而,在掩码参数中,像 (50) 或 (150) 这样的颜色被处理得完全相同,例如它们根本没有进行 AND 运算。它们要么在 0=0、1-255=255 处设置阈值,然后进行 AND 运算,或者更有可能的是,它们实际上每个像素都使用 if 语句。传统上,掩码总是作为按位操作应用,但 opencv 似乎不是。 (2认同)

use*_*618 5

如果您查看文档,第三个参数是您错过的目标图像。

仅当掩码如此表示时,此操作才会更改目标图像的值(在这种情况下,它将执行两个源图像的按位与)。对于不在掩码中的像素,目标将包含之前包含的相同值。