- registration getting better

This commit is contained in:
Wim Pomp
2026-07-29 21:48:02 +02:00
parent bb3d46cc9d
commit 001df705ef
3 changed files with 52 additions and 35 deletions
+30 -17
View File
@@ -749,7 +749,7 @@ mod tests {
)
.slice(s![.., 0])
.mapv(|i| i as f64);
let q = vec![0.85, 4.0];
let q = vec![0.85, 2.0];
let im_b =
Transform::new(q.clone(), vec![im_a.shape()[0]]).interpolate::<1, _, _>(&im_a)?;
@@ -871,7 +871,7 @@ mod tests {
let f = gaussian_smooth(im_a.view(), &[*sigma_val; 2])?;
let m = gaussian_smooth(im_b.view(), &[*sigma_val; 2])?;
let bf = BSpline::<0, _>::new(f.view());
let bm = BSpline::<1, _>::new(m.view());
let bm = BSpline::<3, _>::new(m.view());
let metric = MattesMetric::new(bf, bm, SamplingArg::Random(3000), 128, edge)?;
let mi_id = metric.evaluate(&identity);
@@ -899,7 +899,7 @@ mod tests {
let f4 = gaussian_smooth(im_a.view(), &[4.0, 4.0])?;
let m4 = gaussian_smooth(im_b.view(), &[4.0, 4.0])?;
let bf4 = BSpline::<0, _>::new(f4.view());
let bm4 = BSpline::<1, _>::new(m4.view());
let bm4 = BSpline::<3, _>::new(m4.view());
let metric4 = MattesMetric::new(bf4, bm4, SamplingArg::Random(5000), 128, edge)?;
let mi_p_coarse = metric4.evaluate(&p);
let mi_qinv_coarse = metric4.evaluate(&q_inv);
@@ -943,7 +943,7 @@ mod tests {
let m = gaussian_smooth(im_b.view(), &[4.0, 4.0])?;
let metric = MattesMetric::new(
BSpline::<0, _>::new(f.view()),
BSpline::<1, _>::new(m.view()),
BSpline::<3, _>::new(m.view()),
SamplingArg::Random(3000),
128,
edge,
@@ -1022,13 +1022,24 @@ mod tests {
.fold(0.0f64, f64::max);
println!("Our: {:?} max_err: {:.4} sse: {:.4}", t, max_err, sse);
let mut tif = IJTiffFile::new(std::env::home_dir().unwrap().join("tmp/register_real_images.tif"))?;
let mut tif = IJTiffFile::new(
std::env::home_dir()
.unwrap()
.join("tmp/register_real_images.tif"),
)?;
tif.save(fixed.mapv(|i| i as u16), 0, 0, 0)?;
tif.save(t.interpolate_par::<1, _, _>(moving.view())?.mapv(|i| i as u16), 1, 0, 0)?;
tif.save(
t.interpolate_par::<1, _, _>(moving.view())?
.mapv(|i| i as u16),
1,
0,
0,
)?;
tif.save(moving.mapv(|i| i as u16), 2, 0, 0)?;
assert!(max_err < 0.1);
assert!(sse < 0.1);
assert!(max_err < 0.02);
assert!(sse < 0.02);
Ok(())
}
@@ -1036,7 +1047,8 @@ mod tests {
#[test]
fn register_real_images2() -> Result<(), Box<dyn std::error::Error>> {
let fixed = read_tiff("test_files/fixed.tif")?;
let e = Transform::<Ix2>::new(vec![0.8, 0.0, 0.0, 1.0, 0.0, 0.0], fixed.shape().to_vec()).inverse()?;
let e = Transform::<Ix2>::new(vec![0.8, 0.0, 0.0, 1.0, 0.0, 0.0], fixed.shape().to_vec())
.inverse()?;
let moving = e.interpolate::<3, _, _>(fixed.view())?;
let t = Transform::<Ix2>::register(
@@ -1047,27 +1059,28 @@ mod tests {
None,
)?;
let e_inv = e.inverse()?;
let sse = t
.parameters
.iter()
.zip(e.parameters.iter())
.zip(e_inv.parameters.iter())
.map(|(a, b)| (a - b).powi(2))
.sum::<f64>();
let max_err = t
.parameters
.iter()
.zip(e.parameters.iter())
.zip(e_inv.parameters.iter())
.map(|(a, b)| (a - b).abs())
.fold(0.0f64, f64::max);
println!("Our: {:?} max_err: {:.4} sse: {:.4}", t, max_err, sse);
// let mut tif = IJTiffFile::new(std::env::home_dir().unwrap().join("tmp/register_real_images2.tif"))?;
// tif.save(fixed.mapv(|i| i as u16), 0, 0, 0)?;
// tif.save(t.interpolate_par::<1, _, _>(moving.view())?.mapv(|i| i as u16), 1, 0, 0)?;
// tif.save(moving.mapv(|i| i as u16), 2, 0, 0)?;
let mut tif = IJTiffFile::new(std::env::home_dir().unwrap().join("tmp/register_real_images2.tif"))?;
tif.save(fixed.mapv(|i| i as u16), 0, 0, 0)?;
tif.save(t.interpolate_par::<1, _, _>(moving.view())?.mapv(|i| i as u16), 1, 0, 0)?;
tif.save(moving.mapv(|i| i as u16), 2, 0, 0)?;
assert!(max_err < 0.1);
assert!(sse < 0.1);
assert!(max_err < 0.02);
assert!(sse < 0.02);
Ok(())
}