use crate::cluster;
pub fn denoise(mask: &mut Vec<bool>, width: u32, height: u32, min_size: u32) {
if min_size <= 1 {
return;
}
let labels = cluster::label_components(mask, width, height, 8);
let max_label = labels.iter().copied().max().unwrap_or(0) as usize;
let mut counts = vec![0u32; max_label + 1];
for &label in &labels {
if label > 0 {
counts[label as usize] += 1;
}
}
for (i, &label) in labels.iter().enumerate() {
if label > 0 && counts[label as usize] < min_size {
mask[i] = false;
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn removes_small_clusters() {
#[rustfmt::skip]
let mut mask = vec![
true, true, false, false, false,
true, true, false, false, false,
false, false, false, false, false,
false, false, false, false, true,
false, false, false, false, false,
];
denoise(&mut mask, 5, 5, 3);
assert!(mask[0]); assert!(!mask[19]); }
#[test]
fn noop_when_disabled() {
let mut mask = vec![true, false, true, false];
let original = mask.clone();
denoise(&mut mask, 2, 2, 1);
assert_eq!(mask, original);
}
}