naroo_reader/ETA.py
linarphy 0060bddaef
Add label finder part
- remove the label part to clean the data
2023-05-05 18:01:42 +02:00

156 lines
3.4 KiB
Python

import numpy as np
from scipy.optimize import curve_fit
import utils
import sys
data = utils.load( sys.argv[1] )
"""
find fill points
"""
points = []
points += utils.find_point( data[ : , 0 ] , 0 ) # x_min
points += utils.find_point(
data[ : , data.shape[1] - 1 ],
data.shape[1] - 1 ,
) # x_max
index_min = 0
while data.shape[0] - 1 > index_min:
index_min += 1
if len( utils.find_point( data[ index_min , : ] , index_min , 'y' ) ) == 3:
break
points.append(
utils.find_point( data[ index_min , : ] , index_min , 'y' )[1]
) # y_min
index_max = data.shape[0] - 1
while index_min < index_max:
index_max -= 1
if len( utils.find_point( data[ index_max , : ] , index_max , 'y' ) ) == 3:
break
points.append(
utils.find_point( data[ index_max , : ] , index_max , 'y' )[1]
) # y_max
small_data = utils.compress( data , 5 )
points = utils.big_to_small( points , 5 )
# size - 1
points[ 1 ][ 1 ] -= 1
points[ 3 ][ 0 ] -= 1
# little shift to be inside the light
points[ 2 ][ 1 ] += 3
points[ 3 ][ 1 ] += 3
"""
fill data
"""
extremum = []
for point in points:
taken_points = utils.small_to_big(
utils.fill( small_data , point , 1000 ),
5
)
extremum.append( [
np.min( taken_points[ : , 1 ] ),
np.max( taken_points[ : , 1 ] ),
np.min( taken_points[ : , 0 ] ),
np.max( taken_points[ : , 0 ] ),
] )
border = {
'x': {
'min': extremum[0][1] + 1,
'max': extremum[1][0] ,
},
'y': {
'min': extremum[2][3] + 1,
'max': extremum[3][2] ,
},
}
"""
label deletion
"""
mean_data = np.mean( data[
border['y']['min'] : border['y']['max'],
border['x']['min'] : border['x']['max']
] , axis = 0 )
gauss = lambda x , sigma , mu , a , b : a * (
1 / sigma * np.sqrt(
2 * np.pi
) * np.exp(
- ( x - mu ) ** 2 / ( 2 * sigma ** 2 )
)
) + b
abciss = np.arange(
border['x']['min'],
border['x']['max'],
1
)
guess_params = [
1 ,
border['x']['min'] + ( border['x']['max'] - border['x']['min'] ) // 2,
np.max( mean_data ) ,
np.min( mean_data ) ,
]
first_estimate = curve_fit(
gauss ,
abciss ,
mean_data ,
guess_params
)[0]
part_data = [
mean_data[ : mean_data.shape[0] // 2 ],
mean_data[ mean_data.shape[0] // 2 : ]
]
part_abciss = [
abciss[ : abciss.shape[0] // 2 ],
abciss[ abciss.shape[0] // 2 : ]
]
part_result = []
for i in range( 2 ):
part_result.append(
curve_fit(
gauss ,
part_abciss[i],
part_data[i] ,
first_estimate
)
)
cov = np.array( [
np.sum( np.diag( part_result[i][1] ) ) for i in range( 2 )
] )
i = np.argmax( cov ) # part where the label is
derivee = np.convolve(
np.gradient( part_data[i] ),
np.ones( part_data[i].shape[0] // 100 ),
'same',
)
start_label = np.argmax( derivee )
end_label = np.argmin( derivee[ start_label :: ( - 1 ) ** i ] )
keys = [ 'min' , 'max' ]
border['x'][keys[i]] += ( - 1 ) ** i * ( start_label + end_label )
import matplotlib.pyplot as plt
plt.imshow( data[
border[ 'y' ][ 'min' ] : border[ 'y' ][ 'max' ],
border[ 'x' ][ 'min' ] : border[ 'x' ][ 'max' ]
] )
plt.savefig( 'asset/test.png' )