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")
“平均”方法是错误的,因为你的眼睛对所有波长都不敏感,所以R、G和B对你的亮度感知的贡献并不相等。这意味着,通过平均得到的灰度图像似乎与原始彩色图像的相对亮度不同。而且,sRGB不是线性编码,所以编码值的“平均”(或任何加权和)并不是您想象的那个样
使用Python中的OpenImageIO执行此操作的完全正确的方法是:
如果您只是对从命令行(而不是Python)执行此操作感兴趣,则非常简单:
(autocc在输入时自动线性化,在输出到jpeg时返回到sRGB)
请注意,在这两种情况下,输出的都是具有亮度的单通道图像。如果你真的需要把它转换成R,G,B都相等的RGB图像,只需要多出几行
相关问题 更多 >
编程相关推荐