Kamui is a python package for robust and accurate phase unwrapping on 2-D, 3-D, or sparse data.
Kamui unwrap the phases by viewing the data points as vertices
where
This formulation is based on the fact that the true phase differences,
Unwrapping phase with Kamui can be computationally heavy. Acceleration techniques, such as dividing the graph into subgraphs, will be implemented in the future.
pip install kamui Kamui also provides PUMA, a fast and robust phase unwrapping algorithm based on graph cuts as an alternative. To install PUMA, run
pip install kamui[extra] However, it uses the original maxflow implementation by Vladimir Kolmogorov with GPL license. Please follow the licensing instruction in PyMaxflow if you use this version of Kamui.
For regular 2-D or 3-D data such as interferograms, use kamui.unwrap_dimensional:
import numpy as np def unwrap_dimensional( x: np.ndarray, start_pixel: Optional[Union[Tuple[int, int], Tuple[int, int, int]]] = None, use_edgelist: bool = False, **kwargs ) -> np.ndarray: """ Unwrap the phase of a 2-D or 3-D array. Parameters ---------- x : 2-D or 3-D np.ndarray The phase to be unwrapped. start_pixel : (2,) or (3,) tuple the reference pixel to start unwrapping. Default to (0, 0) for 2-D data and (0, 0, 0) for 3-D data. use_edgelist : bool Whether to use the edgelist method. Default to False. kwargs : dict Other arguments passed to `kamui.unwrap_arbitrary`. Returns ------- np.ndarray The unwrapped phase of the same shape as x. """For sparse data, use kamui.unwrap_arbitrary:
import numpy as np def unwrap_arbitrary( psi: np.ndarray, edges: np.ndarray, simplices: Iterable[Iterable[int]] = None, method: str = "ilp", period: float = 2 * np.pi, start_i: int = 0, **kwargs, ) -> np.ndarray: """ Unwrap the phase of arbitrary data. Parameters ---------- psi : 1D np.ndarray of shape (P,) The phase (vertices) to be unwrapped. edges : 2-D np.ndarray of shape (M, 2) The edges of the graph. simplices : Iterable[Iterable[int]] of length (N,) Each element is a list of vertices that form a simplex (a.k.a elementary cycle). The connections should be consistent with the edges. This is also used to compute automatic weights for each edge. If not provided and method is "ilp", an edgelist-based ILP solver will be used without weighting. method : str The method to be used. Valid options are "ilp" and "gc", where "gc" correponds to PUMA. Default to "ilp". period : float The period of the phase. Default to 2 * np.pi. start_i : int The index of the reference vertex to start unwrapping. Default to 0. kwargs : dict Other arguments passed to the solver. Returns ------- np.ndarray The unwrapped phase of the same shape as psi. """- subgraph division
- edges-based custom weighting
- vertices-based custom weighting