我在网上或文档中找不到任何地方清楚地解释了如何使用 Python 进行这种转换。在我的情况下,我需要使用 OpenImageIO 来完成 - 我只需要为其提供路径并保存转换后的图像,理想情况下,输出单通道灰度图像会很棒。有谁知道怎么做?提前致谢!
问问题
411 次
1 回答
0
“平均”方法是错误的,因为您的眼睛对所有波长的敏感度不一致,因此 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 图像,则只需多行几行。
于 2021-01-09T21:36:05.723 回答