如何从 CIRowAverage 过滤器中获取值?
How do I get values from CIRowAverage filter?
我正在尝试使用 Apple 的 CIRowAverage
Core Image
过滤器来计算图像每行的平均值。当我 运行 过滤器并尝试读出值时,我根本没有得到平均值:从我可以判断的行中有一个值的地方,它 returns 255 和任何地方一行没有值(即全部为 0),它 returns 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
首先,我认为您正确地理解了过滤器的功能。我从未使用过它(或任何缩减过滤器),但我认为您使用的 一个像素输出 可能是错误的。
尝试以这种方式呈现输出:
// 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)
您没有 post 代码来指示 climate.extent
是什么或 self
是什么,所以请记住以下几点:
- 我认为输入的 ROI 应该是一行图像。
- 输出只有一个像素高
inputCount
。
- 创建
CIContexts
是一件非常昂贵的事情,所以尽量只创建一个。
- 如果您试图以 单个 图像结束 each 行的平均颜色,请相应地更改您的代码(和我的) .
注意:请记住,CoreImage 的“原点”位于左下角,而不是左上角。也就是说,UIKit 或 CoreGraphics 之类的东西将 0,0 的 X/Y 定位为左上角,而 CoreImage 将 0,0 定位为左下角。
我正在尝试使用 Apple 的 CIRowAverage
Core Image
过滤器来计算图像每行的平均值。当我 运行 过滤器并尝试读出值时,我根本没有得到平均值:从我可以判断的行中有一个值的地方,它 returns 255 和任何地方一行没有值(即全部为 0),它 returns 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
首先,我认为您正确地理解了过滤器的功能。我从未使用过它(或任何缩减过滤器),但我认为您使用的 一个像素输出 可能是错误的。
尝试以这种方式呈现输出:
// 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)
您没有 post 代码来指示 climate.extent
是什么或 self
是什么,所以请记住以下几点:
- 我认为输入的 ROI 应该是一行图像。
- 输出只有一个像素高
inputCount
。 - 创建
CIContexts
是一件非常昂贵的事情,所以尽量只创建一个。 - 如果您试图以 单个 图像结束 each 行的平均颜色,请相应地更改您的代码(和我的) .
注意:请记住,CoreImage 的“原点”位于左下角,而不是左上角。也就是说,UIKit 或 CoreGraphics 之类的东西将 0,0 的 X/Y 定位为左上角,而 CoreImage 将 0,0 定位为左下角。