我正在使用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
但是这听起来好像会将图像作为彩色图像导入,然后再进行转换。我正在将这个项目移植到树莓派上,所以不希望发生不必要的操作。
编辑:我进行了一些时间检查,发现使用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会创建一个三通道的JPG输出,而不管我是否有灰度图像矩阵!
有哪些其他应用程序可以确保我获取单个8位通道的JPG图像?(也许gThumb错误地报告了通道)。
如果图像不是单通道的,为什么OpenCV要将我的灰度图像保存为一个三通道图像在磁盘写入时?
cv2.IMREAD_UNCHANGED
都是相当安全的。 - Galljupyter
和matplotlib
的任何人而言,这个 让我免于精神崩溃. 特别是,即使是灰度图像,plt.imshow()
仍然使用颜色来增强对比度。请使用plt.imshow(img, cmap='Greys_r')
来覆盖默认设置。 - Hendy