From 59927fb215302daf77d7337ebb61ee5f51ee0970 Mon Sep 17 00:00:00 2001 From: Jeremy Muhlich Date: Thu, 11 Jul 2024 14:14:06 -0400 Subject: [PATCH] Fix edge cases affecting synthetic/small datasets * Skip LayerAligner.register padding=0 assert when error is inf or insersection shape is <=1 in some dimension * Skip LayerAligner.register_angle when intersection shape is <=1 in some dimension (increased from 0) * Remove step where LayerAligner intersection size is rounded to a multiple of 32 pixels --- ashlar/reg.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/ashlar/reg.py b/ashlar/reg.py index 5bb27f50..2d9be95a 100644 --- a/ashlar/reg.py +++ b/ashlar/reg.py @@ -978,14 +978,18 @@ def register(self, t): # Add back in the fractional position difference that overlap() loses. # TODO How does rotation affect this? shift = tuple(shift + its.offset_diff_frac) - # We don't use padding and thus can skip the math to account for it. - assert (its.padding == 0).all(), "Unexpected non-zero padding" + # We don't use padding and thus can skip the math to account for it, but + # we will assert this just to make sure. + if error < np.inf and all(its.shape > 1): + # Skip assertion if error is infinite, indicating a degenerate + # Intersection that won't be usable anyway. + assert (its.padding == 0).all(), "Unexpected non-zero padding" return shift, error def register_angle(self, t): """Return relative rotation angle between images.""" its, ref_img, img = self.overlap(t) - if np.any(np.array(its.shape) == 0): + if np.any(np.array(its.shape) <= 1): return np.nan angle = utils.register_angle(ref_img, img, self.filter_sigma) return angle @@ -1018,7 +1022,6 @@ def intersection(self, t): corners1 = np.vstack([center_a, center_b]) - self.reader.metadata.size / 2 corners2 = corners1 + self.reader.metadata.size its = Intersection(corners1, corners2) - its.shape = its.shape // 32 * 32 return its def overlap(self, t):