pub struct InnerAsOuterRecoveryConfig {
pub enable: bool,
pub ratio_threshold: f32,
pub k_neighbors: usize,
pub min_theta_consistency: f32,
pub min_theta_coverage: f32,
pub min_ring_depth: f32,
pub refine_halfwidth_px: f32,
pub size_gate_tolerance: f32,
}Expand description
Configuration for automatic recovery of markers where the inner edge was incorrectly fitted as the outer ellipse.
After all markers are finalized, each marker’s outer radius is compared to
the median outer radius of its k nearest neighbors. A ratio well below 1.0
(see ratio_threshold) indicates the outer fit locked onto the inner ring
edge. When enabled, the detector re-attempts the outer fit for flagged
markers using the neighbor median radius as the corrected expected radius.
The recovery re-fit uses a tight 4 px search window (to exclude the inner
ring) combined with relaxed quality gates (min_theta_consistency,
min_ring_depth, refine_halfwidth_px) suited to the blurry/soft edges
that typically cause inner-as-outer confusion. A post-fit size gate
(size_gate_tolerance) prevents the relaxed estimator from re-locking onto
the inner ring even under the relaxed thresholds.
Fields§
§enable: boolEnable inner-as-outer recovery (default: true).
ratio_threshold: f32Neighbor-radius ratio below which a marker is considered anomalous and a re-fit is attempted.
Default: 0.75. Markers with own_radius / neighbor_median < 0.75 are
flagged. A value of ~0.64 is expected for an inner-as-outer confusion
(inner radius ≈ 0.49 × outer radius → ratio = 0.49 / 0.77 ≈ 0.64 when
inner accounts for the inner/outer ratio of the ring marker geometry).
k_neighbors: usizeNumber of nearest neighbors used to compute the median outer radius.
Default: 6 (matching the hex-lattice neighbor count). Self is always
excluded by passing k+1 to the neighbor function.
min_theta_consistency: f32Minimum fraction of angular samples (rays) whose radial peak must agree with the selected hypothesis radius during the recovery re-estimation.
Lower than the production default (0.35) because blurry outer edges
scatter per-θ peaks more widely. Default: 0.18.
min_theta_coverage: f32Minimum fraction of angular rays with valid (in-bounds) samples during
the recovery re-estimation. Default: 0.40.
min_ring_depth: f32Minimum signed intensity depth at a candidate outer edge point during
recovery edge collection. Lower than production (0.05) to tolerate
blur-smeared intensity gradients. Default: 0.02.
refine_halfwidth_px: f32Per-ray radius refinement half-width (pixels) during recovery. Wider
than production (1.0 px) to catch the flat-topped derivative peaks that
occur under blur. Default: 2.5.
size_gate_tolerance: f32Maximum allowed fractional deviation of the recovered outer radius from
the neighbor-median corrected radius: |r_recovered - r_corrected| / r_corrected ≤ size_gate_tolerance. Prevents the relaxed estimator from
accepting a re-locked inner-ring fit. Default: 0.25.
Trait Implementations§
Source§impl Clone for InnerAsOuterRecoveryConfig
impl Clone for InnerAsOuterRecoveryConfig
Source§fn clone(&self) -> InnerAsOuterRecoveryConfig
fn clone(&self) -> InnerAsOuterRecoveryConfig
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for InnerAsOuterRecoveryConfig
impl Debug for InnerAsOuterRecoveryConfig
Source§impl Default for InnerAsOuterRecoveryConfig
impl Default for InnerAsOuterRecoveryConfig
Source§impl<'de> Deserialize<'de> for InnerAsOuterRecoveryConfigwhere
InnerAsOuterRecoveryConfig: Default,
impl<'de> Deserialize<'de> for InnerAsOuterRecoveryConfigwhere
InnerAsOuterRecoveryConfig: Default,
Source§fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>where
__D: Deserializer<'de>,
Auto Trait Implementations§
impl Freeze for InnerAsOuterRecoveryConfig
impl RefUnwindSafe for InnerAsOuterRecoveryConfig
impl Send for InnerAsOuterRecoveryConfig
impl Sync for InnerAsOuterRecoveryConfig
impl Unpin for InnerAsOuterRecoveryConfig
impl UnsafeUnpin for InnerAsOuterRecoveryConfig
impl UnwindSafe for InnerAsOuterRecoveryConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.