@thi.ng/pixel-convolve
Version:
Extensible bitmap image convolution, kernel presets, normal map & image pyramid generation
157 lines • 5.62 kB
TypeScript
import type { Fn, FnN3, NumericArray } from "@thi.ng/api";
import { FloatBuffer } from "@thi.ng/pixel/float";
import type { ConvolutionKernelSpec, ConvolveOpts, KernelFnSpec, KernelSpec, PoolTemplate } from "./api.js";
/**
* Convolves a single channel from given `src` float buffer with provided
* convolution or pooling kernel with support for strided sampling (resulting in
* smaller dimensions). Returns result as single channel buffer (in
* {@link FLOAT_GRAY} format).
*
* @remarks
* Use {@link convolveImage} to process multiple or all channels in a buffer.
*
* Reference:
* https://en.wikipedia.org/wiki/Kernel_(image_processing)
*
* @param src -
* @param opts -
*/
export declare const convolveChannel: (src: FloatBuffer, opts: ConvolveOpts) => FloatBuffer;
/**
* Similar to {@link convolveChannel}, but processes multiple or all channels
* (default) in a buffer and returns a new buffer in same format as original.
*
* @remarks
* This function re-uses as much as internal state & memory as possible, so will
* be faster than individual applications of {@link convolveChannel}.
*
* @param src -
* @param opts -
*/
export declare const convolveImage: (src: FloatBuffer, opts: Exclude<ConvolveOpts, "channel"> & {
channels?: number[];
}) => FloatBuffer;
/**
* HOF convolution or pooling kernel code generator. Takes either a
* {@link PoolTemplate} function or array of kernel coefficients and kernel
* width/height. Returns optimized kernel function for use with
* {@link __convolve}. If `normalize` is true (default: false), the given
* coefficients are divided by their sum (only used if provided as array).
*
* @remarks
* If total kernel size (width * height) is < 512, the result function will use
* unrolled loops to access pixels and hence kernel sizes shouldn't be larger
* than ~22x22 to avoid excessive function bodies. For dynamically generated
* kernel functions, only non-zero weighted pixels will be included in the
* result function to avoid extraneous lookups. Row & column offsets are
* pre-calculated too. Larger kernel sizes are handled via
* {@link defLargeKernel}.
*
* @param tpl -
* @param w -
* @param h -
* @param normalize -
*/
export declare const defKernel: (tpl: NumericArray | PoolTemplate, w: number, h: number, normalize?: boolean) => Fn<FloatBuffer, FnN3>;
/**
* Loop based fallback for {@link defKernel}, intended for larger kernel sizes
* for which loop-unrolled approach is prohibitive. If `normalize` is true
* (default: false), the given coefficients are divided by their sum.
*
* @param kernel -
* @param w -
* @param h -
* @param normalize -
*/
export declare const defLargeKernel: (kernel: NumericArray, w: number, h: number, normalize?: boolean) => Fn<FloatBuffer, FnN3>;
export declare const POOL_NEAREST: PoolTemplate;
export declare const POOL_MEAN: PoolTemplate;
export declare const POOL_MIN: PoolTemplate;
export declare const POOL_MAX: PoolTemplate;
/**
* Higher order adaptive threshold {@link PoolTemplate}. Computes: `step(C -
* mean(K) + B)`, where `C` is the center pixel, `K` the entire set of pixels in
* the kernel and `B` an arbitrary bias/offset value.
*
* @example
* ```ts
* import { convolveChannel, POOL_THRESHOLD } from "@thi.ng/pixel";
*
* // 3x3 adaptive threshold w/ bias = 1
* convolveChannel(src, { kernel: { pool: POOL_THRESHOLD(1), size: 3 }});
* ```
*
* @param bias -
*/
export declare const POOL_THRESHOLD: (bias?: number) => PoolTemplate;
export declare const SOBEL_X: KernelSpec;
export declare const SOBEL_Y: KernelSpec;
export declare const EDGE3: KernelSpec;
export declare const EDGE5: KernelSpec;
export declare const SHARPEN3: KernelSpec;
export declare const HIGHPASS3: KernelSpec;
export declare const BOX_BLUR3: KernelSpec;
export declare const BOX_BLUR5: KernelSpec;
export declare const GAUSSIAN_BLUR3: KernelSpec;
export declare const GAUSSIAN_BLUR5: KernelSpec;
/**
* Higher order Gaussian blur kernel for given pixel radius `r` (integer).
* Returns {@link ConvolutionKernelSpec} with resulting kernel size of `2r+1`.
*
* @param r -
*/
export declare const GAUSSIAN: (r: number) => ConvolutionKernelSpec;
/**
* Higher-order Lanczos filter kernel generator for given `a` value (recommended
* 2 or 3) and `scale` (num pixels per `a`).
*
* @remarks
* https://en.wikipedia.org/wiki/Lanczos_resampling#Lanczos_kernel
*
* @param a -
* @param scale -
*/
export declare const LANCZOS: (a: number, scale?: number) => ConvolutionKernelSpec;
export declare const UNSHARP_MASK5: KernelSpec;
/**
* 3x3 convolution kernel to detect local maxima in a Von Neumann neighborhood.
* Returns in 1.0 if the center pixel is either higher valued than A & D or B & C,
* otherwise return zero.
*
* @remarks
* ```text
* |---|---|---|
* | | A | |
* |---|---|---|
* | B | X | C |
* |---|---|---|
* | | D | |
* |---|---|---|
* ```
*
* Also see {@link MAXIMA4_DIAG} for alternative.
*/
export declare const MAXIMA4_CROSS: KernelFnSpec;
/**
* Similar to {@link MAXIMA4_CROSS}, a 3x3 convolution kernel to detect local
* maxima in a 45 degree rotated Von Neumann neighborhood. Returns in 1.0 if the
* center pixel is either higher valued than A & D or B & C, otherwise return
* zero.
*
* @remarks
* ```text
* |---|---|---|
* | A | | B |
* |---|---|---|
* | | X | |
* |---|---|---|
* | C | | D |
* |---|---|---|
* ```
*/
export declare const MAXIMA4_DIAG: KernelFnSpec;
/**
* Union kernel of {@link MAXIMA4_CROSS} and {@link MAXIMA4_DIAG}.
*/
export declare const MAXIMA8: KernelFnSpec;
//# sourceMappingURL=convolve.d.ts.map