- Remove old label detection code and dependancy to scipy - Add quick label detection method without dependancies
149 lines
3.6 KiB
Python
149 lines
3.6 KiB
Python
import numpy as np
|
|
import utils
|
|
import sys
|
|
|
|
if len( sys.argv ) < 2:
|
|
raise Exception( 'this command must have a filename of an ETA fits as an argument' )
|
|
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:
|
|
if point[0] < points[2][0]:
|
|
point[0] = points[2][0]
|
|
if point[1] < points[0][1]:
|
|
point[1] = points[0][1]
|
|
taken_points = utils.small_to_big(
|
|
np.array( [
|
|
points[2][0],
|
|
points[0][1],
|
|
] ) + utils.fill(
|
|
small_data[
|
|
points[2][0] : points[3][0] + 1,
|
|
points[0][1] : points[1][1] + 1
|
|
],
|
|
[
|
|
point[0] - points[2][0],
|
|
point[1] - points[0][1],
|
|
],
|
|
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': points[0][1] + extremum[0][1] + 1,
|
|
'max': points[0][1] + extremum[1][0] ,
|
|
},
|
|
'y': {
|
|
'min': points[2][0] + extremum[2][3] + 1,
|
|
'max': points[2][0] + extremum[3][2] ,
|
|
},
|
|
}
|
|
|
|
"""
|
|
label deletion
|
|
"""
|
|
|
|
mean_data = np.convolve(
|
|
np.gradient(
|
|
np.mean(
|
|
data[
|
|
border[ 'y' ][ 'min' ] : border[ 'y' ][ 'max' ],
|
|
border[ 'x' ][ 'min' ] : border[ 'x' ][ 'max' ]
|
|
],
|
|
axis = 0
|
|
)
|
|
),
|
|
np.ones(
|
|
int( 0.01 * (
|
|
border[ 'x' ][ 'max' ] - border[ 'x' ][ 'min' ]
|
|
) )
|
|
),
|
|
'same'
|
|
)
|
|
|
|
mean_data -= np.min( mean_data )
|
|
mean_data /= np.max( mean_data )
|
|
|
|
top = utils.consecutive( np.where( mean_data > 0.75 )[0] )
|
|
down = utils.consecutive( np.where( mean_data < 0.25 )[0] )
|
|
|
|
size_top = [ len( list_ ) for list_ in top ]
|
|
size_down = [ len( list_ ) for list_ in down ]
|
|
|
|
label_x = {
|
|
'min': border[ 'x' ][ 'min' ] + top[ np.argmax( size_top ) ][0] ,
|
|
'max': border[ 'x' ][ 'min' ] + down[ np.argmax( size_down ) ][-1]
|
|
}
|
|
|
|
if label_x[ 'min' ] < data.shape[1] // 2:
|
|
if label_x[ 'max' ] < data.shape[1] // 2:
|
|
border[ 'x' ][ 'min' ] = label_x[ 'max' ]
|
|
else:
|
|
raise Exception( 'the label seems to be in the middle of the picture' )
|
|
elif label_x[ 'max' ] > data.shape[1] // 2:
|
|
border[ 'x' ][ 'max' ] = label_x[ 'min' ]
|
|
else:
|
|
raise Exception( 'for an unkown reason, label_x[ \'min\' ] > label_x[ \'max\' ]' )
|
|
|
|
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' )
|