def get_int_var(masked_spectrum, distance, wavelength): propagation_array = get_propagation_array(masked_spectrum.shape, distance, wavelength) propagated = propagation_array * masked_spectrum reconstructed = get_shifted_idft(propagated) intensity = get_intensity(reconstructed) fitness = intensity.var() return fitness
def get_lowpass_var(masked_spectrum, distance): propagation_array = get_propagation_array(masked_spectrum.shape, distance) propagated = propagation_array * masked_spectrum lowpass_mask = get_lowpass_mask(propagated.shape, .4) propagated = lowpass_mask * propagated reconstructed = get_shifted_idft(propagated) intensity = get_intensity(reconstructed) fitness = intensity.var() return fitness
def get_peak_coords(spectrum): # TODO: must select by position not by intensity shape = spectrum.shape center = [dim / 2. for dim in shape] intensity = get_intensity(spectrum) circles = [(-get_distance(center, circle[1]), circle[0], circle[1]) for circle in get_circles(intensity, 2, 20)] circles.sort() peak = circles[0][2] peaks_row = (peak[0] - center[0]) / float(center[0]) peaks_col = (peak[1] - center[1]) / float(center[1]) return peaks_row, peaks_col
def get_auto_mask(spectrum, softness=0, radious_scale=.8, zero_scale=1.3, cuttop=0, centered=True): """ Try to filter spurious data out. """ shape = spectrum.shape rows, cols = shape center = (rows / 2., cols / 2.) intensity = get_intensity(spectrum) circles = get_circles(intensity, 3, 50) circles = sorted([(circle[1], circle[0], circle[2]) for circle in circles if get_distance(center, circle[0]) > 10])[-2:] circles = sorted([(circle[1], circle[0], circle[2]) for circle in circles]) virtual_order, real_order = circles zero_order = (center, 0, 0) peak_center, peak_height, peak_radious = real_order peak_radious = min([(abs(shape[0] / 3.5 - peak[2]), peak[2]) for peak in circles])[1] windowmaker = lambda x: np.kaiser(x, softness) window = get_holed_window(windowmaker, peak_radious * radious_scale) mask = get_mask(shape, window, peak_center) zerowindow = get_holed_window(windowmaker, peak_radious * zero_scale) zeromask = 1 - get_mask(shape, zerowindow, zero_order[0]) mask *= zeromask masked_intensity = mask * intensity cutoff = masked_intensity > (masked_intensity.max() - masked_intensity.ptp() * cuttop) mask[cutoff] = 0 masked = mask * spectrum if centered: masked = get_centered(masked, peak_center) mask = get_centered(mask, peak_center) centered = get_centered(intensity, peak_center) return mask, masked, centered