gpt4 book ai didi

python - bitwise_and 运算符在 openCV 中到底做了什么?

转载 作者:太空宇宙 更新时间:2023-11-03 12:12:34 26 4
gpt4 key购买 nike

我不完全理解在 openCV 中使用“bitwise_and”运算符时的作用。我也想知道它的参数。

最佳答案

一般用法是您想要获取由另一个图像定义的图像的子集,通常称为“掩码”。

假设您要“抓取”8x8 图像的左上象限。你可以形成一个看起来像这样的面具:

1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
1 1 1 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

您可以使用 Python 生成上述图像:

import numpy as np

mask = np.zeros(shape=(8,8), dtype=bool)
mask[0:4,0:4] = True

然后假设您有这样一张图片:

1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

为了具体起见,假设上图是美国国旗的简化表示:左上角的星星,其他地方的横条。假设你想形成上面的图像。您可以使用掩码以及 bitwise_and 和 bitwise_or 来帮助您。

imageStars = np.ones(shape=(8,8), dtype=bool)
for r, row in enumerate(imageStars):
for c, col in enumerate(row):
if r % 2 != c % 2: # even row, odd column, or odd row, even column
imageStars[r,c] = False

imageBars = np.zeros(shape=(8,8), dtype=bool)
for r, row in enumerate(imageStars):
if r % 2 == 0:
imageBars[r,:] = True

现在你有了一张星星的图片:

1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1
1 0 1 0 1 0 1 0
0 1 0 1 0 1 0 1

还有一个条形图:

1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

并且您想以特定方式组合它们,形成旗帜,星星位于左上象限,条形位于其他各处。

imageStarsCropped = cv2.bitwise_and(imageStars, mask)

imageStarsCropped 看起来像:

1 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0
1 0 1 0 0 0 0 0
0 1 0 1 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0

你知道它是如何形成的吗? bitwise_andimageStars1mask1;否则,它返回 0

现在让我们获取 imageBarsCropped。首先,让我们反转掩码:

maskReversed = cv2.bitwise_not(mask)

bitwise_not1 转换为 0 并将 0 转换为 1 的。它“翻转位”。 maskReversed 看起来像:

0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
0 0 0 0 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1

现在,我们将使用 maskReversed 来“抓取”我们想要的 imageBars 部分。

imageBarsCropped = cv2.bitwise_and(imageBars, maskReversed)

imageBarsCropped 看起来像:

0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0
0 0 0 0 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

现在,让我们将两个“裁剪”图像组合起来形成旗帜!

imageFlag = cv2.bitwise_or(imageStarsCropped, imageBarsCropped)

imageFlag 看起来像:

1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 0 1 0 1 1 1 1
0 1 0 1 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1
0 0 0 0 0 0 0 0

你知道为什么吗?当 imageStarsCropped[r,c]==1imageBarsCropped[r,c]==1 时,bitwise_or 返回 1 >.

好吧,我希望这能帮助您理解 OpenCV 中的位运算。这些属性与计算机进行算术运算的二进制数的位运算一一对应。

关于python - bitwise_and 运算符在 openCV 中到底做了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44333605/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com