【问题标题】:in OpenCV is mask a bitwise and operation在 OpenCV 中是按位掩码和操作
【发布时间】:2017-03-21 07:31:51
【问题描述】:

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

bitwise_and(src1, src2, mask=mask)

以下哪些描述了实现:

  • A.全部按位,先屏蔽

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

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

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

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

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

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

【问题讨论】:

    标签: c++ opencv


    【解决方案1】:

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

    1.使用二值图像

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

    屏幕 1:

    屏幕 2:

    按位执行时:

    fin = cv2.bitwise_and(screen1, screen2)
    cv2.imwrite("Final image.jpg", fin)
    

    我们得到以下信息:

    2。对彩色图像执行遮罩:

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

    考虑下图:

    并考虑 屏幕 1(如上所示)作为掩码

    fin = cv2.bitwise_and(image, image, mask = screen1)
    cv2.imwrite("Masked image.jpg", fin)
    

    给你:

    注意:在执行按位与运算时,图像的大小必须相同

    【讨论】:

    • 实际上比这更深。例如,我发现对两个图像进行与位运算,因此如果一个图像中的一个像素是 (50,50,50) 而另一个是 (150,150,150),则结果是每个像素的颜色完全不同(按位二进制与)。然而,在掩码参数中,像 (50) 或 (150) 这样的颜色被视为完全相同,例如,它们根本不是 AND 运算。它们要么在 0=0、1-255=255 处进行阈值处理,然后进行与运算,或者更有可能的是,它们实际上对每个像素使用了一个 if 语句。传统上,掩码总是作为按位运算应用,但 opencv 似乎没有。
    • 希望你得到你需要的东西!!
    【解决方案2】:

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

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

    【讨论】:

    • 好吧,我实际上使用的是 python,在 python 中你可以跳过 dest,它返回修改后的图像,在 c++ 中将在 dest 中。至于我的问题,你建议选项 C,它在掩码中的每个像素上应用一个实际的“if()”,然后对来自 src1 和 src2 的相应像素进行按位操作。但我不明白你是怎么来的这个结论。通常掩码作为按位运算应用,所以使用 if( 是非标准的,我想知道这是否是 opencv 真正做的。
    • 是的,选项 C。如果所有图像都是二进制的,因为您的目标最初全为零,其他选项可能会给您相同的结果。我总是使用二进制蒙版(黑色 0 和白色 255 图像,没有灰度值),我不知道如果使用灰度蒙版会发生什么。请注意,“按位与”正在执行“与”逐位(一个像素通常有 8 位),如果两个 src 图像都是二进制(0 和 255 值)一切都会好的,但如果它们有其他像素值,它会给你带来意想不到的结果。
    最近更新 更多