将 CIImage 乘以标量



>我正在使用一个CIImage,我需要通过减去 128 然后除以每个像素 128 来规范化。我怎么能用CIFilter做到这一点

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

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 的工作格式设置为支持负值的格式。

您可以在 vImage 中实现此目的(假设源像素UInt8且目标像素Float(,但使用数学从 0...255 转换为 -1...1,请使用查找表:

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

您可以将所有这些代码包装在一个CIImageProcessorKernel中,以将其集成到 CI 工作流中。请参阅:读取和写入核心视频像素缓冲区

相关内容

  • 没有找到相关文章

最新更新