使用numpy修改图像像素值失败且触发OpenCV报错如何解决
报错中文翻译
错误:OpenCV(4.5.3) C:/Users/runneradmin/AppData/Local/Temp/pip-req-build-sn_xpupm/opencv/modules/highgui/src/precomp.hpp:155: 错误: (-215:断言失败) src_depth != CV_16F && src_depth != CV_32S 位于函数 'convertToShow'
报错原因
np.where返回的数组默认是32位有符号整数(int32)类型,对应OpenCV里的CV_32S类型,cv.imshow原生不支持显示该类型的数组,触发了源码里的断言检查失败,进而导致报错甚至内核崩溃。- 额外的逻辑问题:你当前
mask == a的写法是逐通道进行匹配判断,会把单个通道匹配的位置也赋值为255,无法实现「BGR三个通道值完全等于目标像素的像素点替换为白色」的需求。
修复方案
你可以按照下面的逻辑修改代码:
- 先生成所有三通道完全匹配目标像素的掩码
- 把匹配到的像素点统一赋值为白色
- 确保最终传给
cv.imshow的数组是uint8类型
修复后的完整代码:
import numpy as np import cv2 as cv mask = cv.imread("colors.jpg") # 目标像素值,注意OpenCV读入的图片是BGR通道顺序 target_bgr = mask[400,500] print(target_bgr) # [204 71 63] # 生成三通道完全匹配的掩码,维度和原图一致方便赋值 match_mask = (mask == target_bgr).all(axis=-1, keepdims=True) # 匹配的位置设为白色,其他位置保留原图,也可以根据需求设为0 b = np.where(match_mask, 255, mask).astype(np.uint8) cv.imshow("mask", b) cv.waitKey(0) cv.destroyAllWindows()
如果你需要生成二值图(匹配为白,不匹配为黑),可以把赋值行改成:
b = np.full_like(mask, 0, dtype=np.uint8) b[match_mask.repeat(3, axis=-1)] = 255
内容的提问来源于stack exchange,提问作者purple_coder
相关产品推荐
相关产品推荐

