我在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通道图像?
4条答案
按热度按时间li9yvcax1#
您的代码是正确的,除非设置
CV_LOAD_IMAGE_GRAYSCALE
,否则cv2.imread
似乎会加载具有三个通道的图像。现在,如果加载图像:
看起来你已经将图像保存为BGR了,但是这不是真的,它只是opencv,默认情况下它读取3个通道的图像,如果是灰度的,它会复制三次图层。如果你再次用scipy加载图像,你会看到图像确实是灰度的:
因此,如果要加载灰度图像,则需要设置
CV_LOAD_IMAGE_GRAYSCALE
标志:vsnjm48y2#
试试这个:
ltqd579y3#
如果您想在使用OpenCV加载图像时保留原始通道数(如@Gall的评论中所述):
cv2.IMREAD_GRAYSCALE
-将所有内容转换为灰度。如果您还希望保留原始深度(即
int16
),而不是隐式int8
转换(默认情况下):qybjjes14#
在openCV阅读jpg图像结果3通道图像默认情况下。所以我不知道如果你真的可以看到从jpg文件,它已经灰度,但你总是可以加载它作为灰度。它会带来的问题,只有当图像没有灰度事先和你的情况下,我相信它不会工作。所以简短的回答:你不能将jpg另存为onechanneled图像。所以你需要在阅读后再次灰度化它,或者找出新的方法来确定图像是否灰度化。