Coverage for src/spectroflat/fitting/line_locator.py: 100%
22 statements
« prev ^ index » next coverage.py v7.3.2, created at 2024-03-28 07:59 +0000
« prev ^ index » next coverage.py v7.3.2, created at 2024-03-28 07:59 +0000
1import numpy as np
2from scipy import signal as sig
4from ..base import Logging
6log = Logging.get_logger()
9class AutoLineLocator:
11 def __init__(self, image: np.array, line_distance: int = 100, sigma: float = 0.6, line_prominence=0):
12 self.img = image
13 self.sigma = sigma
14 self.line_distance = line_distance
15 self.line_prominence = line_prominence
17 def detect_centers(self) -> np.array:
18 self._normalize()
19 return self._detect_peaks()
21 def _normalize(self):
22 self.img = self.img / self.img.std()
23 self.img = self.img - self.img.min()
25 def _detect_peaks(self) -> np.array:
26 row_means = self.img.mean(axis=0)
27 h = np.mean(row_means) + self.sigma * np.std(row_means)
28 peaks, _ = sig.find_peaks(row_means, height=h, distance=self.line_distance, prominence=self.line_prominence)
29 log.info('Detected %s lines at:\n%s', len(peaks), peaks)
30 return peaks