python - 如何用opencv为python编写灰色(1通道)图像
问题描述
我只是想知道是否可以从 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 中添加一些参数,但我不知道是什么。
解决方案
是的。让我详细说明@Miki对您的回答的评论。如果你看一下 的文档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)
因此,实际上,灰度图像被“保存”为单通道。
推荐阅读
- javascript - 如何使用 offset-path CSS 属性将 SVG 路径从其原点位置偏移
- php - 无法使用 PHP 7.3 安装 RAR 扩展
- flutter - Flutter:共享首选项,更改通知程序
- wso2 - api 调用的缓存是如何工作的?
- sql-server - 如何使用存储过程将 SQL 数据记录导出为 CSV 格式?
- python - Yandex Spellchecker API 返回空数组
- r - 如何仅用图例绘制一个空的ggplot?
- mysql - Mysql 多对多选择和排序
- python - 如何在 Cygwin for Windows 10 (x64) 中使用 GDB 调试 python 源代码
- mongodb - 在 MongoDB 中使用 $function new 运算符进行 updateMany 失败