在OpenCV(Python)中,为什么我会从灰度图像获取3通道图像?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (919)

我在Ubuntu 12.04上使用Python(2.7)和OpenCV 2.4.6的绑定

我加载一张图片

    image = cv2.imread('image.jpg')

然后我检查图像数组的形状

    print image.shape

我得到了(480,640,3),这是我期望的640x480彩色图像。然后将图像转换为灰度并再次检查形状。

    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    print gray_image.shape

我得到(480,640,1),这是我期望的640x480 灰度图像。然后我保存图像:

    cv2.imwrite('gray.jpg', gray_image)

我在linux上,所以我试着用gThumb看图片,它显示了所有的颜色通道。当我将灰色图像带回到OpenCV时,图像又有三个通道。我知道这个标志阅读图像:

    CV_LOAD_IMAGE_GRAYSCALE - If set, always convert image to the grayscale one

但是这听起来像是要将图像作为彩色图像引入,然后将其转换。我将这个项目移植到RaspberryPi,所以我不希望发生不必要的操作。

编辑:我做了一些时间检查,我发现使用CV_LOAD_IMAGE_GRAYSCALE标志加载图像将图像加载速度提高两倍,而不管图像输入如何。

     Using a 3072 x 4608 x 3 image
     0.196774959564 seconds with default loading
     0.0931899547577 seconds with CV_LOAD_IMAGE_GRAYSCALE

问题似乎是OpenCV正在创建一个3通道JPG输出,无论我是否有灰度图像矩阵!

提问于
用户回答回答于

你的代码是正确的,似乎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个通道的图像,如果是灰度图像,则会将其图层复制三次。如果你用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)
用户回答回答于

试试这个:

 img = cv2.imread('gray.jpg',0)

0对于灰色和用于颜色

扫码关注云+社区

领取腾讯云代金券