考虑真正简单的差异内核
kernel vec4 diffKernel(__sample image1, __sample image2)
{
return vec4(image1.rgb - image2.rgb, 1.0);
}
当用作CIColorKernel
时,会产生两个图像之间的差异。但是,image1.rgb < image2.rgb
(逐点)由于&#34;钳位&#34;而被强制为零的任何价值。 CIKernel中内核输出的性质。
对于许多图像处理算法,例如那些涉及图像金字塔的算法(参见关于如何在Core Image中实现这一点的另一个问题),保留这些负值以供以后使用(例如,重建金字塔)非常重要。如果在他们的位置使用0
,您实际上会得到错误的输出。
我已经看到过这样一种方式就是只存储abs(image1.rgb - image2.rgb)
制作一个新图像,RGB值是否存储0或1是否有负号附加到该值,然后执行使用-1
加倍混合加权到正确的位置。
还有哪些其他可以存储像素值符号的方法?也许我们可以使用alpha通道,如果它未被使用?
答案 0 :(得分:0)
我实际上最终搞清楚了 - 您可以在CIContext中使用一个选项来确保使用kCIFormatAf
键计算内容。这意味着在该上下文上完成的任何计算都将以浮点精度完成,因此超出[0,1]范围的值将从一个过滤器保留到下一个过滤器!