def get_fmt(array, high_pass=0.15): """ Follows this algoritm: * FFT with centered frecuencies * convolucionar la magnitud con un filtro high pass * Logpolar * FFT with centered frecuencies """ fourier = get_shifted_dft(array) magnitude = np.abs(fourier) high_passed = get_high_pass_filter(magnitude, high_pass, 0) logpolar = get_logpolar(high_passed, 3) fmt = get_shifted_dft(logpolar) return fmt
def get_initial_phase(hologram, wavelength=1): fringes = hologram / float(hologram.ptp()) fringes = (fringes + fringes.min()) * 2 - 1 image_dft = get_shifted_dft(fringes) cos_alpha, cos_beta = calculate_director_cosines(image_dft, wavelength, (1, 1)) maxrow = fringes.shape[0] maxcol = fringes.shape[1] row, col = np.ogrid[:maxrow:1., :maxcol:1.] plane = cos_alpha * col + cos_beta * row def fitness((alpha, beta, offset)): alpha = (sigmoid(alpha) - 0.5) * 2 ** 2 beta = (sigmoid(beta) - 0.5) * 2 ** 2 offset = sigmoid(offset) * tau / 2 correction = cos_alpha * col + cos_beta * row + offset sintetic_fringes = get_fringes(plane + correction, wavelength) score = np.sum(np.fabs(fringes - sintetic_fringes)) print(alpha, beta, offset, score) return score alpha, beta, offset = generic_minimizer(fitness, [0, 0, 0]) alpha = (sigmoid(alpha) - 0.5) * 2 ** 2 beta = (sigmoid(beta) - 0.5) * 2 ** 2 offset = sigmoid(offset) * tau / 2 correction = alpha * col + beta * row + offset plane = plane + correction return plane
def get_initial_phase(hologram, wavelength=1): fringes = hologram / float(hologram.ptp()) fringes = (fringes + fringes.min()) * 2 - 1 image_dft = get_shifted_dft(fringes) cos_alpha, cos_beta = calculate_director_cosines(image_dft, wavelength, (1, 1)) maxrow = fringes.shape[0] maxcol = fringes.shape[1] row, col = np.ogrid[:maxrow:1., :maxcol:1.] plane = cos_alpha * col + cos_beta * row def fitness((alpha, beta, offset)): alpha = (sigmoid(alpha) - 0.5) * 2**2 beta = (sigmoid(beta) - 0.5) * 2**2 offset = sigmoid(offset) * tau / 2 correction = cos_alpha * col + cos_beta * row + offset sintetic_fringes = get_fringes(plane + correction, wavelength) score = np.sum(np.fabs(fringes - sintetic_fringes)) print(alpha, beta, offset, score) return score alpha, beta, offset = generic_minimizer(fitness, [0, 0, 0]) alpha = (sigmoid(alpha) - 0.5) * 2**2 beta = (sigmoid(beta) - 0.5) * 2**2 offset = sigmoid(offset) * tau / 2 correction = alpha * col + beta * row + offset plane = plane + correction return plane
def phase_detection(masked_spectrum, distance): shape = masked_spectrum.shape shape_center = [dim / 2 for dim in shape] filtered_hologram = get_shifted_idft(masked_spectrum) focus_mask = get_mask(shape, np.ones(20), shape_center) focus_feature = filtered_hologram * focus_mask feature_spectrum = get_shifted_dft(focus_feature) propagation_array = get_propagation_array(shape, distance) propagated_spectrum = propagation_array * feature_spectrum propagated_hologram = get_shifted_idft(propagated_spectrum) radious = 50 separation = 400 window = np.ones(radious) spectrum2sensor = np.angle spectrum2sensor = np.abs spectrum2sensor = get_intensity spectrum2sensor = normalize left_center = shape_center[0], shape_center[1] - separation / 2 left_mask = get_mask(shape, window, left_center) # left_bundle = left_mask * propagated_spectrum left_bundle = left_mask * propagated_hologram left_sensor = spectrum2sensor(get_shifted_dft(left_bundle)) left_peak = get_circles(left_sensor, 1, 50)[0][1] right_center = shape_center[0], shape_center[1] + separation / 2 right_mask = get_mask(shape, window, right_center) right_bundle = right_mask * propagated_hologram right_sensor = spectrum2sensor(get_shifted_dft(right_bundle)) right_peak = get_circles(right_sensor, 1, 50)[0][1] # showimage(normalize(np.maximum(left_bundle, right_bundle))) # showimage(normalize(np.maximum(left_sensor, right_sensor))) distance = get_distance(left_peak, right_peak) fitness = distance return fitness
def get_spectrum(rhologram, **kw): spectrum = get_shifted_dft(rhologram) return spectrum
def spectrum(self): print("Spectrum (dft(hologram))") if self.use_refbeam: return get_shifted_dft(self.hologram) else: return self.ispectrum
def ispectrum(self): print("DFT(image)") return get_shifted_dft(self.image)