def _find_leaf_centers(self, hdmlc): """Return the leaf centers perpendicular to the leaf motion.""" # generate some settings sm_lf_wdth = 5 * self.image.dpmm bg_lf_wdth = sm_lf_wdth * 2 if hdmlc: sm_lf_wdth /= 2 bg_lf_wdth /= 2 self._sm_lf_meas_wdth = slmw = int(round(sm_lf_wdth*3/4)) self._bg_lf_meas_wdth = blmw = int(round(bg_lf_wdth*3/4)) bl_ex = int(bg_lf_wdth/4) sm_ex = int(sm_lf_wdth/4) # generate leaf profile if self.orientation == orientations['UD']: leaf_prof = np.mean(self._analysis_array, 1) center = self.image.center.y else: leaf_prof = np.mean(self._analysis_array, 0) center = self.image.center.x leaf_prof = Profile(leaf_prof) # ground profile to reasonable level _, peak_idxs = leaf_prof.find_peaks(min_peak_distance=self._sm_lf_meas_wdth, exclude_lt_edge=sm_ex, exclude_rt_edge=sm_ex) min_val = leaf_prof.y_values[peak_idxs[0]:peak_idxs[-1]].min() leaf_prof.y_values[leaf_prof.y_values < min_val] = min_val # remove unevenness in signal leaf_prof.y_values = signal.detrend(leaf_prof.y_values, bp=[int(len(leaf_prof.y_values)/3), int(len(leaf_prof.y_values)*2/3)]) _, peak_idxs = leaf_prof.find_peaks(min_peak_distance=self._sm_lf_meas_wdth, exclude_lt_edge=sm_ex, exclude_rt_edge=sm_ex) leaf_range = (peak_idxs[-1] - peak_idxs[0]) / self.image.dpmm # mm sm_lf_range = 220 # mm # find leaf peaks if leaf_range > sm_lf_range: lt_biglittle_lf_bndry = int(round(center - 100 * self.image.dpmm)) rt_biglittle_lf_bndry = int(round(center + 100 * self.image.dpmm)) pp = leaf_prof.subdivide([lt_biglittle_lf_bndry, rt_biglittle_lf_bndry], slmw) if len(pp) != 3: raise ValueError("3 Profiles weren't found but should have been") # Left Big MLC region _, peak_idxs = pp[0].find_peaks(min_peak_distance=blmw, exclude_lt_edge=bl_ex) peak_diff = np.diff(peak_idxs).mean() lt_v_idx = np.array(peak_idxs[:-1]) + peak_diff/2 # Middle, small MLC region _, peak_idxs = pp[1].find_peaks(min_peak_distance=slmw) peak_diff = np.diff(peak_idxs).mean() mid_v_idx = np.array(peak_idxs[:-1]) + peak_diff / 2 # Right Big MLC region _, peak_idxs = pp[2].find_peaks(min_peak_distance=blmw, exclude_rt_edge=bl_ex) peak_diff = np.diff(peak_idxs).mean() rt_v_idx = np.array(peak_idxs[:-1]) + peak_diff / 2 leaf_center_idxs = np.concatenate((lt_v_idx, mid_v_idx, rt_v_idx)) else: _, peak_idxs = leaf_prof.find_peaks(min_peak_distance=slmw, exclude_lt_edge=sm_ex, exclude_rt_edge=sm_ex) _, peak_idxs = leaf_prof.find_FWXM_peaks(min_peak_distance=slmw, interpolate=True) peak_diff = np.diff(peak_idxs).mean() leaf_center_idxs = np.array(peak_idxs[:-1]) + peak_diff / 2 return leaf_center_idxs