1

みなさんおはようございます!Blender で物理的に正確なシーンを作成しました。私の目的は、Python を使用して、[W/m^2] の観点から照明マップを取得するために、レンダリングされたシーンの放射条件を調べることです。ダイナミック レンジが大きいため、画像を OpenEXR ファイル形式で保存し、「R」「G」「B」チャンネルの RGB 値から始まる相対輝度マップを取得したいと考えました。主な問題は、ファイル形式の HDR プロパティを維持する相対輝度マップを取得するために必要な [0, 1] の間の物理的に正確な値を持つように、OpenEXR チャネルから線形値をスケーリングする方法です。コードの一部を以下に報告します。

    pt = Imath.PixelType(Imath.PixelType.FLOAT)
    exrfile = exr.InputFile(filename)
    dw = exrfile.header()['dataWindow']
    size = (dw.max.x - dw.min.x + 1, dw.max.y - dw.min.y + 1)
    redstr = exrfile.channel('R', pt)
    red = np.fromstring(redstr, dtype = np.float32)
    red.shape = (size[1], size[0]) # Numpy arrays are (row, col)

    greenstr = exrfile.channel('G', pt)
    green = np.fromstring(greenstr, dtype = np.float32)
    green.shape = (size[1], size[0]) # Numpy arrays are (row, col)

    bluestr = exrfile.channel('B', pt)
    blue = np.fromstring(bluestr, dtype = np.float32)
    blue.shape = (size[1], size[0]) # Numpy arrays are (row, col)


    rel_luminance = 0.2126*red[:,:]+0.7152*green[:,:]+0.0722*blue[:,:] 

テスト画像の場合、取得された 3 つのチャネルの最大値はそれぞれ次のとおりです。

最大 (R) = 198.16421508789062

最大(G) = 173.5792999267578

最大 (B) = 163.20120239257812

得られた値は明らかに[0、1]の範囲内にありません。さらに、チャネルをスケーリングして必要なものを取得するためのグローバル最大値を理解できません。

私の問題を解決するためのヒントはありますか?アドバイスありがとう。

4

0 に答える 0