Domanda

Sto lavorando su un pezzo di software che ha bisogno di attuare il wiggliness di un insieme di dati. Ecco un esempio dell'ingresso avrei ricevuto, fuso con il terreno leggerezza di ciascuna striscia pixel verticale: alt text

E 'facile vedere che il margine sinistro è davvero Deformazioni in movimento (cioè ha una tonnellata di minimi / massimi), e voglio generare una serie di punti critici dell'immagine. Ho applicato una funzione smoothing gaussiano ai dati ~ 10 volte, ma sembra essere abbastanza Wiggly per cominciare.

Tutte le idee?

Ecco il mio codice originale, ma non produce risultati molto bello (per la wiggliness):

def local_maximum(list, center, delta):
  maximum = [0, 0]

  for i in range(delta):
    if list[center + i] > maximum[1]: maximum = [center + i, list[center + i]]
    if list[center - i] > maximum[1]: maximum = [center - i, list[center - i]]

  return maximum

def count_maxima(list, start, end, delta, threshold = 10):
      count = 0

  for i in range(start + delta, end - delta):
    if abs(list[i] - local_maximum(list, i, delta)[1]) < threshold: count += 1

  return count

def wiggliness(list, start, end, delta, threshold = 10):
  return float(abs(start - end) * delta) / float(count_maxima(list, start, end, delta, threshold))
È stato utile?

Soluzione

Date un'occhiata al passa-basso / passa-alto / notch / filtri passa-banda, trasformate di Fourier, o piccole onde. L'idea di base è che non c'è un sacco di modi diversi per capire il contenuto in frequenza di un segnale quantizzato su diversi periodi di tempo.

Se siamo in grado di capire cosa è wiggliness, che avrebbe aiutato. Direi che il margine più a sinistra è sinuose b / c ha più contenuto ad alta frequenza, che si potrebbe immaginare utilizzando una trasformata di Fourier.

Se si prende un filtro passa-alto di quel segnale rosso, si otterrà solo il contenuto ad alta frequenza, e quindi è in grado di misurare le ampiezze e fare le soglie per determinare wiggliness. Ma credo che wiggliness solo bisogno di più formalismo dietro di esso.

Altri suggerimenti

Per cose come queste, NumPy rende le cose molto più semplice, in quanto fornisce funzioni utili per manipolare dati vettoriali, ad esempio aggiungendo uno scalare per ciascun elemento, il calcolo del valore medio etc.

Per esempio, si potrebbe provare con tasso zero crossing del l'originale tecnica d'wiggliness1 o la prima differenza-wiggliness2 (a seconda di ciò wiggliness si suppone che sia, esattamente, se le tendenze globali devono essere ignorati, probabilmente si dovrebbe utilizzare i dati differenza). Per x si dovrebbe prendere la fetta o una finestra di interesse dai dati originali, ottenendo una sorta di misura di wiggliness locale. Se si utilizzano i dati originali, dopo aver rimosso il bias si potrebbe anche voler impostare tutti i valori inferiori a una certa soglia di 0 a ignorare wiggles bassa ampiezza.

import numpy as np

def wiggliness1(x):
    #remove bias:
    x=x-np.average(x)
    #calculate zero crossing rate:
    np.sum(np.abs(np.sign(np.diff(x))))


def wiggliness(x):
    #calculate zero crossing rate of the first difference:
    return np.sum(np.abs(np.sign(np.diff(np.sign(np.diff(x))))))
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top