Erstellen von benutzerdefinierten Filtern in Scipy zur Rauschreduzierung in der Signal- und Bildverarbeitung

Filterung ist eine gängige Technik bei der Signal- und Bildverarbeitung, um Rauschen zu reduzieren und die Datenqualität zu verbessern. SciPy bietet Werkzeuge zur Erstellung benutzerdefinierter Filter, die auf bestimmte Rauscheigenschaften und Verarbeitungsanforderungen zugeschnitten sind. Dieser Artikel erklärt, wie benutzerdefinierte Filter mit SciPy für Aufgaben zur Rauschreduzierung erstellt und angewendet werden.

Lärm und Filterung verstehen

Die Störstrahlung kann von verschiedenen Quellen ausgehen, wie etwa von Sensorfehlern oder Umwelteinflüssen. Die Filterung soll diese unerwünschten Informationen unterdrücken und gleichzeitig die wesentlichen Merkmale der Daten bewahren. Verschiedene Filtertypen, wie Tiefpass, Hochpass und Bandpass, zielen auf bestimmte Frequenzkomponenten ab.

Erstellen von benutzerdefinierten Filtern in SciPy

Zum Erstellen eines benutzerdefinierten Filters definieren Sie normalerweise einen Filterkernel oder eine Übertragungsfunktion, die Ihrem Rauschprofil entspricht. Das Signalverarbeitungsmodul von SciPy bietet Funktionen wie zum Anwenden von Filtern und zum Entwerfen von FIR-Filtern (Finite Impulse Response Filter).

Anwenden von Filtern auf Daten

Sobald der Filter entworfen ist, kann er auf Signale oder Bilder angewendet werden. Bei Signalen wird Convolution verwendet, um die Daten zu filtern. Bei Bildern wendet 2D-Convolution den Filterkernel auf das Bild an. SciPy-Funktionen erleichtern diese Operationen effizient.

Beispiel: Entwerfen eines Tiefpassfilters

Nachfolgend finden Sie ein Beispiel für die Schaffung eines einfachen Tiefpassfilters zur Reduzierung von hochfrequentem Rauschen in einem Signal.

Codebeispiel:

„„python import numpy as np from scipy.signal import firwin, lfilter import matplotlib.pyplot as plt # Generate a Noisy signal fs = 500 # Sampling frequency t = np.linspace(0, 1, fs, endpoint=False) signal clean = np.sin(2 * np.pi * 5 *t) noise = 0.5 * np.random.randn(fs) signal noisy = signal clean + noise # Design a low-pass FIR filter numtaps = 51 cutoff = 10 # Cutoff frequency in Hz fir coeff = firwin(numtaps, cutoff, fs=fs) # Apply the filter filter filter filter filter=(10, 6) plt.plot(t, signal noisy, label='Noisy Signal') plt.plot(t, filter noisy, label='Noisy Signal') plt.plot(t, filter noisy, label='Noisy Signal'