OpenCV(4.0.0)Python错误:(-215:断言失败)(mtype==CV_8U | | mtype==CV_8S)&&_函数中的mask.sameSize(*psrc1)';cv::二进制运算';

OpenCV(4.0.0)Python错误:(-215:断言失败)(mtype==CV_8U | | mtype==CV_8S)&&_函数中的mask.sameSize(*psrc1)';cv::二进制运算';,python,python-3.x,opencv,bitwise-not,Python,Python 3.x,Opencv,Bitwise Not,我正在尝试使用opencv按位not在图像上应用掩码。如果我在灰度模式下同时读取原始图像和遮罩图像,我就能够达到这个效果,但它在3通道图像上不起作用 我读过这篇文章,但我的问题不是数组的形状或掩码不是uint8格式 导入cv2 将numpy作为np导入 img=cv2.imread(“Original.png”)#原始图像,形状544480,3,数据类型uint8 label=cv2.imread(“Mask.png”)#黑白面具,形状544480,3,数据类型uint 8 形状=img.sha

我正在尝试使用opencv按位not在图像上应用掩码。如果我在灰度模式下同时读取原始图像和遮罩图像,我就能够达到这个效果,但它在3通道图像上不起作用

我读过这篇文章,但我的问题不是数组的形状或掩码不是uint8格式

导入cv2
将numpy作为np导入
img=cv2.imread(“Original.png”)#原始图像,形状544480,3,数据类型uint8
label=cv2.imread(“Mask.png”)#黑白面具,形状544480,3,数据类型uint 8
形状=img.shape#544480,3
黑色背景=np.zero(shape=shape,dtype=np.uint8)
结果=cv2。按位_not(img,黑色_背景,掩码=标签)#这是发生错误的地方
cv2.imwrite(“masked.png”,结果)
我希望输出是原始图像,用标签屏蔽,我得到错误核心

OpenCV(4.0.0) C:\projects\opencv-python\opencv\modules\core\src\arithm.cpp:245: error: (-215:Assertion failed) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function 'cv::binary_op'


错误提示,问题实际上是遮罩形状。从:

掩码–可选操作掩码,8位单通道阵列,指定要更改的输出阵列元素

您的
标签
为3通道图像,不兼容;这就是为什么灰度可以工作的原因,但是由于你的
Mask.png
实际上是黑白图像,你应该毫不担心地使用它:

label = cv2.imread("Mask.png", cv2.IMREAD_GREYSCALE)

谢谢你的回复。我用
label=cv2.imread(“Mask.png”)
更改了
label=cv2.imread(“Mask.png”,0)
。还是有同样的错误你能给我提供更多的信息吗?你检查过图像和标签形状了吗?我现在已经运行了一个测试,它按照预期工作。好的。我已经运行了这个代码
print(img.dtype,img.shape)print(label.dtype,img.shape)print(black_background.dtype,img.shape)
,结果是
uint8(544,480,3)uint8(544,480,3)uint8(544,480,3)
。因此,我在使用
cv.imread(“path/to/image”)
读取图像时,没有其他模式。如果您以灰度图像的形式读取标签,您仍然会得到相同的错误?如果使用其他图像,是否也会发生这种情况?这是我的实验:改变标签图像有帮助。我想知道如何改变输出图像,使其不是负片,我只是在减去黑色背景之前添加了
img=cv2.bitwise\u not(img)
。再次感谢您的回复。如果您发布
Original.png
Mask.png
,我们就可以重现您的错误。很抱歉,我无法发布用于此代码的图像,因为我的公司不允许发布我们的数据。我能提供的是每个图像的形状和数据类型
print(img.dtype,img.shape)print(label.dtype,img.shape)print(black_background.dtype,img.shape)
uint8(544480,3)uint8(544480,3)uint8(544480,3)