Wednesday 27 September 2017

Moving Average Filter Verilog Code


Mittlerer Filter oder Durchschnittsfilter Kategorie. Digitale Signal - und Bildverarbeitung (DSP und DIP) Softwareentwicklung. Abstrakt. Der Artikel ist eine praktische Anleitung für Mittelfilter oder durchschnittliches Filterverständnis und Umsetzung. Artikel enthält Theorie, C-Quellcode, Programmieranleitung und Musteranwendung. 1. Einleitung zum Mittelfilter oder mittlerer Filter Mittelfilter. Oder durchschnittliche Filter ist Fensterfilter der linearen Klasse, die Signal (Bild) glättet. Der Filter arbeitet als Tiefpass. Die Grundidee hinter dem Filter ist für jedes Element des Signals (Bild) einen Durchschnitt über seine Nachbarschaft. Um zu verstehen, wie das in der Praxis gemacht wird, beginnen wir mit der Fensteridee. 2. Filterfenster oder Maske Lass uns uns vorstellen, du solltest einen Brief lesen und was du im Text von Loch in einer speziellen Schablone wie folgt sehen wirst. Also, das Ergebnis des Lesens ist Ton t. Ok, lass uns den Brief wieder lesen, aber mit der Hilfe einer anderen Schablone: ​​Jetzt ist das Ergebnis des Lesens t Klang 240. Lass uns den dritten Versuch machen: Jetzt liest man den Buchstaben t als Ton 952. Was passiert hier, um das zu sagen In mathematischer Sprache machst du eine Operation (Lesen) über Element (Buchstabe t). Und das Ergebnis (Ton) hängt von der Elementumgebung ab (Buchstaben neben t). Und diese Schablone, die hilft, Element Nachbarschaft zu holen, ist Fenster Ja, Fenster ist nur eine Schablone oder ein Muster, mit dem Sie die Element Nachbarschaft auswählen 0151 eine Reihe von Elementen um die gegebene 0151, um Ihnen zu helfen, Entscheidung zu treffen. Ein anderer Name für Filterfenster ist Maske 0151 Maske ist eine Schablone, die Elemente versteckt, auf die wir nicht achten. In unserem Beispiel das Element, das wir betreiben, auf der Oberseite des Fensters positioniert, in der Praxis aber seine übliche Position ist die Mitte des Fensters. Lassen Sie uns einige Fensterbeispiele sehen. In einer Dimension. Feige. 4. Fenster oder Maske der Größe 5 in 1D. In zwei Dimensionen. Feige. 5. Fenster oder Maske der Größe 3times3 in 2D. In drei Dimensionen. Denken Sie an Gebäude. Und jetzt mdash über Raum in diesem Gebäude. Der Raum ist wie ein 3D-Fenster, das einen Teilraum aus dem gesamten Raum des Gebäudes ausschneidet. Sie finden 3D-Fenster in Volumen (Voxel) Bildverarbeitung. 3. Verständnis mittlerer Filter Jetzt lassen Sie uns sehen, wie man ldquotake ein Durchschnitt über Elemente neighborhoodrdquo. Die Formel ist einfach 0151 Summe Elemente und teilen die Summe durch die Anzahl der Elemente. Zum Beispiel wollen wir einen Durchschnitt für den Fall berechnen, der in Abb. 7 Feige. 7. Einen Durchschnitt nehmen. Und das ist alles. Ja, wir haben nur 1D-Signal durch Mittelfilter gefiltert. Lass uns den Lebenslauf aufnehmen und schrittweise Anweisungen für die Verarbeitung durch Mittelfilter aufschreiben. Mittlerer Filter oder mittlerer Filteralgorithmus: Platzieren Sie ein Fenster über Element Nehmen Sie durchschnittlich 0151 Summe Elemente und teilen Sie die Summe durch die Anzahl der Elemente. Nun, wenn wir den Algorithmus haben, ist es Zeit, etwas Code mdash schreiben lassen wir uns auf Programmierung. 4. 1D mittlere Filterprogrammierung In diesem Abschnitt entwickeln wir 1D Mittelfilter mit Fenster der Größe 5. Lassen Sie uns 1D Signal der Länge N als Eingang haben. Der erste Schritt ist das Fenster platzieren 0151 wir tun das, indem wir den Index des führenden Elements ändern: Achten Sie darauf, dass wir mit dem dritten Element beginnen und mit den letzten zwei fertig sind. Das Problem ist, dass wir nicht mit dem ersten Element beginnen können, denn in diesem Fall ist der linke Teil des Filterfensters leer. Wir werden unten diskutieren, wie man dieses Problem lösen kann. Der zweite Schritt ist der Durchschnitt, ok: Nun, lassen Sie uns den Algorithmus als Funktion aufschreiben: Typ Element könnte definiert werden als: 5. Kanten behandeln Für alle Fensterfilter gibt es ein Problem. Das ist Randbehandlung. Wenn du das Fenster über das erste (letzte) Element platzierst, ist der linke (rechte) Teil des Fensters leer. Um die Lücke zu füllen, sollte das Signal verlängert werden. Für mittlere Filter gibt es gute Idee, Signal oder Bild symmetrisch zu erweitern, so: So, bevor das Signal an unsere mittlere Filterfunktion übergeben wird, sollte das Signal erweitert werden. Lassen Sie uns die Hülle aufschreiben, was alle Vorbereitungen macht. Wie Sie sehen können, berücksichtigt unser Code einige praktische Fragen. Zuerst prüfen wir unsere Eingangsparameter 0151 Signal sollte nicht NULL sein, und die Signallänge sollte positiv sein: Zweiter Schritt 0151 Wir überprüfen Fall N1. Dieser Fall ist ein besonderer, denn um die Erweiterung zu bauen, brauchen wir mindestens zwei Elemente. Für das Signal von 1 Elementlänge ist das Ergebnis das Signal selbst. Achten Sie auch darauf, dass unser mittlerer Filter an Ort und Stelle arbeitet, wenn das Ausgabeparameterergebnis NULL ist. Jetzt lassen Sie uns Speicher für Signalverlängerung zuordnen. Und überprüfen Sie die Speicherzuweisung. Implementierung der FIR-Filterung in C (Teil 3) Teil 2 zeigte ein Beispiel für einen FIR-Filter in C mit festen Punkt. Dieses Tutorial zur FIR-Filterung zeigt, wie man verschiedene FIR-Filter auf dieselben Eingangsdaten anwendet. Die Beispiele für diesen Teil sind auch fester Punkt. Das Beispiel ist eine einzelne C-Datei mit dem FIR-Filtercode oben und ein kleines Testprogramm unten. In einer tatsächlichen Implementierung würden Sie wahrscheinlich wollen, um den Code in mehrere Dateien zu teilen. Klicken Sie auf den folgenden Link für eine PDF-Version des Codebeispiels: Das Codebeispiel wird unten gezeigt: Es gibt einige Unterschiede zum Codebeispiel von Teil 2. Zuerst habe ich eine Funktion zum Speichern der Eingabeabtastwerte an das Eingabebeispiel-Array erstellt (FirStoreNewSamples). Diese Funktion wird einmal für jeden Block von eingegebenen Samples aufgerufen, die verarbeitet werden. Die Aufruffunktion verläuft in einem Zeiger auf die neuen Eingabebeispiele und die Anzahl der zu kopierenden neuen Samples. Die Funktion gibt die Adresse zurück, an der das FIR-Filter angewendet werden soll. Zweitens habe ich eine Funktion hinzugefügt, um die Samples nach der Bearbeitung eines Blocks von Samples (firMoveProcSamples) zu verschieben. Auch hier wird diese Funktion einmal pro Block von Samples aufgerufen, nicht einmal pro FIR-Filter angewendet. Die FIR-Filterfunktion (firFixed) hat die gleiche Argumentliste wie im Beispiel Teil 2, aber das Eingabeargument ist in diesem Fall etwas anders. Der eingegebene Eingangszeiger sollte die Adresse sein, die von der Funktion firStoreNewSamples zurückgegeben wird, anstatt einen Zeiger auf den Eingabe-Sample-Puffer. Das Testprogramm zeigt ein Beispiel, bei dem zwei verschiedene FIR-Filter auf die gleichen Ausgangsdaten angewendet werden. Die erste Eingabedatei wird geöffnet (für Eingabeproben) und zwei Ausgabedateien werden geöffnet (eine für jeden Filter). In der Probenverarbeitungsschleife wird ein Block von bis zu 80 Abtastwerten gelesen und in dem Arbeitsfeld für die Filter gespeichert. Als nächstes wird das 63 Tap-Bandpass-Filter angewendet, indem man firFixed aufruft und der Block der Ausgabe-Samples in die Datei geschrieben wird. Danach wird der 8-Hahn-Gleitwert-Filter angewendet, und die Ausgabe-Samples werden in eine andere Datei geschrieben. Schließlich wird der Sample-Puffer verschoben, um den nächsten Block von Eingangs-Samples vorzubereiten. Der Code, den ich gezeigt habe, funktioniert für viele Filter, die Sie implementieren möchten. Denken Sie daran, die maximale Filterabgrifflänge zu verfolgen und die Stichprobenblockgröße zu erfassen und die Definitionsanweisungen entsprechend zu ändern. Das schließt mein Tutorial auf grundlegenden FIR-Filtern ab. Gefällt mir: Hinterlasse eine Antwort Antwort abbrechen Danke soviel für die Buchung sehr nette Tutorial. Ich möchte Ihr Beispiel in den AVR Atmega16 Controller umsetzen. Ich habe die ADC-Funktion ReadADC (0x00), die den 10bits-Wert aus den ADC-Registern liest. Wo soll ich den ADC-Wert auf das obige Beispiel eingeben. Ich bin neu für Controller-Programm, ich werde dankbar für Ihre Guides und Vorschläge. Bitte führen Sie mir, wo ich die notwendigen Änderungen in der oben genannten Beispiel machen sollte. Abdul, danke für das Kompliment. Sie sollten Ihre ADC-Samples in ein Array lesen und dann die Adresse dieses Arrays an die firFixed-Funktion als zweites Argument übergeben. Im Hauptprogramm lese ich Samples aus einer Datei in das Array namens 8220input8221. In Ihrem Code sollten Sie ADC-Samples in ein ähnliches Array lesen. Im Beispiel habe ich 80 Samples zu einem Zeitpunkt verarbeitet, aber du solltest diesen Wert auf das ändern, was für dich geeignet ist. Die Verarbeitung einer Probe zu einem Zeitpunkt würde die Verzögerung durch den Filter minimieren, wäre aber die teuersten in Bezug auf Zyklen. Lieber Shawn, vielen Dank für Ihre Antwort. Ich habe den ADC-Wert als inputSAMPLESADCRead (0x00) gelesen und die Adresse der inputSAMPLES an die Funktion firStoreNewSamples als inp firStoreNewSamples (ampinputSAMPLES, size) übergeben. Ich bin über die Größe Integer verwirrt. Wie Größe ist die Länge, würden Sie bitte vorschlagen mir, was sollte der Wert der Größe sein. Da FirFixed-Funktion fünf Argumente hat, als firFixed (coeffs, inp, output, size, FILTERLEN) und inp wird von firStoreNewSamples gelesen. Mein Programm ist unten aufgeführt. Ich wäre Ihnen dankbar, danke. Include include include definieren ADCVREFTYPE 0x20 definieren PWM1DCReg OCR1A Maximale Anzahl von Eingängen, die in einem Funktionsaufruf behandelt werden können definieren MAXINPUTLEN 25 maximale Länge des Filters als gehandhabt werden definieren MAXFLTLEN 16 Puffer zum Halten aller Eingangsmuster definieren BUFFERLEN (MAXFLTLEN 8211 1 MAXINPUTLEN ) Array zum Halten von Eingangsabtastungen int16t insamp BUFFERLEN definieren SAMPLES 25 FIR init void firFixedInit (void) memset (insamp, 0, sizeof (insamp)) speichert neue Eingabeproben int16t firStoreNewSamples (int16t inp, int length) setzen die neuen Samples hoch Ende des Puffer-Memcpy (ampinsampMAXFLTLEN 8211 1, inp, length sizeof (int16t)) den Ort zurückgeben, an dem die Filterung zurückgegeben werden soll ampinsampMAXFLTLEN 8211 1 verschieben bearbeitete Samples void firMoveProcSamples (int length) verschieben Eingabestabellen zurück in der Zeit für das nächste Mal memmove (Ampinsamp0, ampinsamplength, (MAXFLTLEN 8211 1) sizeof (int16t)) die FIR-Filterfunktion void firFixed (int16t coeffs, int16t input, int16t output, int length, int filterLength) int32t acc accumulator für MACs int16t coeffp Zeiger auf Koeffizienten int16t inputp pointer (N 0 n lt Länge n) berechnen Ausgang n Koeffek Koeffizienten inputp ampinputn Last Rundung Konstante acc 1 ltlt 14 die Multiplikation für (k 0 k 0x3fffffff) gem 0x3fffffff else if (acc gt 15) Tiefpass-Cutoff-Frequenz 1000Hz, Abtastfrequenz 8915Hz. definieren FILTERLEN 16 int16t coeffs FILTERLEN 0xFF45, 0xFE83, 0xFDB2, 0xFFC9, 0x088E, 0x18A4, 0x2B29, 0x37AF, 0x37AF, 0x2B29, 0x18A4, 0x088E, 0xFFC9, 0xFDB2, 0xFE83, 0xFF45 PORTA 0x00 DDRA 0x00 PORTB 0x00 DDRB 0xff PORTC 0x00 DDRC 0xff PORTD 0x00 DDRD 0x20 PIND.5 Filterausgabe void InitADC (void) ADMUX ADCVREFTYPE amp 0xff Kanal auswählen 0 ADCSRA 0xC4 ADC-Verstärker aktivieren 1: st Dummy-Konvertierung int16t ReadADC (unsigned char channel) int16t ADCValue ADMUX-Kanal (ADCVREFTYPE amp 0xff) Kanalauswahl wählen (10) Verzögerung für die Stabilisierung der ADC-Eingangsspannung erforderlich ADCSRA 0x40 Start-Umwandlung ((ADCSRA-Verstärker 0x10)) Überprüfen Sie, ob die Konvertierung fertig ist ADCSRA 0x10 Clear Conversion bereit Flag, indem Sie das Bit ADCValue ADCL lesen 8 niedrige Bits zuerst (wichtig) ADCValue (int) ADCH ltlt 8 Lesen Sie 2 hohe Bits und multiplizieren Sie mit 256 void timer1 (void) TimerCounter 1 initialisierung Clock source: System Clock Taktwert: 8000.000 kHz Modus: 8 Bit Pulsbreite Modulation OC1A Ausgang: Non-Inv. OC1B Ausgang: Discon. PWM-Ausgangsfrequenz verdoppelt Rauschunterdrückung: Off91,09 Eingangsaufnahme am fallenden Rand TCCR1A 0x91 TCCR1B 0x09 TCNT1H 0x00 TCNT1L 0x00 ICR1H 0x00 ICR1L 0x00 OCR1AH ​​0x00 OCR1AL 0x00 OCR1BH 0x00 OCR1BL 0x00 Initialisieren alle Geräte cli () Alle löschen Interrupts InitPort () InitADC () - Drehzahl int16t inputSAMPLES int16t outputSAMPLES int16t inp initialisieren des Filters firFixedInit () verarbeitet alle Samples lesen Samples aus Dateigröße fread (Eingabe, sizeof (int16t), SAMPLES, infid) inputSAMPLES ReadADC (0x00) speichern neu Samples im Arbeitsfeld Inp firStoreNewSamples (ampinputSAMPLES, size) wendet jeden Filter an firFixed (coeffs, inp, output, size, FILTERLEN) verschieben bearbeitete Samples firMoveProcSamples (Größe) während (Größe 0) Externer Interrupt (s) Initialisierung INT0: Aus INT1: Aus MCUCR 0x00 MCUCSR 0x00 Timer (s) Counter (s) Interrupt (s) Initialisierung TIMSK 0x83 Analog Komparator Initialisierung Analog Komparator: Aus Analog Komparator Eingang Capture durch TimerCounter 1: Aus ACSR 0x80 SFIOR 0x00 sei () Globaler Interrupt aktivieren PWM1DCReg Ausgang Ausgang für Filter PORTB Tauschen Sie den Ausgangsport aus, um die Messung der ISR-Abtastrate zu ermöglichen. PORTC ADCH Überprüfen Sie das ADCH Status-Ergebnis Es gibt eine Reihe von Dingen, die mit Ihrem Code falsch sind. Es scheint, dass du nur eine Probe zu einem Zeitpunkt liest, also wäre es sinnvoll, die definieren SAMPLES auf 1 zu ändern (oder einfach nur eine Variable anstelle eines Arrays). Die 8220size8221 war ursprünglich die Anzahl der Samples, die von der Datei in meinem Beispiel gelesen wurden. Du solltest einfach 1 stattfinden, wenn du 1 Probe zu einer Zeit machst. Die do-Schleife sollte vollständig eliminiert werden, da Sie nicht mehr aus einer Datei lesen. Du solltest entweder den Timer unterbrechen oder einen ISR schreiben, damit du periodisch aus dem ADC lesen kannst (8000 oder 8915 Mal pro Sekunde, nach Kommentaren in deinem Code). Und Sie müssen wahrscheinlich jedes Mal, wenn Sie eine neue Ausgabe haben, auf Ihr Ausgaberegister schreiben. Ich würde auch empfehlen, mit einem einfacheren Programm, wo Sie einfach lesen Sie die ADC und dann Ausgabe, was Sie lesen. Sobald Sie das funktionieren, setzen Sie den Filtercode ein. Ich hoffe das hilft. Lieber Shawn, vielen Dank für Ihren Führer und Vorschlag. Ich bin neu bei Controller-Programmierung Ich muss zuerst ein einfacheres Beispiel beginnen. Ich bin sehr interessiert, um die Programmierung der Controller zu erlernen, wenn möglich bitte schlagen Sie mir vor, wie sollte ich anfangen Ich habe Anfang Kenntnisse der AVR Architektur ATmega Serie 8-Bit-Mikrocontroller. Und ich benutze AVR Studio für die Programmierung der Controller. Bitte führen Sie mir, wie soll ich an der Bedienung arbeiten. Abdul Mein Rat wäre, mit einigen Beispielprogrammen zu beginnen, die mit Ihrem Entwicklungsinstallationssatz (oder Werkzeuge oder anderswo) kommen und sicherstellen, dass Sie sie ordnungsgemäß arbeiten können. Versuchen Sie dann, diese Programme zu modifizieren. Sobald Sie sich langweilen, versuchen Sie es, Ihr eigenes Programm zu machen. Beginnen Sie mit etwas einfachem wie das Einrichten des ADC und das Lesen von ihm. Dann füge noch mehr Funktionalität einen Schritt zu einer Zeit hinzu. Fügen Sie einen Code hinzu, um den Timer einzurichten und zu überprüfen, ob er funktioniert. Code hinzufügen, um den Timer-Interrupt abzurufen. Dann versuchen Sie, eine Interrupt-Dienstroutine (ISR) zu codieren. Dann füge Code zum ISR hinzu, um den ADC zu lesen. Der Trick ist, eine kleine Menge an Code zu einem Zeitpunkt zu schreiben und zu überprüfen, dass es jeden Schritt des Weges funktioniert. Das ist in der Regel einfacher als das Schreiben einer ganzen Reihe von Code zu einer Zeit, und dann versuchen, es zu debuggen alle auf einmal (vor allem, wenn Sie etwas tun, was neu für Sie ist). Lieber Shawn, vielen Dank für deinen geschätzten Vorschlag. Und ich freue mich auf deine Hilfe, wenn ich in der Zukunft ein Problem in der Programmierung habe. Danke nochmal. Shawn, ich versuche, einen grafischen Equalizer mit FIR Filtern zu machen und das war schon sehr hilfreich. Aber ich habe mich gefragt, ob du irgendwelche Informationen darüber hast, wie man die Verstärkung an die Ausgabe jeder Band Hi Joseph anwendet. Für einen grafischen Equalizer möchten Sie eine Verstärkung an jedes Band anwenden, indem Sie das Endergebnis der Filterung um eine Zahl zwischen 0 und 1 multiplizieren. So sollte jeder Filter eine maximale Verstärkung von 1 (bei der Mittenfrequenz) haben und dann sollten Sie Haben Sie eine Reihe von Gewinnen für jede Band. Es empfiehlt sich, die Gewinne in dB (deciBels) auszudrücken, wenn man eine grafische Darstellung oder Kontrolle (wie ein Schieberegler) macht. Die Verstärkung in dB beträgt 20log10 (g) wobei g der Multiplikationswert (zwischen knapp über 0 und 1) ist. Dann entspricht -6 dB einer Verstärkung von etwa 0,5. Das ist 20log10 (0,5) ist ungefähr -6. Die umgekehrte Formel ist g pow10 (G20) wobei G die Verstärkung in dB ist. Wenn also die Verstärkung -24 dB beträgt, ist der Multiplikatorwert g pow10 (-2420) 0,063. Der Grund für die Verwendung von Dezibel ist, weil die Wahrnehmung der Lautheit einer logarithmischen Skala folgt. Ich hoffe das hilft dir. Hallo Shawn, Großes Tutorial Dein Blog hat viel mehr praktische Sachen als die meisten Signalverarbeitungsbücher. Ich habe ein paar Follow-up Fragen auf Ihrem Tutorial und es wäre toll, wenn Sie mich in die richtige Richtung zeigen könnte. Ich versuche zu implementieren (in hardwareverilog) ein 32-Bit-Mac mit 2 16-Bit-Eingängen. Wenn ich das 32-Bit-Ergebnis in einem 16-Bit-Register zurücksetzen möchte, verstehe ich, dass für feste Punkt signierte signierte Multiplikation wir nur (ohne Rundung) Extrakt Bit 30 bis 15 (und nicht 31 wegen des Doppelzeichens) brauchen. 1) Bin ein bisschen verwirrt, wenn ich eine andere Hardware für signierte Fraktional multiplizieren und reine Integer multiplizieren muss. Sagen, ich verwende zwei separate 16-Bit-Register, um das 32-Bit-Ergebnis der Multiplikation zu speichern. Denken Sie nur, dass Sie einen bedingten Shifter zwischen dem 32-Bit-Multiplikator-Ergebnis (unmittelbar nach der Multplier-Hardware) verwenden und kurz vor dem Speichern in 2 getrennten Registern ausreichen würde. Der bedingte Shifter, der von 1 für Bruchteil multipliziert und um 0 verschoben wird, Für den Kommentar. Ihre zweite Frage scheint verloren zu sein. Um Ihre erste Frage zu beantworten, sollten Sie in der Lage sein, den gleichen Multiplikator für beide Integer - und Fixpunkt-Multiplikation zu verwenden, genau wie Sie beschrieben haben. Für den Fixpunkt-Multiplikator gibt es einen speziellen Fall, dem man sich bewusst sein muss, der -1 um -1 multipliziert (wobei -1 0x8000 im Bruch Q.15 ist). Wenn Sie 0x8000 um 0x8000 multiplizieren, wird das Ergebnis 0x40000000 sein. Wenn du das verlässt, lassst du am Ende mit 0x80000000, so dass das Endergebnis ist, dass -1 mal -1 gleich -1 ist. Einige Möglichkeiten, dies zu behandeln sind: 1) Niemals multiplizieren -1 um -1 2) Sättigen Sie das Ergebnis auf 0x7FFF, FFFF 3) Heben Sie ein Überlauf-Flag an und behandeln Sie den Fehler irgendwie. Ich hoffe, dass hilft. Mean Filter Gemeinsame Namen: Mittlere Filterung, Glättung, Mittelwertbildung, Box Filterung Kurzbeschreibung Mittlere Filterung ist eine einfache, intuitive und einfach zu implementierende Methode der Glättung von Bildern, dh Verringerung der Menge der Intensität Variation zwischen einem Pixel und dem nächsten . Es wird oft verwendet, um Lärm in Bildern zu reduzieren. Wie es funktioniert Die Idee der mittleren Filterung ist einfach, jeden Pixelwert in einem Bild mit dem mittleren (durchschnittlichen) Wert seiner Nachbarn zu ersetzen, einschließlich selbst. Dies hat die Wirkung, Pixelwerte zu eliminieren, die ihrer Umgebung nicht repräsentativ sind. Die mittlere Filterung wird üblicherweise als Faltungsfilter betrachtet. Wie andere Windungen basiert es um einen Kernel. Die die Form und Größe der Nachbarschaft darstellt, die bei der Berechnung des Mittelwerts abgetastet werden soll. Oft wird ein 32153 Quadratkern verwendet, wie in Fig. 1 gezeigt, obwohl grßere Kerne (z. B. 52155 Quadrate) für eine stärkere Glättung verwendet werden können. (Beachten Sie, dass ein kleiner Kern mehr als einmal angewendet werden kann, um eine ähnliche, aber nicht identische Wirkung wie ein einzelner Durchgang mit einem großen Kern zu erzeugen.) Abbildung 1 32153 Mittelwertbildung Kernel oft in der mittleren Filterung verwendet Berechnen der direkten Faltung eines Bildes mit Dieser Kernel führt den mittleren Filterprozess durch. Gebrauchsanweisung Die mittlere Filterung wird am häufigsten als einfache Methode zur Reduzierung von Rauschen in einem Bild verwendet. Wir veranschaulichen den Filter unter Verwendung des Originals, das durch Gauss'sches Rauschen mit einem Mittelwert von null verfälscht wird, und eine Standardabweichung () von 8 zeigt den Effekt des Anwendens eines 32153 mittleren Filters. Beachten Sie, dass das Rauschen weniger offensichtlich ist, aber das Bild wurde weich gemacht. Wenn wir die Größe des mittleren Filters auf 52155 erhöhen, erhalten wir ein Bild mit weniger Rauschen und weniger hochfrequenten Details, wie in demselben Bild gezeigt, das durch Gaußschen Rauschen (mit einem Mittelwert von null und einem von 13) stärker verfälscht wurde In ist das Ergebnis einer mittleren Filterung mit einem 32153-Kernel. Eine noch anspruchsvollere Aufgabe ist gegeben durch zeigt die Wirkung der Glättung der lärmenden Bild mit einem 32153 Mittelfilter. Da die Schussrauschpixelwerte sich oft sehr von den Umgebungswerten unterscheiden, neigen sie dazu, den durch den Mittelfilter berechneten Pixeldurchschnitt signifikant zu verzerren. Mit einem 52155-Filter stattdessen gibt dieses Ergebnis keine signifikante Verbesserung der Rauschunterdrückung und darüber hinaus ist das Bild jetzt sehr verschwommen. Diese Beispiele veranschaulichen die beiden Hauptprobleme mit der mittleren Filterung, die sind: Ein einzelnes Pixel mit einem sehr nicht repräsentativen Wert kann den Mittelwert aller Pixel in seiner Nachbarschaft signifikant beeinflussen. Wenn die Filterumgebung eine Kante überspannt, wird der Filter neue Werte für Pixel auf der Kante interpolieren und so wird diese Kante verschwimmen. Dies kann ein Problem sein, wenn im Ausgang scharfe Kanten erforderlich sind. Beide Probleme werden durch den Medianfilter angegangen. Das ist oft ein besserer Filter für die Reduzierung von Lärm als der mittlere Filter, aber es dauert länger zu berechnen. Im allgemeinen wirkt der mittlere Filter als Tiefpassfrequenzfilter und reduziert daher die im Bild vorhandenen räumlichen Intensitätsderivate. Wir haben diesen Effekt bereits als Erweichung der Gesichtszüge im obigen Beispiel gesehen. Betrachten wir nun das Bild, das eine Szene mit einem breiteren Spektrum unterschiedlicher Raumfrequenzen darstellt. Nach dem Glätten einmal mit einem 32153 mittleren Filter erhalten wir, dass die geringe Raumfrequenzinformation im Hintergrund nicht wesentlich durch Filterung beeinträchtigt wurde, aber die (einmal knackigen) Kanten des Vordergrundobjekts wurden spürbar geglättet. Nach dem Filtern mit einem 72157-Filter erhalten wir eine noch dramatischere Darstellung dieses Phänomens, um dieses Ergebnis zu vergleichen, das durch das Durchführen eines 32153-Filters über das Originalbild dreimal in den üblichen Varianten erhalten wird. Variationen des mittleren Glättungsfilters, die hier diskutiert wurden, umfassen die Threshold-Mittelung, wobei Wird die Glättung unter der Bedingung angewendet, daß der mittlere Pixelwert nur dann geändert wird, wenn die Differenz zwischen seinem ursprünglichen Wert und dem Durchschnittswert größer als ein voreingestellter Schwellenwert ist. Dies hat die Wirkung, dass Lärm mit einem weniger dramatischen Verlust in Bild Detail geglättet wird. Andere Faltungsfilter, die den Mittelwert einer Nachbarschaft nicht berechnen, werden auch oft zum Glätten verwendet. Einer der häufigsten ist der Gaußsche Glättungsfilter. Interaktives Experimentieren Sie können mit diesem Operator interaktiv experimentieren, indem Sie hier klicken. Der mittlere Filter wird mit einer Faltung berechnet. Können Sie an irgendwelche Möglichkeiten denken, in denen die speziellen Eigenschaften des mittleren Filterkerns verwendet werden können, um die Faltung zu beschleunigen Was ist die rechnerische Komplexität dieser schnelleren Faltung Verwenden Sie einen Kantendetektor auf dem Bild und notieren Sie die Stärke des Ausgangs. Dann einen 32153 mittleren Filter auf das Originalbild auftragen und den Kantendetektor wieder ausführen. Kommentar zum Unterschied. Was passiert, wenn ein 52155 oder ein 72157-Filter verwendet wird. Das Anwenden eines durchschnittlichen Filters von 32153 zweimal ergibt nicht das gleiche Ergebnis wie das Einlegen eines 52155-Mittelfilters. Es kann jedoch ein 52155-Faltungskern aufgebaut werden, der äquivalent ist. Wie sieht dieser Kern aus? Erstellen Sie einen 72157 Faltungskern, der eine gleichwertige Wirkung auf drei Pässe mit einem 32153 Mittelfilter hat. Wie denkst du, der mittlere Filter würde mit dem Gaußschen Rauschen fertig werden, das nicht symmetrisch war. Versuchen Sie einige Beispiele. Referenzen R. Boyle und R. Thomas Computer Vision: Ein erster Kurs. Blackwell Scientific Publications, 1988, S. 32 - 34. E. Davies Machine Vision: Theorie, Algorithmen und Praktiken. Akademische Presse, 1990, Kap. 3. D. Vernon Machine Vision. Prentice-Hall, 1991, Kap. 4. Lokale Informationen Besondere Informationen zu diesem Operator finden Sie hier. Weitere allgemeine Hinweise zur örtlichen HIPR-Installation finden Sie im Einführungsbereich "Lokale Informationen".

No comments:

Post a Comment