separableConvolve(horizontalKernel:verticalKernel:bias:edgeMode:destination:)
Performs separable convolution on a multiple plane 32-bit pixel buffer.
Declaration
func separableConvolve(horizontalKernel: [Float], verticalKernel: [Float], bias: Float = 0, edgeMode: vImage.EdgeMode<Pixel_F>, destination: vImage.PixelBuffer<Format>)Parameters
- horizontalKernel:
The 1D horizontal convolution kernel.
- verticalKernel:
The 1D vertical convolution kernel.
- bias:
A value that the operation adds to each element in the convolution result, before performing any clipping.
- edgeMode:
The convolution edge mode. The background color must be a single Pixel_f value.
- destination:
The destination pixel buffer.
Discussion
The following code shows how to generate a multiplane pixel buffer from a CGImage instance and apply a Gaussian blur using separable convolution:
let srcImage = imageLiteral(resourceName: " ... ").cgImage(
forProposedRect: nil,
context: nil,
hints: nil)!
var cgImageFormat = vImage_CGImageFormat(
bitsPerComponent: 32,
bitsPerPixel: 32 * 3,
colorSpace: CGColorSpaceCreateDeviceRGB(),
bitmapInfo: CGBitmapInfo(rawValue:kCGBitmapByteOrder32Host.rawValue |
CGBitmapInfo.floatComponents.rawValue |
CGImageAlphaInfo.none.rawValue))!
let interleavedBuffer = try vImage.PixelBuffer(
cgImage: srcImage,
cgImageFormat: &cgImageFormat,
pixelFormat: vImage.InterleavedFx3.self)
let multiplaneSrcBuffer = vImage.PixelBuffer<vImage.PlanarFx3>(
interleavedBuffer: interleavedBuffer)
let multiplaneDestBuffer = vImage.PixelBuffer<vImage.PlanarFx3>(
size: multiplaneSrcBuffer.size)
multiplaneSrcBuffer.separableConvolve(
horizontalKernel: vImage.ConvolutionKernel.gaussian1Dx7,
verticalKernel: vImage.ConvolutionKernel.gaussian1Dx7,
edgeMode: .truncateKernel,
destination: multiplaneDestBuffer)
multiplaneDestBuffer.convert(to: interleavedBuffer)
let outputImage = interleavedBuffer.makeCGImage(cgImageFormat: cgImageFormat)See Also
Related Documentation
Separable convolution
separableConvolve(horizontalKernel:verticalKernel:bias:edgeMode:destination:)separableConvolve(horizontalKernel:verticalKernel:bias:edgeMode:useFloat16Accumulator:destination:)separableConvolve(horizontalKernel:verticalKernel:bias:edgeMode:destination:)separableConvolve(horizontalKernel:verticalKernel:bias:edgeMode:destination:)vImage.ConvolutionKernel