在OpenCV(Python)中,为什么我要从灰度图像中获取3个通道图像?
image-processing
opencv
python
4
0

我在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输出!

我还能使用什么其他应用程序来确保获得单个8位通道JPG图像? (也许gThumb错误报告了通道)。

如果图像不是单通道,为什么在磁盘写入时OpenCV将我的灰度图像保存到3通道图像?

提前致谢。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

您的代码是正确的,似乎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)
收藏
评论

尝试这个:

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

0代表灰色, 1代表彩色

收藏
评论

在openCV中,读取jpg图像会默认生成3个通道图像。所以我不确定您是否真的可以从jpg文件中看到它已经是灰度的,但是您始终可以将其加载为灰度的。仅当图像未事先进行灰度处理时,它才会带来问题,对于您的情况,我相信它将无法正常工作。答案很短:您无法将jpg保存为单通道图像。因此,在阅读或找出新方法确定图像是否为灰度后,您将需要再次对其进行灰度处理。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号