image - 如何将 RGB 图像转换为单通道灰度图像,并使用 python 保存?
问题描述
问题很简单。我有很多 3 通道 RGB 图像。(它们的颜色已经是灰色的,但你知道,RGB 格式。)我想要将它们转换为具有 1 通道的灰度图像。
我尝试使用opencv来做到这一点。但是在我用png格式保存后,它就毁了。我认为png文件的结构是原因......
无论如何,有什么好的方法可以做到这一点吗?对 1 通道图像格式的推荐也将不胜感激。
解决方案
如果您有几十个图像,将它们全部转换为 OpenCV 可以读取的单通道灰度图像的快速方法是使用终端中的ImageMagick - 它包含在大多数 Linux 发行版中,可用于 macOS 和 Windows。因此,要制作当前目录中所有 PNG 的单通道 8 位PGM版本:
magick mogrify -format PGM -colorspace gray -depth 8 *.png
如果你有成百上千的图像,也可以使用GNU Parallel来让你的所有 CPU 内核并行运行:
parallel -X magick mogrify -format PGM -colorspace gray -depth 8 ::: *.png
但是,我不建议您这样做,因为您需要考虑许多其他事情:
如果您的图像包含重要的元数据,您需要选择保留它的格式,而不是 PGM
如果您的图像包含浮点像素数据,您可能应该使用 TIFF 格式
如果您的目的是节省磁盘空间(在这个几乎免费存储的时代,这似乎很愚蠢),您应该考虑使用可压缩格式
如果您的目的是节省 RAM,则可能根本不需要这样做,因为您可以在加载时将图像转换为单通道,例如OpenCV
imread(...cv2.IMREAD_GRAYSCALE)
因此,您需要更清楚地了解您的数据和目的。另请注意,许多人声称要节省“内存”,他们可能指的是磁盘或 RAM。
还请记住,PNG 可以保存 8 位或 16 位图像、彩色或灰度图像,以及带有或不带有调色板(取决于颜色的数量),后续应用程序可能无法处理。
推荐阅读
- css - CSS背景动画:不断地从上到下移动图像
- python - 如何在python中发送帖子请求
- c# - 将人们在 C# 中的 DataTable 中输入的值发送到微控制器
- asp.net - Serilog 未将日志插入数据库表
- linux - AWS-Linux-Docker-Selenium 网格无法启动服务 chrome:端口已分配错误
- flutter - 如何在颤动中实现超时按钮
- domain-driven-design - 处理需要生成多个命令的单个请求的 CQRS 和事件溯源方式
- arrays - 什么是创建结构并向其写入元素的正确方法,但在 C 中存在限制
- sql - 如何计算表 SQL Vertica 中的天数?
- python - Python:使用在类初始化中执行的代码来模拟或修补类