为什么直接用 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 保存图像时,颜色显示正确。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值