如何使用opencv为python编写灰色(1通道)图像

时间:2019-02-11 21:26:04

标签: python opencv

我只是想知道是否有可能从rgb图像开始使用opencv保存灰色1通道图像。

import cv2
bgr_img = cv2.imread('anyrgbimage.jpg')
print(bgr_img.shape) #(x,y,3)
gray_img = cv2.cvtColor(bgr_img,cv2.COLOR_BGR2GRAY)
cv2.imwrite('hopefully_gray_image.jpg',gray_img)
#cv2.imwrite('hopefully_gray_image.jpg',gray_img,[int(cv2.COLOR_BGR2GRAY)])
buh_img = cv2.imread('hopefully_gray_image.jpg')
print(buh_img.shape) #(x,y,3)

我知道我可以在cv2.imwrite中添加一些参数,但是我不知道是什么。

1 个答案:

答案 0 :(得分:2)

是的。让我详细说明@Miki's comment的答案。如果您查看imread(filename[, flags])的文档,将会看到默认标志为cv2.IMREAD_COLOR,即,默认情况下,OpenCV将使用3个通道加载图像(即使它具有1或4个通道)渠道)。如果要使用相同的imread(...)来加载三通道和单通道图像,则应使用标志cv2.IMREAD_UNCHANGED。实际上,这是如何工作的?

import cv2
import numpy as np

img = (np.random.random((300, 300, 3)) * 255.).astype(np.uint8)
# let's save 4 images (color/gray, png/jpg)
cv2.imwrite('img-png-color.png', img)          # output size: 270KB
cv2.imwrite('img-png-gray.png', img[:, :, 1])  # output size: 90KB
cv2.imwrite('img-jpg-color.jpg', img)          # output size: 109KB
cv2.imwrite('img-jpg-gray.jpg', img[:, :, 1])  # output size: 93KB

有两件事要注意:

  • 彩色PNG图像文件比灰色PNG图像大3倍;
  • JPEG运行良好,ty:)

现在,如果使用默认标志读取这些图像中的任何图像,则将以(300,300,3)的形状加载它们。但是,如果按照@Miki告诉您的步骤进行操作:

cv2.imread('img-png-color.png', cv2.IMREAD_UNCHANGED).shape  # (300, 300, 3)
cv2.imread('img-png-gray.png', cv2.IMREAD_UNCHANGED).shape   # (300, 300)
cv2.imread('img-jpg-color.jpg', cv2.IMREAD_UNCHANGED).shape  # (300, 300, 3)
cv2.imread('img-jpg-gray.jpg', cv2.IMREAD_UNCHANGED).shape   # (300, 300)

因此,实际上,灰色图像被“保存”为单通道。