python - 如何用opencv为python编写灰色(1 channel )图像

标签 python opencv

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

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 中添加一些参数,但我不知道是什么。

最佳答案

是的。让我详细说明@Miki's comment你的回答。如果您查看 imread(filename[, flags]) 的文档,您将看到默认标志为 cv2.IMREAD_COLOR ,即默认情况下,OpenCV 将加载具有 3 个 channel 的图像(即使它有 1 个或 4 个 channel )。如果您想使用相同的 imread(...)要加载三 channel 和单 channel 图像,您应该使用标志 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)
    

    因此,实际上,灰度图像被“保存”为单 channel 。

    关于python - 如何用opencv为python编写灰色(1 channel )图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54639394/

    相关文章:

    python - 如何在 while 循环中附加列表而不覆盖以前的结果

    python - Jira Python 自定义字段

    python - 从 Python 中的图像中减去 RGB 值

    c++ - 来自无符号短数组的 OpenCV Mat

    python - 使用 OpenCV python 捕获 rtsp 相机

    python - AWS Lambda boto3 : Filter Instances by Launch Time = today

    python - Python 中的虚拟对象

    python - 如何让 HoughLines 识别这张图片中的其余线条?

    c++ - 在OpenCV C++中创建空白图像

    opencv - 将一幅图像中的像素重新投影到另一幅图像中