OpenCV(4.0.0)Python错误:(-215:断言失败)(mtype == CV_8U || mtype == CV_8S)&& _mask.sameSize(* psrc1)在函数“cv :: binary_op”中。

4
我正在尝试使用OpenCV的位非运算符在图像上应用掩码。如果我将原始图像和掩码图像都以灰度模式读取,则可以实现此结果,但在3通道图像上无法实现。
我已阅读此线程OpenCV Python Error: error: (-215) (mtype == CV_8U || mtype == CV_8S) && _mask.sameSize(*psrc1) in function cv::binary_op,但我的问题不是数组形状或掩码不是uint8格式。
import cv2
import numpy as np 

img = cv2.imread("Original.png") # original image, shape 544,480,3, dtype uint8
label = cv2.imread("Mask.png") # black and white mask,shape 544,480,3, dtype uint 8
shape = img.shape # 544,480,3
black_background = np.zeros(shape=shape, dtype=np.uint8)
result = cv2.bitwise_not(img,black_background,mask=label) # this is where error occurs
cv2.imwrite("masked.png",result)

我希望输出的结果是原始图像与标签掩码合并,但我遇到了错误。
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'


我们能够重现您的错误,唯一的方法就是您发布“Original.png”和“Mask.png”。 - beaker
抱歉,我无法发布用于此代码的图像,因为我的公司不允许发布我们的数据。我可以提供每个图像的形状和数据类型。 以下是代码打印的内容: uint8 (544, 480, 3) uint8 (544, 480, 3) uint8 (544, 480, 3) - Andrei Tsitsvidze
1个回答

3
根据错误提示,问题实际上是掩模形状。从文档中得知:
掩模 - 可选操作掩模,8位单通道数组,指定要更改的输出数组的元素。
您的标签是一个3通道图像,不兼容;这就是为什么灰度工作的原因,但由于您的Mask.png实际上是一张黑白图片,您应该毫不犹豫地使用它:
label = cv2.imread("Mask.png", cv2.IMREAD_GREYSCALE)

谢谢您的回复。我已将“label = cv2.imread("Mask.png")”更改为“label = cv2.imread("Mask.png",0)”,但仍然出现相同的错误。 - Andrei Tsitsvidze
你能提供更多的信息吗?你检查了图像和标签的形状吗?我刚刚进行了一次测试,结果如预期。 - DLM
好的。我已经运行了这段代码 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") 读取图像而没有使用其他模式。 - Andrei Tsitsvidze
如果您将标签读取为灰度图像,是否仍然会出现完全相同的错误?如果使用其他图像是否也会发生这种情况? 这是我的实验:https://colab.research.google.com/drive/1Z9ivwCnjXvNYdQ-TlPEb3XjiTzi51ekM - DLM
更改标签图像有所帮助。我想知道如何更改输出图像,使其不是负数,然后我在从中减去黑色背景之前简单地添加了 img = cv2.bitwise_not(img)。再次感谢您的回复。 - Andrei Tsitsvidze

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