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

标签 python opencv

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

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/

相关文章:

python - 如何用wxpython设置相对位置?

Python - 对元组列表进行分组和求和

python - Python 中的运算符优先级 -PEMDAS

python - 获取矩形内圆的轮廓

python - 基于 Opencv 和 Grip 视觉机 [TypeError : src is not a numpy array, 既不是标量]

python - python 忽略csv文件中的括号

python - 如何将多个列表中的元素写入 csv,其中每个元素属于每一行?

opencv - 我如何在 OpenCV 中计算平均轮廓

c++ - CvCvtColor(srcImage,destImage,CV_BGR2Lab)不工作

python - opencv python中的特定像素如何透明?