您的代码是正确的,似乎cv2.imread
负载的图像与三个通道,除非CV_LOAD_IMAGE_GRAYSCALE
设置。
>>> import cv2
>>> image = cv2.imread('foo.jpg')
>>> print image.shape
(184, 300, 3)
>>> gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
>>> print gray_image.shape
(184, 300)
>>> cv2.imwrite('gray.jpg', gray_image)
现在,如果您加载图像:
>>> image = cv2.imread('gray.jpg')
>>> print image.shape
(184, 300, 3)
似乎您已将图像另存为BGR,但是事实并非如此,它只是opencv,默认情况下它会读取3个通道的图像,如果是灰度,则会将其图层复制3次。如果再次使用scipy加载图像,您会看到图像确实是灰度的:
>>> from scipy.ndimage import imread
>>> image2 = imread('gray.jpg')
>>> print image2.shape
(184, 300)
因此,如果要加载灰度图像,则需要设置CV_LOAD_IMAGE_GRAYSCALE
标志:
>>> image = cv2.imread('gray.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
>>> print image.shape
(184, 300)
0
我在Ubuntu 12.04上使用Python(2.7)和OpenCV 2.4.6的绑定
我加载图像
然后,我检查图像阵列的形状
我得到(480,640,3),我希望得到640x480的彩色图像。然后,我将图像转换为灰度并再次检查形状。
我得到(480,640,1),我希望得到640x480的灰度图像。然后,我保存图像:
我在linux上,因此我尝试使用gThumb查看图像,该图像显示了所有颜色通道。当我将灰色图像带回OpenCV时,该图像再次具有三个通道。我知道此标志用于读取图像:
但这听起来像是要将图像作为彩色图像导入,然后进行转换。我将此项目移植到RaspberryPi,所以我不想发生不必要的操作。
编辑:我已经进行了一些时序检查,并且发现使用CV_LOAD_IMAGE_GRAYSCALE标志集加载图像会导致图像加载速度快两倍,而与图像输入无关。
问题似乎是无论我是否具有灰度图像矩阵,OpenCV都会创建3通道JPG输出!
我还能使用什么其他应用程序来确保获得单个8位通道JPG图像? (也许gThumb错误报告了通道)。
如果图像不是单通道,为什么在磁盘写入时OpenCV将我的灰度图像保存到3通道图像?
提前致谢。