为什么在Python的cv2.bitwise中要使用相似参数?例如:cv2.bitwise_and(roi,roi,mask=mask_inv)。

4

我尝试在不同的网站上搜索解释,但是没有得到一个完全解释清楚的答案。


(Note: I did not remove the HTML tags as instructed.)
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()

1
为什么你这样写?或者你这段代码是从哪里得来的?也许如果你每一步之后查看图像,就能弄明白它了。它工作吗? - fmw42
可能是 https://dev59.com/41wY5IYBdhLWcg3wTWMu 的重复问题。 - Anubhav Singh
1个回答

4
我同意,如果有这样的功能,将更加自然:

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'

第一个问题是为什么它不起作用。事实上,roi和mask_inv数组具有不同的形状:(rows,cols,channels)(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. 将掩码应用于结果,即在掩码为零的任何像素处使其等于零(==黑色)。
在这种典型的用法中,不使用该函数的第一部分,前两个参数使此部分起作用像标识符,它不会更改数组。所以你可以通过把前两个参数相等的技巧来绕过第一部分。第二部分是唯一应用于这种典型用法的部分。
P.S. 更多信息请参见评论中的答案链接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接