7.3 KiB
7.3 KiB
Preprocessing Module API Reference
Quick Start
use ruvector_scipix::preprocess::{preprocess, PreprocessOptions};
use image::open;
// Basic preprocessing with defaults
let img = open("document.jpg")?;
let options = PreprocessOptions::default();
let processed = preprocess(&img, &options)?;
Core Types
PreprocessOptions
Complete configuration struct:
pub struct PreprocessOptions {
pub auto_rotate: bool, // Enable rotation detection
pub auto_deskew: bool, // Enable skew correction
pub enhance_contrast: bool, // Enable CLAHE
pub denoise: bool, // Enable Gaussian blur
pub threshold: Option<u8>, // Manual threshold (None = auto Otsu)
pub adaptive_threshold: bool, // Use adaptive thresholding
pub adaptive_window_size: u32, // Window size for adaptive (odd number)
pub target_width: Option<u32>, // Resize width
pub target_height: Option<u32>, // Resize height
pub detect_regions: bool, // Enable text region detection
pub blur_sigma: f32, // Gaussian blur sigma
pub clahe_clip_limit: f32, // CLAHE clip limit
pub clahe_tile_size: u32, // CLAHE tile size
}
TextRegion
Detected text region with metadata:
pub struct TextRegion {
pub region_type: RegionType, // Text, Math, Table, Figure, Unknown
pub bbox: (u32, u32, u32, u32), // (x, y, width, height)
pub confidence: f32, // 0.0 to 1.0
pub text_height: f32, // Average text height in pixels
pub baseline_angle: f32, // Baseline angle in degrees
}
PreprocessPipeline Builder
Creating a Pipeline
use ruvector_scipix::preprocess::pipeline::PreprocessPipeline;
let pipeline = PreprocessPipeline::builder()
// Rotation & Skew
.auto_rotate(true)
.auto_deskew(true)
// Enhancement
.enhance_contrast(true)
.clahe_clip_limit(2.0) // 2.0-4.0 recommended
.clahe_tile_size(8) // 8 or 16
// Denoising
.denoise(true)
.blur_sigma(1.0) // 0.5-2.0 typical
// Thresholding
.adaptive_threshold(true)
.adaptive_window_size(15) // Must be odd
.threshold(None) // None = auto Otsu
// Resizing
.target_size(Some(800), Some(600))
// Progress tracking
.progress_callback(|step, progress| {
println!("{}... {:.0}%", step, progress * 100.0);
})
.build();
Processing
// Single image
let result = pipeline.process(&image)?;
// Batch processing (parallel)
let images = vec![img1, img2, img3];
let results = pipeline.process_batch(images)?;
// With intermediates for debugging
let intermediates = pipeline.process_with_intermediates(&image)?;
for (name, img) in intermediates {
img.save(format!("debug_{}.png", name))?;
}
Module Functions
transforms.rs
// Basic operations
pub fn to_grayscale(image: &DynamicImage) -> GrayImage;
pub fn gaussian_blur(image: &GrayImage, sigma: f32) -> Result<GrayImage>;
pub fn sharpen(image: &GrayImage, sigma: f32, amount: f32) -> Result<GrayImage>;
// Thresholding
pub fn otsu_threshold(image: &GrayImage) -> Result<u8>;
pub fn threshold(image: &GrayImage, threshold: u8) -> GrayImage;
pub fn adaptive_threshold(image: &GrayImage, window_size: u32) -> Result<GrayImage>;
rotation.rs
pub fn detect_rotation(image: &GrayImage) -> Result<f32>;
pub fn rotate_image(image: &GrayImage, angle: f32) -> Result<GrayImage>;
pub fn detect_rotation_with_confidence(image: &GrayImage) -> Result<(f32, f32)>;
pub fn auto_rotate(image: &GrayImage, confidence_threshold: f32) -> Result<(GrayImage, f32, f32)>;
deskew.rs
pub fn detect_skew_angle(image: &GrayImage) -> Result<f32>;
pub fn deskew_image(image: &GrayImage, angle: f32) -> Result<GrayImage>;
pub fn auto_deskew(image: &GrayImage, max_angle: f32) -> Result<(GrayImage, f32)>;
pub fn detect_skew_projection(image: &GrayImage) -> Result<f32>;
enhancement.rs
pub fn clahe(image: &GrayImage, clip_limit: f32, tile_size: u32) -> Result<GrayImage>;
pub fn normalize_brightness(image: &GrayImage) -> GrayImage;
pub fn remove_shadows(image: &GrayImage) -> Result<GrayImage>;
pub fn contrast_stretch(image: &GrayImage) -> GrayImage;
segmentation.rs
pub fn find_text_regions(image: &GrayImage, min_region_size: u32) -> Result<Vec<TextRegion>>;
pub fn merge_overlapping_regions(regions: Vec<(u32, u32, u32, u32)>, merge_distance: u32) -> Vec<(u32, u32, u32, u32)>;
pub fn find_text_lines(image: &GrayImage, regions: &[(u32, u32, u32, u32)]) -> Vec<Vec<(u32, u32, u32, u32)>>;
Common Workflows
Document Scanning
let pipeline = PreprocessPipeline::builder()
.auto_rotate(true)
.auto_deskew(true)
.enhance_contrast(true)
.remove_shadows(true) // Note: not in builder, manual call
.adaptive_threshold(true)
.build();
Low-Quality Images
let pipeline = PreprocessPipeline::builder()
.denoise(true)
.blur_sigma(1.5) // Higher blur for noise
.enhance_contrast(true)
.clahe_clip_limit(3.0) // Higher clip for more contrast
.adaptive_threshold(true)
.adaptive_window_size(21) // Larger window
.build();
Fast Processing
let pipeline = PreprocessPipeline::builder()
.auto_rotate(false) // Skip if not needed
.auto_deskew(false)
.enhance_contrast(false)
.denoise(false)
.threshold(Some(128)) // Fixed threshold
.build();
High Quality
let pipeline = PreprocessPipeline::builder()
.auto_rotate(true)
.auto_deskew(true)
.enhance_contrast(true)
.clahe_clip_limit(2.0)
.clahe_tile_size(16) // Larger tiles
.denoise(true)
.blur_sigma(0.8) // Gentle blur
.adaptive_threshold(true)
.adaptive_window_size(11)
.build();
Error Handling
use ruvector_scipix::preprocess::PreprocessError;
match preprocess(&img, &options) {
Ok(processed) => { /* success */ },
Err(PreprocessError::ImageLoad(msg)) => { /* handle load error */ },
Err(PreprocessError::InvalidParameters(msg)) => { /* handle invalid params */ },
Err(PreprocessError::Processing(msg)) => { /* handle processing error */ },
Err(PreprocessError::Segmentation(msg)) => { /* handle segmentation error */ },
}
Performance Tips
- Batch Processing: Use
process_batch()for multiple images - Disable Unused Steps: Turn off rotation/deskew if not needed
- Fixed Threshold: Use manual threshold instead of Otsu for speed
- Smaller Tiles: Use 8x8 CLAHE tiles for speed, 16x16 for quality
- Target Size: Resize before processing to reduce computation
Parameter Tuning
blur_sigma
- 0.5-1.0: Minimal noise reduction
- 1.0-1.5: Moderate (recommended)
- 1.5-2.5: Heavy denoising
clahe_clip_limit
- 1.5-2.0: Subtle enhancement
- 2.0-3.0: Moderate (recommended)
- 3.0-4.0: Strong enhancement
clahe_tile_size
- 4: Very local, may cause artifacts
- 8: Good balance (recommended)
- 16: Smoother, less local
adaptive_window_size
- 7-11: Small features, faster
- 13-17: Medium (recommended)
- 19-25: Large features, slower
Examples
See /home/user/ruvector/examples/scipix/examples/ for complete working examples.