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

fhity93d  于 2022-12-25  发布在  Python
关注(0)|答案(4)|浏览(253)

我在Ubuntu 12.04上使用Python(2.7)和OpenCV 2.4.6的绑定
我加载一个图像

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

然后检查图像数组的形状

print image.shape

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

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

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

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

我使用的是Linux,所以我尝试使用gThumb查看图像,它显示了所有的颜色通道。当我将灰度图像返回OpenCV时,图像又有了三个通道。我知道阅读图像的标志:

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

但这听起来像是要把图像作为一个彩色图像,然后转换它。我把这个项目移植到树莓派,所以我不希望不必要的操作发生。
编辑:我做了一些时间检查,发现使用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通道图像?

li9yvcax

li9yvcax1#

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

>>> 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)
vsnjm48y

vsnjm48y2#

试试这个:

img = cv2.imread('gray.jpg',0)
    • 0**表示灰色,1表示彩色
ltqd579y

ltqd579y3#

如果您想在使用OpenCV加载图像时保留原始通道数(如@Gall的评论中所述):

img_np = cv2.imread("path/to_img", cv2.IMREAD_UNCHANGED)

cv2.IMREAD_GRAYSCALE-将所有内容转换为灰度。
如果您还希望保留原始深度(即int16),而不是隐式int8转换(默认情况下):

img_np = cv2.imread(image_path, cv2.IMREAD_ANYDEPTH | cv2.IMREAD_UNCHANGED)
qybjjes1

qybjjes14#

在openCV阅读jpg图像结果3通道图像默认情况下。所以我不知道如果你真的可以看到从jpg文件,它已经灰度,但你总是可以加载它作为灰度。它会带来的问题,只有当图像没有灰度事先和你的情况下,我相信它不会工作。所以简短的回答:你不能将jpg另存为onechanneled图像。所以你需要在阅读后再次灰度化它,或者找出新的方法来确定图像是否灰度化。

相关问题