diff options
author | cc <cc@localhost> | 2025-08-28 02:33:06 -0700 |
---|---|---|
committer | cc <cc@localhost> | 2025-08-28 02:33:15 -0700 |
commit | 38efd731dd77a2eb78268525c5affe56ac96316c (patch) | |
tree | 72c92357f1f8002dca151025f80faab77d3ebdf0 /src | |
parent | f3d196cf4fb5501f9f5af4af3062ebdc7b703a82 (diff) |
Analysis Packaging
Diffstat (limited to 'src')
-rw-r--r-- | src/analysis.rs | 76 | ||||
-rw-r--r-- | src/lib.rs | 3 |
2 files changed, 79 insertions, 0 deletions
diff --git a/src/analysis.rs b/src/analysis.rs new file mode 100644 index 0000000..9cf0b6a --- /dev/null +++ b/src/analysis.rs @@ -0,0 +1,76 @@ +use crate::{LabelFormat,LabelU16}; + +use avl_tree::*; + +#[derive(Debug)] +struct Data { + label: u16, + area: usize, + perimeter: usize, + cell_cell: usize, + cell_tissue: usize, +} + +impl Data { + const fn new(label: u16, area: usize, perimeter: usize, cell_cell: usize, cell_tissue: usize) -> Self { + Self { + label, + area, + perimeter, + cell_cell, + cell_tissue, + } + } +} + + +impl LabelFormat<u16> { + fn get_tree(&self) -> AVLTree<u16, Data> { + let mut avt = avl_tree::AVLTree::<u16, Data>::new(); + for y in 0..self.height { + for x in 0..self.width { + let index = x + y * self.width; + let key = self.buffer[index]; + if key.is_zero() { + continue; + } + if let Some(data) = avt.get(key) { + let mut new_data = Data::new( + data.label, + data.area, + data.perimeter, + data.cell_cell, + data.cell_tissue, + ); + new_data.area += 1; + avt.insert(key, new_data); + } else { + avt.insert(key, Data::new(key, 1, 0, 0, 0)); + } + } + } + avt + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn get_areas_test() { + const DIM: usize = 6; + let mut test_data = LabelFormat::<u16> { + buffer: vec![0u16; DIM*DIM], + width: DIM, + height: DIM, + }; + test_data.buffer[2+3*DIM] = 1; + test_data.buffer[3+3*DIM] = 1; + test_data.buffer[4+3*DIM] = 2; + + for (key,val) in test_data.get_tree().iter() { + println!("{} -> {:?}",key,val) + } + } +} @@ -1,5 +1,8 @@ +extern crate avl_tree; + mod label_format; pub mod binfile; +pub mod analysis; pub use crate::label_format::{LabelFormat,LabelU16}; |