首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在OpenCV (Python)中,为什么我要从灰度图像中获得3个通道的图像?

在OpenCV (Python)中,为什么我要从灰度图像中获得3个通道的图像?
EN

Stack Overflow用户
提问于 2013-09-18 19:07:10
回答 4查看 100K关注 0票数 50

我在Ubuntu12.04上使用Python (2.7)和OpenCV 2.4.6的绑定

我加载一个图像

代码语言:javascript
复制
    image = cv2.imread('image.jpg')

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

代码语言:javascript
复制
    print image.shape

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

代码语言:javascript
复制
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    print gray_image.shape

我得到了(480,640,1),对于640x480 灰度图像,我希望得到(480,640,1)。然后我保存图像:

代码语言:javascript
复制
    cv2.imwrite('gray.jpg', gray_image)

我使用的是linux,所以我试着用gThumb查看图像,它显示了所有的颜色通道。当我将灰色图像带回OpenCV时,图像又有三个通道。我知道这个用于读取图像的标志:

代码语言:javascript
复制
    CV_LOAD_IMAGE_GRAYSCALE - If set, always convert image to the grayscale one

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

编辑:我做了一些计时检查,我发现使用CV_LOAD_IMAGE_GRAYSCALE标志集加载图像时,无论图像输入如何,图像加载速度都会提高一倍。

代码语言:javascript
复制
     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通道图像?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-09-18 19:46:39

您的代码是正确的,除非设置了CV_LOAD_IMAGE_GRAYSCALE,否则cv2.imread似乎会加载具有三个通道的图像。

代码语言:javascript
复制
>>> 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)

现在,如果您加载图像:

代码语言:javascript
复制
>>> image = cv2.imread('gray.jpg')
>>> print image.shape
 (184, 300, 3)

看起来你已经将图像保存为BGR,但这不是真的,它只是opencv,默认情况下它用3个通道读取图像,在这种情况下它是灰度的,它复制它的层三次。如果您再次使用scipy加载图像,您可以看到该图像确实是灰度的:

代码语言:javascript
复制
>>> from scipy.ndimage import imread
>>> image2 = imread('gray.jpg')
>>> print image2.shape
 (184, 300)

因此,如果要加载灰度图像,则需要设置CV_LOAD_IMAGE_GRAYSCALE标志:

代码语言:javascript
复制
>>> image = cv2.imread('gray.jpg', cv2.CV_LOAD_IMAGE_GRAYSCALE)
>>> print image.shape
 (184, 300)
票数 73
EN

Stack Overflow用户

发布于 2017-07-20 20:17:34

试试这个:

代码语言:javascript
复制
 img = cv2.imread('gray.jpg',0)

灰色的和彩色的1

票数 20
EN

Stack Overflow用户

发布于 2013-09-18 19:44:15

在openCV中,默认情况下读取jpg图像会产生3个通道的图像。所以我不确定你是否真的能从jpg文件中看到它已经是灰度的,但是你总是可以把它加载成灰度的。只有在图像没有事先灰度化的情况下,它才会带来问题,对于你的情况,我相信它不会起作用。所以简短的回答是:你不能将jpg保存为一个经过处理的图像。因此,你需要在阅读后再次灰度化它或找出新的方法来确定图像是否灰度化。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18870603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档