为什么直接用 cv2.imwrite 保存 PIL 的图片会导致奇怪的颜色?

在处理图像保存时,使用不同的库可能会导致颜色显示上的差异。特别是 Image.fromarray(synthesis).savecv2.imwrite(save_dir, image) 两种方法之间的区别,会导致保存的图像颜色不同。这篇博客将解释这些方法的区别,以及具体导致颜色差异的原因。

PIL和OpenCV简介

  • PIL(Python Imaging Library)
    PIL 是一个处理图像的强大库,主要用于图像的打开、操作和保存。在 PIL 中,常用的图像对象是 PIL.Image 对象。

  • OpenCV(Open Source Computer Vision Library)
    OpenCV 是一个用于计算机视觉和图像处理的开源库,提供了丰富的功能。OpenCV 处理图像时使用 numpy 数组作为图像数据结构。

保存图像的两种方法

  1. PIL:Image.fromarray(synthesis).save

    from PIL import Image
    import numpy as np# 生成一个示例图像数组
    synthesis = np.random.randint(0, 256, (100, 100, 3), dtype=np.uint8)# 使用 PIL 保存图像
    Image.fromarray(synthesis).save('image_pil.png')
    
  2. OpenCV:cv2.imwrite(save_dir, image)

    import cv2# 使用 OpenCV 保存图像
    cv2.imwrite('image_cv2.png', synthesis)
    

导致颜色不同的原因

主要的原因是 PIL 和 OpenCV 处理图像通道顺序的不同

  • 通道顺序
    • PIL:使用的通道顺序是 RGB(Red, Green, Blue)。
    • OpenCV:使用的通道顺序是 BGR(Blue, Green, Red)。

这意味着如果直接使用相同的 numpy 数组保存图像,由于 PIL 和 OpenCV 对通道的解释不同,保存的图像会有颜色上的差异。例如,红色和蓝色通道会互换位置。

如何解决颜色差异

为了在保存图像时避免颜色差异,可以在 OpenCV 中保存图像前将通道顺序从 BGR 转换为 RGB。可以使用 cv2.cvtColor 函数来进行转换。

# 将 BGR 转换为 RGB
image_rgb = cv2.cvtColor(synthesis, cv2.COLOR_BGR2RGB)# 使用 PIL 保存图像
Image.fromarray(image_rgb).save('image_pil_corrected.png')

或者在使用 PIL 保存图像前,将通道顺序从 RGB 转换为 BGR:

# 将 RGB 转换为 BGR
image_bgr = cv2.cvtColor(synthesis, cv2.COLOR_RGB2BGR)# 使用 OpenCV 保存图像
cv2.imwrite('image_cv2_corrected.png', image_bgr)

总结

  1. PIL 和 OpenCV 处理图像的通道顺序不同

    • PIL 使用 RGB 顺序。
    • OpenCV 使用 BGR 顺序。
  2. 颜色差异的原因
    直接使用相同的 numpy 数组保存图像时,由于通道顺序不同,颜色会有差异。

  3. 解决方案
    在保存图像前,将通道顺序进行转换,确保图像颜色一致。

通过了解和处理这些差异,可以确保在使用 PIL 和 OpenCV 保存图像时,颜色显示正确。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/29632.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET周刊【6月第3期 2024-06-18】

国内文章 记一次 .NET某游戏币自助机后端 内存暴涨分析 https://www.cnblogs.com/huangxincheng/p/18243233 文章讨论了程序中非托管内存暴涨的问题。作者描述了友人发现内存问题并请他帮助分析的背景,利用WinDbg工具分析Linux平台上的内存泄漏情况。文章介绍了如…

Maven POM:掌握项目对象模型的艺术

Maven POM:掌握项目对象模型的艺术 1. 引言 Maven,作为一个强大的项目管理和构建自动化工具,已经成为了Java社区中不可或缺的一部分。在Maven的世界里,POM(Project Object Model,项目对象模型&#xff09…

N32G031 DMA

目录 N32G031 DMA概述 DMA主要特点 DMA总线架构 DMA使用场景 DMA配置和使用 优点: 缺点: N32G031 DMA概述 N32G031系列芯片基于32位ARM Cortex-M0微控制器,其内置了DMA(直接内存访问)控制器。DMA控制器允许数据…

潮玩宇宙大逃杀APP系统开发成品案例分享指南

这是一款多人游戏,玩家需要选择一个房间躲避杀手。满足人数后,杀手会随机挑选一个房间杀掉里面所有的参与者,其他房间的幸存者将平均瓜分被杀房间的元宝。玩家在选中房间后,倒计时结束前可以自由切换不同房间。 软件项目开发成品…

LabVIEW开发为什么沟通需求非常重要

在LabVIEW开发项目中,需求沟通是项目成功的基石。以下是需求沟通的重要性及其原因: 明确项目目标: 定义清晰的目标:通过与用户的沟通,可以明确项目的目标和范围,确保开发团队理解用户的实际需求&#xff0c…

【Android-Compose】流式布局FlowRow 不能居中对齐的一种解决办法

问题描述: 在安卓Compose 开发中使用LazyColumn 流式布局 FlowRow 有时候比延迟网格布局更灵活,但是也可能出现自动流向下一行之后,末尾处留下一些小空白。如图: 问题解决: 为了尽可能居中对齐,我们可…

专业技能篇---计算机网络篇

文章目录 前言计算机网络基础一、网络分层模型 HTTP一、从输入URL到页面显示发生了什么?二、Http的状态码有哪些?三、 HTTP与HTTPS有什么区别?四、URI 和 URL 的区别是什么?五、Cookie和Session有什么区别?六、GET与POST 前言 主…

dmhs同步因目的端表自增列报错解决方法

dmhs同步因目的端表自增列报错解决方法 1 dmhs copy 装载数据时报错 HY000 CODE:-27232 配置源端捕获器cpt 1 dmhs copy 装载数据时报错 HY000 CODE:-2723 ERR:Only if specified in the column list and SET IDENTITY INSERT is ON, then identity column could be assigned …

2023-2024年新能源汽车市场盘点与展望

本文全面盘点了2023年和2024年新能源汽车市场的新车型、价格走势、智能化趋势以及市场竞争格局,涵盖了各个价格级别和车型类别,为消费者提供购车参考和市场洞察。 文章目录 1.1 2023年新能源汽车市场总结1.2 2024年新能源汽车市场趋势1.3 新车型发布概览…

洛谷 P3379:最近公共祖先(LCA)← RMQ+欧拉序

【题目来源】https://www.luogu.com.cn/problem/P3379【题目描述】 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。【输入格式】 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−…

PostgreSQL源码分析——INSERT

这里我们对INSERT语句进行分析, 只分析其宏观过程,具体细节后续再分析。我们就分析下面的语句的执行过程。 insert into t1 values(4,4);主流程 主流程如下: exec_simple_query --> pg_parse_query //语法解析--> raw_parser-->…

数据库面试题-ElasticSearch

数据库面试题-ElasticSearch 1、ElasticSearch是什么?2、谈谈ElasticSearch分词与倒排索引的原理?3、说说ElasticSearch分段存储的思想?4、说说你对ElasticSearch段合并的策略思想的认识?5、知道什么是文本相似度TF-IDF吗?6、说说ElasticSearch写索引的逻辑?7、说说Elast…

AI大模型的战场:通用大模型VS垂直大模型,谁会赢?

人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…

Clickhouse备份恢复_clickhouse-backup方式备份恢复的使用介绍

https://clickhouse.com/docs/zh/operations/backup https://github.com/Altinity/clickhouse-backup?tabreadme-ov-file#readmeclichouse-backup备份的总结 1、clichouse-backup备份的方式是物理备份 2、clichouse-backup只能在数据库本机运行备份,在远程异机去备…

联合类型和交叉类型

联合类型和交叉类型 在TypeScript中,除了基本的类型(如 number、string、boolean 等),我们还可以使用更加高级的类型来描述复杂的数据结构。其中,联合类型和交叉类型就是两个非常有用的高级类型。 联合类型(Union Types) 联合类型允许一个变量可以是多种类型中的任意一种。我…

Mybatis (plus 也适用)原生直接执行某句SQL

场景 想要不论传入什么sql 都能直接执行 示例 Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void executeSql(String replaceSql) {if (StringUtils.isEmpty(replaceSql)) {return;}try {SqlSession sqlSession sqlSessionTemplate.getSqlSessionFactory…

二、利用YOLOv8解决现实世界的问题

Ultralytics Solutions提供顶尖的YOLO模型应用,提供现实世界的解决方案如:目标记数,模糊和安全系统,提升效率和准确率在各种工业中。探索YOLOv8在实用性和有效性上的强大功能。 解决方案: 下面展示利用Ultralytics So…

abstract 的 method 是否可同时是 static,是否可同时是 native,是否可同时是 synchronized?

在 Java 中,abstract 方法不能同时是 static、native 或 synchronized。让我们详细解释每种情况,并提供相应的代码示例和解释: abstract 方法不能是 static: abstract 方法必须被子类实现,而 static 方法是与类相关的&…

使用vscode插件du-i18n处理前端项目国际化翻译多语言

前段时间我写了一篇关于项目国际化使用I18n组件的文章,Vue3 TS 使用国际化组件I18n,那个时候还没真正在项目中使用,需求排期还没有定,相当于是预研。 当时就看了一下大概怎么用,改了一个简单的页面,最近需…

【Python系列】Python 中的日期和时间处理

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…