Calculations/Siemens-Star-Analyzer/Analyzer.py

68 lines
1.8 KiB
Python
Raw Normal View History

2024-06-18 19:01:35 +02:00
import numpy as np
import pyfits
import matplotlib.pyplot as plt
import skimage
from skimage.feature import blob_dog, blob_doh, blob_log, canny
from skimage.color import rgb2gray
from skimage.feature import corner_harris, corner_subpix, corner_peaks
from skimage.segmentation import slic
from skimage.filters import sobel
from scipy.signal import convolve2d
from scipy.ndimage import gaussian_filter
from skimage import measure
from scipy.optimize import curve_fit
import matplotlib.ticker as mtick
from scipy.signal import savgol_filter
import scipy
from scipy import signal
from scipy.signal import argrelextrema
import cv2
## this function will get the values along each circle. We start by defining a range of angles, computing the
#coordinates and then finding the values at the nearest pixel position.
def get_line(star,theta,radius,x_c,y_c):
#theta = np.linspace(0,2*np.pi,N_theta)
x = x_c + radius*np.cos(theta)
y = y_c + radius*np.sin(theta)
x = np.round(x)
y = np.round(y)
x = x.astype(int)
y = y.astype(int)
I = star[y,x]
return I,x,y
## a function to compute the frequecy for a certain radius
def get_radius(freq):
N_p = 36
r = N_p/(2*np.pi*freq)
return r
## a function to compute the radius for a certain frequency
def get_freq(radius):
N_p = 36
freq = N_p/(2*np.pi*radius)
return freq
def sinusoidal(theta,a,b,c):
N_p = 36
y = a + b*np.sin(N_p*theta) + c*np.cos(N_p*theta)
return y
def fit_sinusoid(I,theta,p0):
popt, pcov = curve_fit(sinusoidal,theta,I,p0)
a = popt[0]
b = popt[1]
c = popt[2]
modulation = np.sqrt(b**2 + c**2)/a
return modulation, popt
def Gaussian(x,a,x0,sigma):
y = a*(1/(np.sqrt(2*np.pi)*sigma))*np.exp(-(x-x0)**2/(2*sigma**2))
#y = np.exp(-2*(np.pi**2)*((x-x0)**2)*sigma**2)
return y