我只是想知道是否有可能从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中添加一些参数,但是我不知道是什么。
答案 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
有两件事要注意:
现在,如果使用默认标志读取这些图像中的任何图像,则将以(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)
因此,实际上,灰色图像被“保存”为单通道。