OpenCV处理灰度图像时如何移除多余的第三维通道
Vimba API采集图像转OpenCV灰度图的格式问题解决
问题描述
使用Allied Vision相机搭配官方Vimba API采集图像帧时,灰度格式转换环节出现OpenCV接口不兼容问题,初始实现代码如下:
with Vimba.get_instance() as vimba: cams = vimba.get_all_cameras() with cams[0] as camera: recv_image = camera.get_frame() recv_image.convert_pixel_format(PixelFormat.Mono8) t1 = recv_image.as_opencv_image() # t1维度为(xx,xx,1),需要移除最后一个冗余通道 cv2image = cv2.cvtColor(t1, cv2.COLOR_BGR2GRAY) # 运行报错:cv2.cvtColor不支持(xx,xx,1)维度的输入
- 核心报错原因:
as_opencv_image()返回的Mono8格式图像是三维单通道数组(维度为(高, 宽, 1)),而OpenCV的灰度图标准格式是二维数组(维度为(高, 宽)),维度不匹配导致颜色转换接口调用失败。
临时绕路方案
最初为了快速验证效果,采用了存图再读取的冗余方案实现格式转换,虽然功能可用但磁盘IO开销大、运行效率低,代码如下:
recv_image.convert_pixel_format(PixelFormat.Mono8) cv2.imwrite('cv2image.jpg', recv_image.as_opencv_image()) cv2image = cv2.imread('cv2image.jpg',0)
最终简洁方案
参考Christoph给出的numpy维度转换思路,放弃写盘读盘的绕路逻辑,直接通过numpy的维度压缩接口去除冗余的最后一维,得到的二维数组就是OpenCV可正常识别的标准单通道灰度图,所有OpenCV图像处理接口均可正常调用,实现代码如下:
frame.convert_pixel_format(PixelFormat.Mono8) a = frame.as_opencv_image() b = np.array(a) cv2image = np.squeeze(b)
注:
np.squeeze()的作用是移除数组中长度为1的维度,处理后数组维度从(高,宽,1)变为(高,宽),完全匹配OpenCV单通道灰度图的格式要求。
内容的提问来源于stack exchange,提问作者adameye2020
相关产品推荐
相关产品推荐

