use crate::common::{RegParams, load_test_image};
use leptonica::PixelDepth;
use leptonica::morph::{
close_brick, close_brick_dwa, dilate_brick, dilate_brick_dwa, erode_brick, erode_brick_dwa,
open_brick, open_brick_dwa,
};
#[allow(clippy::too_many_arguments)]
fn pix_compare_dwa(
rp: &mut RegParams,
size: u32,
op_type: &str,
pix1: &leptonica::Pix,
pix2: &leptonica::Pix,
pix3: &leptonica::Pix,
pix4: &leptonica::Pix,
pix5: &leptonica::Pix,
pix6: &leptonica::Pix,
) {
let same = pix1.equals(pix2);
rp.compare_values(1.0, if same { 1.0 } else { 0.0 }, 0.0);
if !same {
eprintln!("{} ({}, 1) not same", op_type, size);
}
let same = pix3.equals(pix4);
rp.compare_values(1.0, if same { 1.0 } else { 0.0 }, 0.0);
if !same {
eprintln!("{} (1, {}) not same", op_type, size);
}
let same = pix5.equals(pix6);
rp.compare_values(1.0, if same { 1.0 } else { 0.0 }, 0.0);
if !same {
eprintln!("{} ({}, {}) not same", op_type, size, size);
}
}
fn do_comparison_dwa1(rp: &mut RegParams, pixs: &leptonica::Pix, size: u32) {
eprintln!("..{}..", size);
let pix1 = dilate_brick_dwa(pixs, size, 1).expect("dilate_brick_dwa h");
let pix3 = dilate_brick_dwa(pixs, 1, size).expect("dilate_brick_dwa v");
let pix5 = dilate_brick_dwa(pixs, size, size).expect("dilate_brick_dwa sq");
let pix2 = dilate_brick(pixs, size, 1).expect("dilate_brick h");
let pix4 = dilate_brick(pixs, 1, size).expect("dilate_brick v");
let pix6 = dilate_brick(pixs, size, size).expect("dilate_brick sq");
pix_compare_dwa(rp, size, "dilate", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = erode_brick_dwa(pixs, size, 1).expect("erode_brick_dwa h");
let pix3 = erode_brick_dwa(pixs, 1, size).expect("erode_brick_dwa v");
let pix5 = erode_brick_dwa(pixs, size, size).expect("erode_brick_dwa sq");
let pix2 = erode_brick(pixs, size, 1).expect("erode_brick h");
let pix4 = erode_brick(pixs, 1, size).expect("erode_brick v");
let pix6 = erode_brick(pixs, size, size).expect("erode_brick sq");
pix_compare_dwa(rp, size, "erode", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = open_brick_dwa(pixs, size, 1).expect("open_brick_dwa h");
let pix3 = open_brick_dwa(pixs, 1, size).expect("open_brick_dwa v");
let pix5 = open_brick_dwa(pixs, size, size).expect("open_brick_dwa sq");
let pix2 = open_brick(pixs, size, 1).expect("open_brick h");
let pix4 = open_brick(pixs, 1, size).expect("open_brick v");
let pix6 = open_brick(pixs, size, size).expect("open_brick sq");
pix_compare_dwa(rp, size, "open", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = close_brick_dwa(pixs, size, 1).expect("close_brick_dwa h");
let pix3 = close_brick_dwa(pixs, 1, size).expect("close_brick_dwa v");
let pix5 = close_brick_dwa(pixs, size, size).expect("close_brick_dwa sq");
let pix2 = close_brick(pixs, size, 1).expect("close_brick h");
let pix4 = close_brick(pixs, 1, size).expect("close_brick v");
let pix6 = close_brick(pixs, size, size).expect("close_brick sq");
pix_compare_dwa(rp, size, "close", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
}
fn do_comparison_dwa2(rp: &mut RegParams, pixs: &leptonica::Pix, size: u32) {
eprintln!("..{}..", size);
let pix1 = dilate_brick_dwa(pixs, size, 1).expect("dilate_brick_dwa h");
let pix3 = dilate_brick_dwa(pixs, 1, size).expect("dilate_brick_dwa v");
let pix5 = dilate_brick_dwa(pixs, size, size).expect("dilate_brick_dwa sq");
let pix2 = dilate_brick(pixs, size, 1).expect("dilate_brick h");
let pix4 = dilate_brick(pixs, 1, size).expect("dilate_brick v");
let pix6 = dilate_brick(pixs, size, size).expect("dilate_brick sq");
pix_compare_dwa(rp, size, "dilate", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = erode_brick_dwa(pixs, size, 1).expect("erode_brick_dwa h");
let pix3 = erode_brick_dwa(pixs, 1, size).expect("erode_brick_dwa v");
let pix5 = erode_brick_dwa(pixs, size, size).expect("erode_brick_dwa sq");
let pix2 = erode_brick(pixs, size, 1).expect("erode_brick h");
let pix4 = erode_brick(pixs, 1, size).expect("erode_brick v");
let pix6 = erode_brick(pixs, size, size).expect("erode_brick sq");
pix_compare_dwa(rp, size, "erode", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = open_brick_dwa(pixs, size, 1).expect("open_brick_dwa h");
let pix3 = open_brick_dwa(pixs, 1, size).expect("open_brick_dwa v");
let pix5 = open_brick_dwa(pixs, size, size).expect("open_brick_dwa sq");
let pix2 = open_brick(pixs, size, 1).expect("open_brick h");
let pix4 = open_brick(pixs, 1, size).expect("open_brick v");
let pix6 = open_brick(pixs, size, size).expect("open_brick sq");
pix_compare_dwa(rp, size, "open", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
let pix1 = close_brick_dwa(pixs, size, 1).expect("close_brick_dwa h");
let pix3 = close_brick_dwa(pixs, 1, size).expect("close_brick_dwa v");
let pix5 = close_brick_dwa(pixs, size, size).expect("close_brick_dwa sq");
let pix2 = close_brick(pixs, size, 1).expect("close_brick h");
let pix4 = close_brick(pixs, 1, size).expect("close_brick v");
let pix6 = close_brick(pixs, size, size).expect("close_brick sq");
pix_compare_dwa(rp, size, "close", &pix1, &pix2, &pix3, &pix4, &pix5, &pix6);
}
fn select_composable_sizes(size: u32) -> (u32, u32) {
let sqrt = (size as f64).sqrt() as u32;
for f1 in (2..=sqrt).rev() {
if size.is_multiple_of(f1) {
return (f1, size / f1);
}
}
(1, size)
}
#[test]
fn binmorph5_reg() {
let mut rp = RegParams::new("binmorph5");
let pixs = load_test_image("feyn-fract.tif").expect("load feyn-fract.tif");
assert_eq!(pixs.depth(), PixelDepth::Bit1);
eprintln!("Testing with asymmetric boundary conditions");
let faster_test_sizes: Vec<u32> = (65..100)
.filter(|&i| {
let (f1, f2) = select_composable_sizes(i);
f1 > 1 && f1 * f2 == i
})
.collect();
for &size in &faster_test_sizes {
do_comparison_dwa1(&mut rp, &pixs, size);
}
let slower_test_sizes = [65, 70, 77, 84, 91, 98, 100, 105, 110, 120];
for &size in &slower_test_sizes {
do_comparison_dwa2(&mut rp, &pixs, size);
}
eprintln!();
assert!(rp.cleanup(), "binmorph5 regression test failed");
}