【问题标题】:multiply CIImage by scalar将 CIImage 乘以标量
【发布时间】:2019-09-12 13:09:06
【问题描述】:

我正在使用CIImage,我需要通过减去 128 然后将每个像素除以 128 来对其进行归一化。我怎么可能用CIFilter来做到这一点

【问题讨论】:

  • 这可能会导致负值。您确定这是您想要实现的目标吗?
  • @FrankSchlegel 是的

标签: swift core-image cifilter ciimage


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以在 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

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-06
      • 1970-01-01
      相关资源
      最近更新 更多