将CIImage乘以标量

时间:2019-09-12 13:09:06

标签: swift core-image cifilter ciimage

我正在使用CIImage,我需要通过减去128然后将每个像素除以128进行归一化。我该如何使用CIFilter

2 个答案:

答案 0 :(得分:0)

不确定这是否可行,但是也许您可以应用两个具有静态颜色的混合通道,如下所示:

let gray = CIImage(color: .gray) // this should be 50% white, or 128/255
let subtracted = CIBlendKernel.subtract.apply(foreground: gray, background: inputImage)!
let normalized = CIBlendKernel.divide.apply(foreground: gray, background: subtracted)

请记住,您需要将CIContext的工作格式设置为支持负值的格式。

答案 1 :(得分:0)

您可以在vImage中实现此功能(假设您的源像素为UInt8,而目标像素为Float),而是使用数学将0 ... 255转换为-1 ... 1,使用查找表:

  1. 使用ramp创建一个从-1到+1的256个Float值的查找表。
  2. 创建一个vImage缓冲区,该缓冲区引用您的图像数据,但宽度要等于图像宽度乘以通道数(例如RGBA 640宽图像为2560)。
  3. 创建每个通道的32位vImage缓冲区,其宽度与目标宽度相同。
  4. 使用vImageLookupTable_Planar8toPlanarFUInt8像素转换为-1 ... + 1单精度值填充目标。

您可以将所有代码包装在CIImageProcessorKernel中,以将其集成到CI工作流程中。请参阅: Reading From and Writing to Core Video Pixel Buffers