Add retrieve_peaks() function and fix consecutive()
This commit is contained in:
parent
0d79633290
commit
8db571f34c
1 changed files with 43 additions and 1 deletions
44
utils.py
44
utils.py
|
@ -192,7 +192,7 @@ def last_consecutive( list_ ):
|
||||||
raise ValueError( 'list_ must be a list, ' + type( list_ ) + ' given' )
|
raise ValueError( 'list_ must be a list, ' + type( list_ ) + ' given' )
|
||||||
first , lower , greater = list_[0] , 0 , len( list_ )
|
first , lower , greater = list_[0] , 0 , len( list_ )
|
||||||
i = lower + ( greater - lower ) // 2
|
i = lower + ( greater - lower ) // 2
|
||||||
while greater - lower != 1:
|
while greater - lower != 0:
|
||||||
i = lower + ( greater - lower ) // 2
|
i = lower + ( greater - lower ) // 2
|
||||||
if list_[ i ] - first != i: # outside of the consecutive list
|
if list_[ i ] - first != i: # outside of the consecutive list
|
||||||
greater = i
|
greater = i
|
||||||
|
@ -212,3 +212,45 @@ def rotate( image , angle ):
|
||||||
cX , cY = ( width // 2 , height // 2 )
|
cX , cY = ( width // 2 , height // 2 )
|
||||||
matrix = cv2.getRotationMatrix2D( ( cX , cY ) , angle , 1 )
|
matrix = cv2.getRotationMatrix2D( ( cX , cY ) , angle , 1 )
|
||||||
return cv2.warpAffine( image , matrix , ( width , height ) , flags = cv2.INTER_NEAREST )
|
return cv2.warpAffine( image , matrix , ( width , height ) , flags = cv2.INTER_NEAREST )
|
||||||
|
def retrieve_peaks( data , window_size = 5 , error_coef = 1.05 , max_window_size = 30 , min_successive = 3 ):
|
||||||
|
"""
|
||||||
|
get peak position from a 1D data
|
||||||
|
"""
|
||||||
|
spectral_energy = np.log( data ** 2 )
|
||||||
|
error_thr = error_coef / np.median( spectral_energy )
|
||||||
|
|
||||||
|
average_window = np.convolve(
|
||||||
|
spectral_energy ,
|
||||||
|
np.ones( window_size ),
|
||||||
|
'same' ,
|
||||||
|
) / window_size
|
||||||
|
average_energy = np.mean( average_window )
|
||||||
|
peaks = np.where(
|
||||||
|
average_window / average_energy ** 2 > error_thr
|
||||||
|
)[0]
|
||||||
|
peaks = [
|
||||||
|
np.mean( peak ) for peak in consecutive( peaks )
|
||||||
|
]
|
||||||
|
successive = 0
|
||||||
|
|
||||||
|
while successive < min_successive and window_size < max_window_size:
|
||||||
|
average_window = np.convolve(
|
||||||
|
spectral_energy ,
|
||||||
|
np.ones( window_size ),
|
||||||
|
'same' ,
|
||||||
|
) / window_size
|
||||||
|
average_energy = np.mean( average_window )
|
||||||
|
new_peaks = np.where(
|
||||||
|
average_window / average_energy ** 2 > error_thr
|
||||||
|
)[0]
|
||||||
|
new_peaks = [
|
||||||
|
np.mean( peak ) for peak in consecutive( new_peaks )
|
||||||
|
]
|
||||||
|
|
||||||
|
if len( peaks ) == len( new_peaks ):
|
||||||
|
successive += 1
|
||||||
|
else:
|
||||||
|
successive = 0
|
||||||
|
peaks = new_peaks
|
||||||
|
window_size += 1
|
||||||
|
return peaks
|
||||||
|
|
Loading…
Reference in a new issue