Add retrieve_peaks() function and fix consecutive()

This commit is contained in:
linarphy 2023-05-22 16:01:33 +02:00
parent 0d79633290
commit 8db571f34c
No known key found for this signature in database
GPG key ID: 3D4AAAC3AD16E79C

View file

@ -192,7 +192,7 @@ def last_consecutive( list_ ):
raise ValueError( 'list_ must be a list, ' + type( list_ ) + ' given' )
first , lower , greater = list_[0] , 0 , len( list_ )
i = lower + ( greater - lower ) // 2
while greater - lower != 1:
while greater - lower != 0:
i = lower + ( greater - lower ) // 2
if list_[ i ] - first != i: # outside of the consecutive list
greater = i
@ -212,3 +212,45 @@ def rotate( image , angle ):
cX , cY = ( width // 2 , height // 2 )
matrix = cv2.getRotationMatrix2D( ( cX , cY ) , angle , 1 )
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