过滤后保留负值

Preserving negative values after filtering

考虑真正简单的差异内核

kernel vec4 diffKernel(__sample image1, __sample image2)
    {
       return vec4(image1.rgb - image2.rgb, 1.0);
    }

当用作 CIColorKernel 时,这会产生两个图像之间的差异。但是,由于 CIKernel 中内核输出的 "clamping" 性质,任何 image1.rgb < image2.rgb(逐点)的值都将被强制为零。

对于许多图像处理算法,例如那些涉及图像金字塔的算法(请参阅我关于如何在 Core Image 中实现这一点的其他问题),重要的是保留这些负值以备后用(重建金字塔,例如例子)。如果在它们的位置重新使用 0,您实际上会得到不正确的输出。

我已经看到这样的一种方法是只存储 abs(image1.rgb - image2.rgb) 制作一个新图像,无论负号是否附加到该值,其 RGB 值存储 0 或 1,然后进行乘法混合加权-1 到正确的地方。

还有哪些其他方法可以存储像素值的符号?如果alpha通道没用到,也许我们可以使用它?

我实际上最终弄清楚了这一点——您可以使用 CIContext 中的一个选项来确保使用 kCIFormatAf 键计算事物。这意味着在该上下文中完成的任何计算都将以浮点精度完成,因此超出 [0,1] 范围的值会从一个过滤器保留到下一个过滤器!