调用cv2.bitwise_and触发输入参数尺寸不匹配错误,如何解决?
问题分析与解决方案
错误原因
你遇到的Sizes of input arguments do not match错误,本质是通道数不匹配:
cv2.imread(image_file)读取的是3通道的BGR图像(形状为(高度, 宽度, 3))- 你通过
cv2.COLOR_GRAY2BGRA将单通道灰度mask转成了4通道的BGRA图像(形状为(高度, 宽度, 4))
两者通道数不同,导致cv2.bitwise_and无法执行运算。
修正方案
方案一:直接使用单通道mask作为掩码(推荐)
cv2.bitwise_and支持传入单通道mask作为第三个参数,自动作用于图像的每个通道,无需转换通道数:
def remove_watermark(image_file, mask_file, output_file): image = cv2.imread(image_file) mask = cv2.imread(mask_file, cv2.IMREAD_GRAYSCALE) blurred_mask = cv2.GaussianBlur(mask, (5, 5), 0) _, binary_mask = cv2.threshold(blurred_mask, 127, 255, cv2.THRESH_BINARY) # 直接用binary_mask作为掩码,无需转BGRA result = cv2.bitwise_and(image, image, mask=binary_mask) cv2.imwrite(output_file, result)
方案二:统一通道数(将图像转成4通道)
如果需要保留4通道格式,可以把原图像转成BGRA,再和4通道mask运算:
def remove_watermark(image_file, mask_file, output_file): image = cv2.imread(image_file) # 转成BGRA4通道 image_bgra = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA) mask = cv2.imread(mask_file, cv2.IMREAD_GRAYSCALE) blurred_mask = cv2.GaussianBlur(mask, (5, 5), 0) _, binary_mask = cv2.threshold(blurred_mask, 127, 255, cv2.THRESH_BINARY) alpha_mask = cv2.cvtColor(binary_mask, cv2.COLOR_GRAY2BGRA) result = cv2.bitwise_and(image_bgra, alpha_mask) cv2.imwrite(output_file, result)
额外注意:路径转义问题
Windows路径中的反斜杠\可能被识别为转义字符(比如\i),建议用原始字符串或双反斜杠:
image_file = r'I:\python\lpo\images\cf.jpg' mask_file = r'I:\python\lpo\images\heko.png' output_file = r'I:\python\lpo\images\iwo.png'
内容的提问来源于stack exchange,提问作者Jykito Kha
相关产品推荐
相关产品推荐

