Python使用OpenCV对图像执行位运算时报错的原因是什么?
报错原因
这个错误的核心原因是参与OpenCV位运算的两个输入图像尺寸/数据类型不匹配:
- 你代码中手动创建的
img1尺寸固定为高250px、宽500px、3通道无符号8位整型 - 读取的本地图像
img2(blackie.jpg)的宽高、通道数和img1不一致,OpenCV的位运算要求两个输入数组必须拥有完全相同的尺寸和数据类型才能执行计算。
额外小概率原因:blackie.jpg路径错误导致cv2.imread读取失败返回None,也会触发参数不匹配错误。
解决方法
按以下步骤修改即可:
- 先增加读取校验和尺寸打印逻辑,确认问题根因
- 统一两个图像的尺寸、通道数、数据类型后再执行位运算
修正后的示例代码
import cv2 import numpy as np # 先读取目标图像 img2 = cv2.imread("blackie.jpg") # 校验图像是否读取成功 if img2 is None: raise ValueError("图像读取失败,请检查blackie.jpg的文件路径是否正确") # 按照img2的尺寸创建掩码img1,保证两者尺寸完全一致 h, w = img2.shape[:2] img1 = np.zeros((h, w, 3), np.uint8) # 可根据需求调整矩形绘制坐标,这里示例适配原图的居中位置 rect_x1, rect_y1 = w//2 - 50, 0 rect_x2, rect_y2 = w//2 +50, 100 img1 = cv2.rectangle(img1, (rect_x1, rect_y1), (rect_x2, rect_y2), (255, 255, 255), -1) # 确认两者参数一致后再执行位运算 print(f"img1参数:尺寸{img1.shape},类型{img1.dtype}") print(f"img2参数:尺寸{img2.shape},类型{img2.dtype}") bitAnd = cv2.bitwise_and(img2, img1) bitOr = cv2.bitwise_or(img2, img1) bitXor = cv2.bitwise_xor(img1, img2) bitNot1 = cv2.bitwise_not(img1) bitNot2 = cv2.bitwise_not(img2) cv2.imshow("img1", img1) cv2.imshow("img2", img2) cv2.imshow('bitAnd', bitAnd) cv2.imshow('bitOr', bitOr) cv2.imshow('bitXor', bitXor) cv2.imshow('bitNot1', bitNot1) cv2.imshow('bitNot2', bitNot2) cv2.waitKey(0) cv2.destroyAllWindows()
如果你需要保留img1的250*500尺寸,也可以把img2resize到对应尺寸:
# 把img2调整为和img1相同的尺寸,注意resize参数顺序是(宽,高) img2 = cv2.resize(img2, (img1.shape[1], img1.shape[0]))
如果img2是单通道灰度图,需要先转成3通道再计算:
img2 = cv2.cvtColor(img2, cv2.COLOR_GRAY2BGR)
内容的提问来源于stack exchange,提问作者Saumya
相关产品推荐
相关产品推荐

