Files
wifi-densepose/vendor/ruvector/examples/scipix/tests/common/images.rs

146 lines
3.9 KiB
Rust

// Image generation utilities for testing
//
// Provides functions to generate test images with equations
use ab_glyph::{FontRef, PxScale};
use image::{DynamicImage, Rgba, RgbaImage};
use imageproc::drawing::{draw_filled_rect_mut, draw_text_mut};
use imageproc::rect::Rect;
use rand::Rng;
// Embedded font data
const FONT_DATA: &[u8] = include_bytes!("../../assets/fonts/DejaVuSans.ttf");
fn get_font() -> FontRef<'static> {
FontRef::try_from_slice(FONT_DATA).expect("Error loading embedded font")
}
/// Generate a simple equation image
pub fn generate_simple_equation(equation: &str) -> DynamicImage {
let width = 400;
let height = 100;
// Create white background
let mut image = RgbaImage::from_pixel(width, height, Rgba([255, 255, 255, 255]));
let font = get_font();
let scale = PxScale::from(32.0);
let color = Rgba([0, 0, 0, 255]);
// Draw text
draw_text_mut(&mut image, color, 20, 30, scale, &font, equation);
DynamicImage::ImageRgba8(image)
}
/// Generate a fraction image
pub fn generate_fraction(numerator: i32, denominator: i32) -> DynamicImage {
let width = 200;
let height = 150;
let mut image = RgbaImage::from_pixel(width, height, Rgba([255, 255, 255, 255]));
let font = get_font();
let scale = PxScale::from(28.0);
let color = Rgba([0, 0, 0, 255]);
// Draw numerator
draw_text_mut(
&mut image,
color,
85,
30,
scale,
&font,
&numerator.to_string(),
);
// Draw fraction line
draw_filled_rect_mut(&mut image, Rect::at(70, 65).of_size(60, 2), color);
// Draw denominator
draw_text_mut(
&mut image,
color,
80,
75,
scale,
&font,
&denominator.to_string(),
);
DynamicImage::ImageRgba8(image)
}
/// Generate an integral image
pub fn generate_integral(integrand: &str) -> DynamicImage {
let equation = format!(r"\int {}", integrand);
generate_simple_equation(&equation)
}
/// Generate a symbol image
pub fn generate_symbol(symbol: &str) -> DynamicImage {
generate_simple_equation(symbol)
}
/// Generate a blank image
pub fn generate_blank(width: u32, height: u32) -> DynamicImage {
let image = RgbaImage::from_pixel(width, height, Rgba([255, 255, 255, 255]));
DynamicImage::ImageRgba8(image)
}
/// Generate a complex equation
pub fn generate_complex_equation() -> DynamicImage {
let equation = r"\sum_{i=1}^{n} i^2 = \frac{n(n+1)(2n+1)}{6}";
generate_simple_equation(equation)
}
/// Add noise to an image
pub fn add_noise(image: &mut DynamicImage, intensity: f32) {
let mut rng = rand::thread_rng();
let rgba = image.as_mut_rgba8().unwrap();
for pixel in rgba.pixels_mut() {
for channel in 0..3 {
let noise = rng.gen_range(-intensity..intensity) * 255.0;
let new_value = (pixel[channel] as f32 + noise).clamp(0.0, 255.0) as u8;
pixel[channel] = new_value;
}
}
}
/// Add slight variation to an image
pub fn add_slight_variation(image: &mut DynamicImage, amount: f32) {
let mut rng = rand::thread_rng();
let rgba = image.as_mut_rgba8().unwrap();
for pixel in rgba.pixels_mut() {
for channel in 0..3 {
let variation = rng.gen_range(-amount..amount) * 255.0;
let new_value = (pixel[channel] as f32 + variation).clamp(0.0, 255.0) as u8;
pixel[channel] = new_value;
}
}
}
/// Generate a matrix image
pub fn generate_matrix(rows: usize, cols: usize) -> DynamicImage {
let mut elements = String::new();
for i in 0..rows {
for j in 0..cols {
elements.push_str(&format!("{} ", i * cols + j + 1));
if j < cols - 1 {
elements.push_str("& ");
}
}
if i < rows - 1 {
elements.push_str(r" \\ ");
}
}
let equation = format!(r"\begin{{bmatrix}} {} \end{{bmatrix}}", elements);
generate_simple_equation(&equation)
}