Source code for imgreg.models.angleselect.solver

"""
Angle selection matching based on image matching.

Author: Fabian A. Preiss
"""

import numpy as np

from imgreg.models.angleselect.enums import AngleSelectParams
from imgreg.models.angleselect.params import (
    AngleAParam,
    AngleBParam,
    ImageParam,
    RecoveredRotationParam,
    RecoveredRotParam,
    RecoveredRotTrParam,
    RecoveredTranslationParam,
    RefImageParam,
    RotAParam,
    RotBParam,
    RotTrAParam,
    RotTrBParam,
    SelectorParam,
    TranslationAParam,
    TranslationBParam,
    UpsamplingParam,
)
from imgreg.util.solver import Solver


[docs]class AngleSelect(Solver): r""" Implements a model for angle selection Parameters ---------- img : numpy.ndarray The input image (one color channel only). ref_img : numpy.ndarray The reference image (one color channel only). angle_a, angle_b : float Candidate angles A and B in degrees upsampling : int Upsampling factor. 1 => no upsampling, 20 => precision to 1/20 of a pixel. Notes ----- The model implements the following dependency graph to construct it's `Parameter`\ s. .. graphviz:: ../_assets/dependencies_angleselect.gv """ def __init__( self, img: np.ndarray, ref_img: np.ndarray, angle_a: float, angle_b: float, upsampling: int = 10, ): super().__init__() p_img = ImageParam(img) p_ref_img = RefImageParam(ref_img) p_angle_a = AngleAParam(angle_a) p_angle_b = AngleBParam(angle_b) p_upsampling = UpsamplingParam(upsampling) p_rot_a_img = RotAParam({p_img, p_angle_a}) p_rot_b_img = RotBParam({p_img, p_angle_b}) p_translation_a = TranslationAParam( {p_ref_img, p_rot_a_img, p_upsampling, p_angle_a} ) p_translation_b = TranslationBParam( {p_ref_img, p_rot_b_img, p_upsampling, p_angle_b} ) p_rot_tr_a_img = RotTrAParam({p_img, p_angle_a, p_translation_a}) p_rot_tr_b_img = RotTrBParam({p_img, p_angle_b, p_translation_b}) p_selector = SelectorParam({p_rot_tr_a_img, p_rot_tr_b_img, p_ref_img}) p_recovered_rotation = RecoveredRotationParam( {p_selector, p_angle_a, p_angle_b} ) p_recovered_rot_img = RecoveredRotParam({p_selector, p_rot_a_img, p_rot_b_img}) p_recovered_translation = RecoveredTranslationParam( {p_selector, p_translation_a, p_translation_b} ) p_recovered_rot_tr_img = RecoveredRotTrParam( {p_selector, p_rot_tr_a_img, p_rot_tr_b_img} ) self._register_params( { p_img, p_ref_img, p_angle_a, p_angle_b, p_upsampling, p_rot_a_img, p_rot_b_img, p_translation_a, p_translation_b, p_rot_tr_a_img, p_rot_tr_b_img, p_selector, p_recovered_rotation, p_recovered_rot_img, p_recovered_translation, p_recovered_rot_tr_img, } ) self._generate_dep_graphs() for key in AngleSelectParams: setattr(self, key.name, self[key])