OpenCV调用COLOR_BGR2GRAY报错输入图像通道数无效求助
报错原因及修复方案
核心错误点
- 触发
Invalid number of channels报错的直接原因:你调用cv2.medianBlur()时传入的img变量,已经在之前K-means预处理阶段被img = img.reshape(-1,3)修改为了形状为[总像素数, 3]的二维扁平化数组。而OpenCV的滤波、颜色空间转换类函数要求输入为标准的[高度, 宽度, 通道数]三维图像结构,输入格式不符合要求导致处理后通道数异常,后续转灰度时直接触发报错。 - 你代码还存在一个前置逻辑错误:
for i in range(new_image.shape[0]):这行执行时,new_image还没有被定义,会提前报变量未定义错误,只是当前你先触发了通道数报错,还没运行到这一步。 - 小细节错误:转灰度时你用了
cv2.cv2.COLOR_BGR2GRAY,存在多余的cv2前缀,且此时图像已经转为RGB颜色空间,用BGR转灰度的参数会导致颜色处理结果偏差。
修复代码示例
替换K-means拟合后的对应代码段即可:
colors = np.array(colors, dtype="uint8") # 先初始化new_image,避免变量提前引用报错 new_image = np.zeros_like(img) for i in range(new_image.shape[0]): new_image[i] = colors[model.labels_[i]] # 还原为标准三维图像格式 new_image = np.reshape(new_image, (x,y,z)) plt.imshow(new_image) # 滤波和阈值处理使用还原后的三维图像,不要用扁平化的img blurred = cv2.medianBlur(new_image, 5) # 替换为正确的颜色空间转换参数 grey_blur = cv2.cvtColor(blurred, cv2.COLOR_RGB2GRAY) thresh = cv2.adaptiveThreshold(grey_blur, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 15, 5) combined = cv2.bitwise_and(new_image, new_image, mask=thresh) # Jupyter环境建议用matplotlib展示图像,避免cv2.imshow卡顿无响应 plt.imshow(combined) reg_img = cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR) cv2.imwrite('C:\\Users\\holli\\OneDrive\\Pictures\\python photos\\lai_img_seg.jpg', reg_img)
补充说明
你之前考虑的保存图像再读入的方案不需要使用,该报错本质是数组形状不符合OpenCV函数要求,只要传入正确结构的三维图像即可正常运行。
内容的提问来源于stack exchange,提问作者Jesse Holliday
相关产品推荐
相关产品推荐

