簡體   English   中英

使用 OpenImageIO 和 Python 將 sRGB 圖像轉換為灰度

[英]Convert sRGB image to grayscale using OpenImageIO and Python

我在網上或文檔中找不到任何地方清楚地解釋了如何使用 Python 進行這種轉換。 在我的情況下,我需要用 OpenImageIO 來做——我只需要給它一個路徑並保存轉換后的圖像,理想情況下它會很棒 output 單通道灰度圖像。 有誰知道怎么做? 提前致謝!

“平均”方法是錯誤的,因為您的眼睛對所有波長的敏感度不一致,因此 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 在輸入時自動線性化並在 output 到 jpeg 時返回 sRGB)

請注意,在這兩種情況下,您都會輸出具有亮度的單通道圖像。 如果您確實需要將其轉換為 R、G 和 B 都相等的 RGB 圖像,則只需多行幾行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM