>我正在使用一个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,请使用查找表:
- 使用
ramp
创建包含 256 个Float
值的查找表,范围从 -1 到 +1。 - 创建一个引用图像数据的 vImage 缓冲区,但其宽度是图像宽度乘以通道数(例如,RGBA 640 宽图像为 2560(。
- 创建与目标宽度相同的每通道 32 位 vImage 缓冲区。 使用
vImageLookupTable_Planar8toPlanarF
使用转换为 -1...+1 单精度值的UInt8
像素填充目标。
您可以将所有这些代码包装在一个CIImageProcessorKernel
中,以将其集成到 CI 工作流中。请参阅:读取和写入核心视频像素缓冲区。