使用OpenImageIO和Python将sRGB图像转换为灰度

2024-09-28 23:43:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我在网上或文档中找不到任何地方可以清楚地解释如何使用Python进行这种转换。在我的情况下,我需要用OpenImageIO来做这件事——我只需要给它提供一条路径并保存转换后的图像,理想情况下,输出一个单通道灰度图像会更好。有人知道怎么做吗?提前谢谢


Tags: 文档图像路径地方情况单通道灰度理想
1条回答
网友
1楼 · 发布于 2024-09-28 23:43:48

“平均”方法是错误的,因为你的眼睛对所有波长都不敏感,所以R、G和B对你的亮度感知的贡献并不相等。这意味着,通过平均得到的灰度图像似乎与原始彩色图像的相对亮度不同。而且,sRGB不是线性编码,所以编码值的“平均”(或任何加权和)并不是您想象的那个样

使用Python中的OpenImageIO执行此操作的完全正确的方法是:

import OpenImageIO as oiio
# Read the image, force it to be float for full precision
img = oiio.ImageBuf("input.jpg")
img.read(convert='float')
# linearize it   this assumes sRGB, which jpeg always is
lin = oiio.ImageBufAlgo.colorconvert(img, "sRGB", "linear")
# generate a luminance image with proper channel weights
luma = oiio.ImageBufAlgo.channel_sum (img, (.2126, .7152, .0722))
# convert back to sRGB for proper jpeg output
luma = oiio.ImageBufAlgo.colorconvert(luma, "linear", "sRGB")
luma.write("luma.jpg")

如果您只是对从命令行(而不是Python)执行此操作感兴趣,则非常简单:

oiiotool  autocc rgb.jpg  chsum:weight=.2126,.7152,.0722 -o luma.jpg

(autocc在输入时自动线性化,在输出到jpeg时返回到sRGB)

请注意,在这两种情况下,输出的都是具有亮度的单通道图像。如果你真的需要把它转换成R,G,B都相等的RGB图像,只需要多出几行

相关问题 更多 >