PureCV

A high-performance, pure Rust computer vision library focusing on the core and imgproc modules of OpenCV. PureCV is built from the ground up to be memory-safe, thread-safe, and highly portable without the overhead of C++ FFI.
This project is currently a Work in Progress. While most core and imgproc features have been implemented, the library is not yet stable, and bugs may occur. We are actively optimizing and expanding the feature set.
๐ฏ Philosophy
Unlike existing wrappers, PureCV is a native rewrite. It aims to provide:
- Zero-FFI: No complex linking or C++ toolchain requirements.
- Memory Safety: Elimination of segmentation faults and buffer overflows via Rust's ownership model.
- Modern Parallelism: Native integration with Rayon for effortless multi-core processing.
- Portable SIMD: Optional SIMD acceleration via
pulpโ auto-detects x86 SSE/AVX, ARM NEON, and WASMsimd128at runtime. Zerounsafe, zero#[cfg(target_arch)].
โจ Features
purecv-core
- Matrix Operations: Multi-dimensional
Matrix<T>with support for common arithmetic (add,subtract,multiply,divide) and bitwise logic (bitwise_and,bitwise_or,bitwise_xor,bitwise_not). Matrix and scalar variants for all operations. - Factory Methods: Intuitive initialization with
zeros,ones,eye, anddiag. - Scalar constructors:
Matrix::new_with_scalar(fill all pixels from aScalar<T>),new_with_scalar_from_size, andnew_with_scalar_typed_from_size.set_toandset_to_maskedassign aScalar<T>to every pixel (optionally masked); channels beyond 4 default toT::default(). - Scalar type:
Scalar<T>โ a 4-channel value โ now supportsIndex/IndexMutfor channel access,from_array/to_array,From<[T;4]>andFrom<T>conversions, and amap()helper for per-channel type transforms. Arithmetic traits: per-channelAdd/Sub;Mul<T>/Mul<Scalar<T>>for scaling and element-wise multiply; safeDiv<T>/Div<Scalar<T>>(returns zero on divide-by-zero);checked_div()returningResultfor integer types. - Comparison:
compare,compare_scalar,min,max,abs_diff,in_range. - Structural:
flip,rotate,transpose,repeat,reshape,hconcat,vconcat,copy_make_border,extract_channel,insert_channel. - Math:
sqrt,exp,log,pow,magnitude,phase,cart_to_polar,polar_to_cart,convert_scale_abs. - Stats:
sum,mean,mean_std_dev,min_max_loc,norm,normalize,count_non_zero,reduce. - Linear Algebra:
gemm,dot,cross,trace,determinant,invert,solve,solve_poly,set_identity. - Sorting:
sort,sort_idxwith configurable row/column and ascending/descending flags. - Clustering:
kmeanswith random, k-means++, and user-supplied initialization strategies. - Transforms:
transform(per-element matrix transformation),perspective_transform(projective / homography mapping). - Random Number Generation:
randu(uniform distribution),randn(normal/Gaussian distribution),set_rng_seed. - Channel Management:
split,merge,mix_channels. - Utilities:
add_weighted,check_range,absdiff,get_tick_count,get_tick_frequency. - Mathematical Constants: OpenCV-compatible constants โ
CV_PI,CV_PI_2,CV_2PI,CV_PI_4,CV_LOG2,CV_LN2โ backed bystd::f64::constsfor maximum precision. - ndarray Interop: Optional, zero-cost conversions to/from
ndarray::Array3via thendarrayfeature flag. - SIMD Acceleration (
simdfeature): Trait-based dispatch viapulpforf32,f64, andu8types. Accelerated operations includeadd,sub,mul,div,min,max,sqrt,dot,sum,add_weighted,convert_scale_abs, andmagnitude. Falls back to scalar loops at zero cost when disabled.
purecv-imgproc
- Color Conversions: High-performance
cvt_colorsupporting RGB, BGR, Gray, RGBA, BGRA and more. Up to 6.6ร speedup with Parallel + SIMD. SIMD-accelerated paths (simdfeature) use fixed-point integer arithmetic (coefficients 77/150/29 โ 0.299/0.587/0.114 ร 256) for all*_to_grayconversions โ portable to x86 SSE/AVX, ARM NEON, and WASMsimd128viapulp. - Edge Detection:
canny,sobel,scharr,laplacian. Optimizedfast_deriv_3x3kernel delivers up to 12ร speedup with Parallel. Forf32inputs, thepulp-poweredsimd_deriv_3x3_row_f32interior kernel adds a further 1.5ร boost, reaching 22ร total speedup (28.59 ms โ 1.28 ms) with Parallel + SIMD โ the highest combined speedup in the project. - Filtering:
blur,box_filter,gaussian_blur,median_blur,bilateral_filter. The bilateral filter achieves 7.1ร speedup with Parallel (1.43 s โ 202 ms on 512ร512); SIMD provides no additional gain due to the non-vectorizable per-pixel exponential weight computation. - Thresholding:
thresholdwith all 5 OpenCV-compatible types (BINARY,BINARY_INV,TRUNC,TOZERO,TOZERO_INV). SIMD-accelerated fast path foru8,f32, andf64via theSimdElement::simd_threshold()trait method. Works seamlessly withparallelfeature for row-level Rayon dispatch.
๐ Getting Started
Installation
Add the following to your Cargo.toml:
[]
= "0.1"
Feature Flags
| Flag | Default | Description |
|---|---|---|
std |
โ | Standard library support |
parallel |
โ | Multi-core parallelism via Rayon |
ndarray |
โ | Interop with the ndarray crate (zero-cost views & ownership transfers) |
simd |
โ | SIMD acceleration via pulp (x86 SSE/AVX, ARM NEON, WASM simd128) |
wasm |
โ | WebAssembly-specific optimizations |
To enable the ndarray feature:
[]
= { = "0.1", = ["ndarray"] }
To enable SIMD + Parallel for maximum performance:
[]
= { = "0.1", = ["parallel", "simd"] }
Usage Example
use ;
use ;
ndarray Interoperability
With the ndarray feature enabled, you can convert between Matrix<T> and ndarray::Array3<T>:
use Matrix;
// Matrix โ ndarray (zero-cost view)
let mat = ones;
let view = mat.as_ndarray_view; // ArrayView3<f32>, shape (480, 640, 3)
// Matrix โ ndarray (ownership transfer)
let mat2 = ones;
let arr = mat2.into_ndarray;
// ndarray โ Matrix (guarantees contiguous C-order layout for SIMD/WASM)
let mat3 = from_ndarray;
// Also works via the From trait
let arr2 = zeros;
let mat4: = from;
WASM Package for Browsers & Node.js
PureCV provides a compiled WebAssembly package via wasm-bindgen enabling access to core matrix operations, thresholds, filters, and derivatives directly from JavaScript/TypeScript.
This includes both a standard build for maximum compatibility and a SIMD-optimized build for massive performance gains in modern browsers.
See the WebAssembly documentation for more usage examples and API details.
Running Examples
Explore the capabilities of PureCV by running the provided examples:
# Basic matrix arithmetic
# Structural operations (flip, rotate, split/merge)
# Color conversion (RGB to Grayscale)
# Thresholding โ all 5 types (BINARY, BINARY_INV, TRUNC, TOZERO, TOZERO_INV)
# Image filters (blur, gaussian, canny, sobel, โฆ) โ requires examples/data/butterfly.jpg
๐งช Testing & Benchmarking
Running Tests
PureCV uses a comprehensive suite of unit tests to ensure correctness and parity with OpenCV. The test suite currently includes 153 unit tests covering:
- Core module: Matrix factories, scalar arithmetic variants, bitwise scalar ops, min/max, comparison ops (
compare,in_range), reduction (reduce,count_non_zero), polar/cartesian conversions, linear algebra (determinant,invert,solve), channel ops (extract_channel,insert_channel),DynamicMatrix, transforms, sorting, clustering, and RNG. - Imgproc module: Filters, derivatives, edge detection, color conversions (including gray-to-RGB/BGR/RGBA/BGRA), thresholding, and kernel helpers (
get_gaussian_kernel,get_sobel_kernels).
# Run all tests
Running Benchmarks
Performance is a core focus. Benchmarks are available for arithm, imgproc, and structural modules across four configurations:
# Standard (sequential, no SIMD)
# SIMD Only (sequential + auto-vectorization)
RUSTFLAGS="-C target-cpu=native"
# Parallel (Rayon multi-threading)
# Parallel + SIMD (maximum throughput)
RUSTFLAGS="-C target-cpu=native"
Key Performance Highlights (1024ร1024 matrices, updated 2026-03-17)
| Operation | Standard | Parallel + SIMD | Speedup |
|---|---|---|---|
cvt_color_rgb2gray |
2.66 ms | 404 ยตs | 6.6ร |
sobel_3x3 (generic) |
22.79 ms | 1.87 ms | 12ร |
sobel_3x3_f32_dx โ
|
28.59 ms | 1.28 ms | 22ร |
sobel_3x3_f32_dy โ
|
26.24 ms | 1.27 ms | 21ร |
bilateral_filter (512ร512) |
1.43 s | 202 ms | 7.1ร |
laplacian_3x3 |
45.91 ms | 4.44 ms | 10.4ร |
dot |
997 ยตs | 157 ยตs | 6.4ร |
gemm_256ร256 |
15.71 ms | 4.40 ms | 3.7ร |
canny |
57.61 ms | 12.54 ms | 4.6ร |
โ Uses non-zero sinusoidal data to exercise the
simd_deriv_3x3_row_f32SIMD kernel. Best combined speedup in the project.Full results in
benches/benchmark_results.md
๐บ Roadmap
- Phase 1: Core Foundation - Matrix types, arithmetic, geometric utilities, and basic structural transforms.
- Phase 2: Performance - SIMD acceleration via
pulp, Rayon parallelism, and Criterion benchmarking across 32 operations.- PR 1 โ SIMD infra +
arithmkernels (add,sub,mul,div,dot,magnitude,add_weighted,convert_scale_abs,sqrt,min,max,sum). - PR 2 โ Color + Threshold SIMD: fixed-point
cvt_color_*_to_graykernels,simd_threshold()for all 5 types onu8/f32/f64, newthresholdexample. - PR 3 โ Derivatives SIMD:
fast_deriv_3x3interior SIMD pass (simd_deriv_3x3_row_f32) achieving 22ร speedup onsobel_3x3_f32; new benchmarks forsobel_3x3_f32_dx/dyandbilateral_filter.
- PR 1 โ SIMD infra +
- Phase 3: WebAssembly -
wasm-bindgenwrappers,wasm-packbuild, CI matrix withwasm32-unknown-unknown+simd128. - Phase 4: Image Processing - Advanced filtering, convolutions, and feature detection.
- Visual examples โ Load real images, apply
threshold+cvt_color, save PNG output (follow-up tofilters.rs).
๐ License
This project is licensed under the LGPL-3.0 License.