如何从CIRowAverage过滤器中获取值?

时间:2018-01-12 17:37:02

标签: swift macos core-image cifilter

我正在尝试使用Apple的CIRowAverage Core Image过滤器来计算图像每行的平均值。当我运行过滤器并尝试读出值时,我根本得不到平均值:从我可以知道哪一行有一个值,它返回255并且哪一行没有值(即,所有0),它返回0.

那么,我使用CIRowAverage错了还是我误解了它是如何使用的?

以下是我如何称呼它:

let row = ciimage.applyingFilter("CIRowAverage", parameters: ["inputExtent": CIVector(cgRect: ciimage.extent)])

let width = Int(ciimage.extent.width)
let height = Int(ciimage.extent.height)
let bufferSize = width * height * 4
var buffer = [UInt8](repeating: 0, count: bufferSize)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let context = CGContext(data: &buffer, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 4 * width, space: colorSpace, bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)!
let ciContext = CIContext(cgContext: context, options: [kCIContextWorkingColorSpace: colorSpace, kCIContextUseSoftwareRenderer: false])
ciContext.draw(self, in: self.extent, from: self.extent)
return buffer

1 个答案:

答案 0 :(得分:0)

首先,我认为你正确地阅读过滤器所做的事情。我从未使用它(或任何缩小滤镜),但我认为您可能使用一个像素输出错误。

尝试以这种方式渲染输出:

// I'm assuming you are passing a single row here but your ROI suggests maybe not

let row = ciimage.applyingFilter("CIRowAverage", parameters: ["inputExtent": CIVector(cgRect: ciimage.extent)])

// Create a CIContext, then a CGImage, and finally a UIImage

let ciCtx = CIContext()
let cgImage = renderContext.createCGImage(row, from: ciimage.extent)
let uiImage =  UIImage(cgImage: cgImage)

您没有发布代码来指明climate.extent是什么或self是什么,所以请记住以下事项:

  • 输入ROI应该是 - 我认为 - 一行图像。
  • 输出一个像素。
  • 创建CIContexts是一件非常昂贵的事情,所以尽量只创建一个。
  • 如果您尝试使用每个行的平均颜色的图像,请相应地更改您的代码(和我的代码)。