CIAdditionCompositing 产生不正确的效果

Jor*_*orn 6 macos ios ciimage swift

我正在尝试通过平均其他几个图像来创建图像。为了实现这一点,我首先将每个图像变暗一个与我平均的图像数量相等的因子:

func darkenImage(by multiplier: CGFloat) -> CIImage? {
    let divImage = CIImage(color: CIColor(red: multiplier, green: multiplier, blue: multiplier))

    let divImageResized = divImage.cropped(to: self.extent) //Set multiplier image to same size as image to be darkened

    if let divFilter = CIFilter(name: "CIMultiplyBlendMode", parameters: ["inputImage":self, "inputBackgroundImage":divImageResized]) {

        return divFilter.outputImage
    }

    print("Failed to darken image")
    return nil
}
Run Code Online (Sandbox Code Playgroud)

在此之后,我将每个变暗的图像添加在一起(将图像 1 和 2 添加在一起,然后将结果与图像 3 等一起添加):

func blend(with image: CIImage, blendMode: BlendMode) -> CIImage? { 
    if let filter = CIFilter(name: blendMode.format) { //blendMode.format is CIAdditionCompositing
        filter.setDefaults()

        filter.setValue(self, forKey: "inputImage")
        filter.setValue(image, forKey: "inputBackgroundImage")

        let resultImage = filter.outputImage

        return resultImage
    }

    return nil
}
Run Code Online (Sandbox Code Playgroud)

这段代码执行并生成一个新图像,但是我平均在一起的图像越多,阴影就越暗。高光与每个单独的图像保持大致相同的亮度,但较暗的部分只会变得越来越暗。有谁知道可能有什么问题?

原图: 原图

2张图像的平均值: 2 倍平均

8张图像的平均值: 8 倍平均

平均 20 张图像: 平均 20 倍

为了减少潜在问题的数量,我还尝试在 Lightroom 中预先使图像变暗并仅应用CIAdditionCompositing过滤器。这给出了相同的结果,这让我认为CIAdditionCompositing可能不仅仅是将像素相加,而是使用了一些略有不同的算法,但我还没有找到任何关于此的文档。我还尝试更改变暗乘数以查看是否计算错误,但是如果我将图像变暗较少,则再次将图像添加在一起时,高光会过度曝光。

Eni*_*nie 0

这可能来得有点晚,但有些。

第一次尝试

我怀疑问题在于色域不是线性的,就像肯·托马斯提到的那样。不幸的是,将所有图像转换为与过滤器呈线性关系"CISRGBToneCurveToLinear",并且在所有图像堆叠之后将它们转换回来并"CILinearToSRGBToneCurve"不能解决问题。

解决方案

每次添加两张图像后使用曝光调整将曝光减半确实解决了问题。要将曝光减半,您需要将光圈值减小 1 级,因此曝光值 (EV) 需要为 -1。

此外,我添加了中间图像,只是因为当过滤器堆栈太大时,我有时会在旧手机上遇到麻烦CIImage

if let evFilter = CIFilter(name: "CIExposureAdjust", parameters: ["inputImage":self, "inputEV":NSNumber(-1)]) {
    return evFilter.outputImage?.insertingIntermediate()
}
Run Code Online (Sandbox Code Playgroud)

PS:请注意,为了创建正确的结果,图像需要相互添加并减半曝光,以便每个图像与结果图像具有相同的权重。只需添加下一张图像并随后减少曝光,最后添加的图像将始终占整体结果 50% 的权重。