1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66
#![feature(slice_patterns)] extern crate image; #[macro_use] extern crate ndarray; extern crate string_error; extern crate getopts; use std::fs::File; use std::env; use getopts::Options; mod filter; mod utils; fn setup_option_parser() -> Options { let mut opts = Options::new(); opts.optopt("s", "blocksize", "set bocksize (default: 32)", "SIZE"); opts.optopt("i", "input", "input file path", "FILE"); opts.optopt("", "char-detect-thresh", "threshould for character detection (default: 10)", "THRESH"); opts.optopt("", "line-detect-thresh", "threshould for line detection (default: 10)", "THRESH"); opts.optopt("", "shrink-thresh", "threshould for shrink (default: 5)", "THRESH"); opts.optflag("", "help", ""); return opts; } fn main() { let args: Vec<String> = env::args().collect(); let parser = setup_option_parser(); let matches = match parser.parse(&args[1..]) { Ok(m) => m, Err(f) => panic!(f.to_string()) }; if !matches.opt_present("i") || matches.opt_present("help") { println!("{}", parser.short_usage("png2aa")); return; } let input_file = matches.opt_str("i").unwrap(); let mut hough_filter = filter::block_hough::default(); if let Some(block_size_str) = matches.opt_str("s") { hough_filter.block_size = block_size_str.parse().unwrap(); } if let Some(slope_count_thresh_str) = matches.opt_str("char-detect-thresh") { hough_filter.slope_count_thresh = slope_count_thresh_str.parse().unwrap(); } let mut binary_filter = filter::binary::default(); if let Some(line_detect_thresh_str) = matches.opt_str("line-detect-thresh") { binary_filter.thresh = line_detect_thresh_str.parse().unwrap(); } let mut shrink_filter = filter::shrink::default(); if let Some(shrink_thresh_str) = matches.opt_str("shrink-thresh") { shrink_filter.thresh = shrink_thresh_str.parse().unwrap(); } let image_array = utils::read_png(Box::new(File::open(input_file).unwrap())).unwrap(); let grayscale_array = filter::grayscale::default().run(image_array); let gradient_array = filter::line::default().run(grayscale_array.clone()); let line_array = shrink_filter.run(binary_filter.run(gradient_array)).mapv(|e| e as f32) * 250.; let hough_array = hough_filter.run(line_array); let aa = filter::ascii_art::default().run(hough_array); println!("{}", aa); }