【问题标题】:Pillow script results in image losing saturation / vibrance枕头脚本导致图像失去饱和度/鲜艳度
【发布时间】:2020-07-26 17:01:51
【问题描述】:

我有一个 Python 脚本,它使用 Pillow 将图像调整为 Instagram 大小的图像,原始图像的背景模糊。

前后图像(均为 JPG):

https://app.box.com/s/jpv2mxlncp9871zvx9ygt0be4gf0zc9q

这仅仅是因为“后”JPG 太小而无法反映原始图像中的所有颜色吗? (Instagram 只允许最大 2048x2048 图像,我的原件是从 TIF 转换而来的 JPG,该图像是从尼康数码单反相机拍摄的 24.2 兆像素 RAW 图像转换而来的)。也许这一切都在我的脑海中,但在我看来,“后”图像已经失去了一些饱和度/活力(例如比较黄色的建筑物和车灯)

有没有人遇到过类似的问题? Pillow 中是否有一些默认模式会减少可用颜色的数量?我正在考虑在我的脚本中添加一个额外的饱和步骤,但这似乎是一个 hack。

编辑:在上面的链接中添加了另一个之前/之后的图像对。我也意识到我可以轻松地分享脚本的源代码(GitHub repo):

https://github.com/princefishthrower/instagramize

【问题讨论】:

  • 你打败了我。我尝试使用图像,当我加载图像并直接使用 cv2 或 pyplot 再次保存时,我得到了相同的饱和度损失。理论上,除了读取图像并保存相同的数组外,没有其他任何事情要做。如果有机会,我稍后会尝试查看它,因为这对我来说似乎很奇怪。希望其他人可能有答案
  • @AlexS - 感谢您的努力!我可能会再上传几对图片,我意识到我的例子并不是最明显地显示饱和度的损失,但即使在那个例子中你仍然可以看到它:)
  • 我明白了。如果图像数组前后保持相同的值,你如何显示饱和度的损失。我在 python 中处理图像已经有一段时间了,我以前没有遇到过这个问题。它真的很吸引我

标签: python image python-imaging-library


【解决方案1】:

不同之处在于原始图像包含一个“ICC 颜色配置文件”(以及其他),这些文件未保留在输出图像中。

您可以使用exiftool 最轻松地看到这一点:

exiftool Mountains_Before.jpg | grep -i profile

或者使用 ImageMagick

magick identify -verbose Mountains_Before.jpg | grep -A999 Profiles:

输出

  Profiles:
    Profile-8bim: 92 bytes
    Profile-exif: 17796 bytes
    Profile-icc: 560 bytes
    Profile-iptc: 80 bytes
      City[1,90]: 0x00000000: 254700                                        -%G
      Created Date[2,55]: 2020-7-1
      unknown[2,62]: 2020-06-30
      unknown[2,63]: 21:11:26+00:00
      unknown[2,0]: 4
      Created Time[2,60]: 20:22:05-20:22
    Profile-xmp: 9701 bytes

如果你从原版中剥离轮廓,你也会看到它,被洗掉并且变得更扁平:

magick Mountains_Before.jpg -strip NoProfile.jpg

您可以提取 ICC 配置文件,如果这种事情让您兴奋,您可以像这样查看:

magick Mountains_Before.jpg profile.icc

如果你这样做了,我想你可以像这样将 BEFORE 图像中的配置文件重新附加到 AFTER 图像:

magick Mountains_After.jpg -profile profile.icc AfterWithProfile.jpg

关键字:图像处理、ImageMagick、配置文件、ICC 配置文件、饱和度、饱和度、去饱和度、褪色。

【讨论】:

    【解决方案2】:

    正如Mark Setchell 指出的那样,这是一个保留图像颜色配置文件的问题,这在 Pillow 中是可能的,首先通过在打开图像后检索配置文件:

    image = Image.open('mycoolimage.jpg')
    iccProfile = image.info.get('icc_profile')
    iccBytes = io.BytesIO(iccProfile)
    originalColorProfile = ImageCms.ImageCmsProfile(iccBytes)
    

    当使用 Pillow 调用 save 时,您可以传递 icc_profile:

    image.save('outputimagename.jpg', icc_profile=originalColorProfile.tobytes())
    

    (显然,我在这两个步骤之间对image 进行了其他操作。显然其中一个或多个导致 icc_profile 消失。)

    This answer 也有助于构建此解决方案。

    我添加了 Mountains_After_NEW.jpg 供有兴趣查看这些添加结果的人使用。

    【讨论】:

    • 干得好。感谢您与 Stack Overflow 社区分享您的解决方案。
    猜你喜欢
    • 2017-04-26
    • 2018-11-01
    • 2011-05-17
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多