调用cv2.bitwise_and生成图像掩码触发-215断言失败错误如何解决
报错原因分析
- 尺寸不匹配:调用
cv2.bitwise_and时,输入的待处理图像c已经被resize为(480, 380)的尺寸,但用作mask的r是从原始尺寸的image中拆分出来的R通道,二者尺寸不一致,触发了报错中的_mask.sameSize(*psrc1)校验失败。 - 冗余代码导致逻辑混乱:代码中第一个双层for循环没有任何实际作用,仅在反复给b、g、r变量重复赋值,既浪费运行性能,也容易干扰对图像尺寸的判断。
修复方案
核心逻辑是保证mask和待处理图像的尺寸完全对齐,同时简化冗余操作提升运行效率,推荐优先对原图做统一resize后再拆分通道处理,修正后代码如下:
import cv2 image = cv2.imread("CoralImgs/Original.png") # 先统一resize到目标尺寸,避免后续尺寸不匹配 c = cv2.resize(image, (480, 380), interpolation=cv2.INTER_AREA) # 直接拆分resize后图像的BGR通道,无需冗余循环 b, g, r = cv2.split(c) # 用numpy布尔索引替代双层for循环修改像素,效率提升数十倍 r[r < 170] = 0 # 此时r和c尺寸完全一致,可正常调用bitwise_and mask_b = cv2.bitwise_and(c, c, mask=r) cv2.imshow("r", r) cv2.imshow("mask_result", mask_b) cv2.waitKey(0) cv2.destroyAllWindows()
注意事项
cv2.resize的输入参数顺序是(宽, 高),对应图像shape属性的(高, 宽),拆分通道后的单通道图尺寸和原多通道图的高宽完全一致,无需额外调整。- OpenCV要求mask必须是单通道8位整型(CV_8U/CV_8S)格式,本次场景中从BGR拆分出的R通道本身符合格式要求,无需额外转换。
内容的提问来源于stack exchange,提问作者Michael Lees
相关产品推荐
相关产品推荐

