gpt4 book ai didi

python - 为什么在 python cv2.bitwise 中使用类似的源参数?示例 :cv2. bitwise_and(roi,roi,mask = mask_inv)

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

我试过在不同的网站上搜索解释,但我没有得到一个完整解释的答案。

import cv2
import numpy as np
img1 = cv2.imread('3D-Matplotlib.png')
img2 = cv2.imread('mainlogo.png')
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 220, 255, cv2.THRESH_BINARY_INV)
mask_inv = cv2.bitwise_not(mask)

#why using similar argument two times?
img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)

img2_fg = cv2.bitwise_and(img2,img2,mask = mask)
dst = cv2.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv2.imshow('res',img1)
cv2.waitKey(0)
cv2.destroyAllWindows()

最佳答案

我同意如果这行得通会更自然:

img1_bg = cv2.bitwise_and(roi, mask_inv) # will not work
#raises cv2.error: /modules/core/src/arithm.cpp:225: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and type), nor 'array op scalar', nor 'scalar op array' in function 'binary_op'

第一个问题是为什么没有。问题是,roimask_inv 数组有不同的形状:(rows, cols, channels) vs (rows, cols, 1)。我猜想,OpenCV 库的作者想要防止静默形状转换,这可能是不安全的,并且会引入难以捕获的错误,因此决定实现检查,确保前两个参数具有相同的形状。

第二个问题是为什么这样做:

img1_bg = cv2.bitwise_and(roi, roi, mask_inv)

简而言之,答案是对于任何整数数组(如 roi),

roi == cv2.bitwise_and(roi, roi)

这成立是因为 0 & 0 == 01 & 1 == 1 位。但是 cv2.bitwise_and 函数实际上是两个的组合:

  1. 将前两个参数按位应用于图像
  2. 对结果应用掩码,即使掩码为零的任何像素等于零(== 黑色)。

在您呈现的这种典型用法中,未使用此函数的第一部分,这两个参数使这部分像标识一样工作,它不会更改数组。因此,您可以通过使前两个参数相等的技巧来绕过第一部分。第二部分是唯一的一部分,用于此典型用法。

附言请查看答案,链接在评论中以获取更多信息。

关于python - 为什么在 python cv2.bitwise 中使用类似的源参数?示例 :cv2. bitwise_and(roi,roi,mask = mask_inv),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57445397/

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