Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

以DNG格式导出,并包含源元数据,以便在RawTherapee、Darktable和Lightroom等外部RAW编辑器中使用。 #48

Open
FloBEAUG opened this issue Feb 2, 2025 · 2 comments

Comments

@FloBEAUG
Copy link

FloBEAUG commented Feb 2, 2025

你好,你做得很好,我对你的作品供个人使用非常感兴趣。我想修改 image_process.py 脚本以输出包含去噪拜耳原始图像和源元数据的 DNG 文件,以便我可以在原始图像编辑器中打开它。
我修改了代码以针对我的 CR3 Canon 文件对其进行微调(效果很好),并且输出的 PNG 非常出色。但是,我想将原始文件保留在最后。
你认为这可能吗?
谢谢!

@Srameo
Copy link
Owner

Srameo commented Feb 4, 2025

您好!感谢您对LED的关注!

或许我可以尝试使用pydng与pyexiftool来帮助您将处理后的bayer图像重新保存为dng文件。不知道这样是否符合您的需求呢?

BTW, 如果我们的 LED 对您的项目有帮助,我们欢迎您给我们一个星标 🌟,这将是对我们进一步更新的巨大鼓励!

@FloBEAUG
Copy link
Author

FloBEAUG commented Feb 4, 2025

我做了一些调整。

它并不完美,存在一些颜色管理缺陷(颜色矩阵未导入),但对我来说可以使用。如果你愿意,随时可以更新。

image_process.py:

import subprocess
from pidng.core import RAW2DNG, DNGTags, Tag
from pidng.defs import *
import json
import pathlib
def read_img(raw_path):
    exiftool_output = subprocess.run(["exiftool", "-json", raw_path], capture_output=True, text=True, check=True)
    tags = json.loads(exiftool_output.stdout)[0]
    white_balance = list(map(int, tags['WB_RGGBLevelsAsShot'].split(' ')))

    [...]
    return raw, raw_pattern, raw_packed, black_level, white_level, white_balance
def save_as_dng(rawImage, filename, bpp, bl, wl, wb):
    height, width = rawImage.shape
    r, g1, g2, b = wb

    # set DNG tags.
    t = DNGTags()
    t.set(Tag.ImageWidth, width)
    t.set(Tag.ImageLength, height)
    t.set(Tag.TileWidth, width)
    t.set(Tag.TileLength, height)
    t.set(Tag.Orientation, Orientation.Horizontal)
    t.set(Tag.PhotometricInterpretation, PhotometricInterpretation.Color_Filter_Array)
    t.set(Tag.SamplesPerPixel, 1)
    t.set(Tag.BitsPerSample, bpp)
    t.set(Tag.CFARepeatPatternDim, [2, 2])
    t.set(Tag.CFAPattern, CFAPattern.RGGB)
    t.set(Tag.BlackLevel, int(torch.mean(bl)))
    t.set(Tag.WhiteLevel, int(torch.mean(wl)))
    t.set(Tag.CalibrationIlluminant1, CalibrationIlluminant.D65)
    t.set(Tag.AsShotNeutral, [[g1, r], [g1, g2], [g1, b]])
    t.set(Tag.BaselineExposure, [[-150, 100]])
    t.set(Tag.Make, "Unset")
    t.set(Tag.Model, "Unset")
    t.set(Tag.PreviewColorSpace, PreviewColorSpace.sRGB)

    # save to dng file.
    r = RAW2DNG()
    r.options(t, path="", compress=True)
    r.convert(rawImage, filename)
def postprocess(raw, raw_pattern, im, bl, wl, output_bps=16):
    def postprocess(raw, raw_pattern, im, bl, wl, output_bps=16):
    im = im * (wl - bl) + bl
    im = im.numpy()[0]
    im = depack_raw_bayer(im, raw_pattern)
    H, W = im.shape
    return im
def image_process():
[...]
    bayer_result = postprocess(raw, raw_pattern, result, bl, wl, args.bps)
    output_name = os.path.join(args.save_path, pathlib.Path(raw_path).stem + ".dng")
    save_as_dng(bayer_result, output_name, args.bps, bl, wl, wb)
    subprocess.run(["exiftool", "-q", "-overwrite_original", "-tagsFromFile", raw_path, "-all:all", "-LensModel",
                        output_name])
[...]

它并不完美,存在一些颜色管理缺陷(颜色矩阵未导入),但对我来说可以使用。如果你愿意,随时可以更新。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants