Thursday 21 December 2017

Przenoszenie średnia filtr verilog kod


Średni filtr lub filtr średni Kategoria. Cyfrowe przetwarzanie sygnału i przetwarzania obrazu (DSP i DIP). Abstrakcyjny. Artykuł jest praktycznym przewodnikiem dla średniego filtra lub średniego zrozumienia i implementacji filtra. Artykuł zawiera teorię, kod źródłowy C, instrukcje programowania i przykładową aplikację. 1. Wprowadzenie do filtra średniego lub średni filtr Średni filtr. lub średni filtr to okienkowany filtr klasy liniowej, który wygładza sygnał (obraz). Filtr działa jako dolnoprzepustowy. Podstawową zasadą kryjącą się za filtrem jest to, że dowolny element sygnału (obrazu) przyjmuje średnią w swoim sąsiedztwie. Aby zrozumieć, jak to się robi w praktyce, zacznijmy od pomysłu okna. 2. Okno filtru lub maska ​​Wyobraźmy sobie, że powinieneś przeczytać literę i to, co widzisz w tekście ograniczonym przez otwór w specjalnym szablonie w ten sposób. Zatem wynikiem czytania jest dźwięk t. OK, odczytajmy list ponownie, ale przy pomocy innego szablonu: Teraz wynikiem czytania t jest dźwięk 240. Zróbmy trzecią próbę: Teraz czytasz literę t jako dźwięk 952. Co się tutaj dzieje Aby to powiedzieć w języku matematycznym wykonujesz operację (czytanie) nad elementem (litera t). A wynik (dźwięk) zależy od sąsiedztwa elementu (litery obok t). A ten szablon, który pomaga podnieść element sąsiedztwa, to okno Tak, okno to tylko szablon lub wzór, za pomocą którego wybierasz element sąsiedztwa 0151 zestaw elementów wokół danego 0151, aby pomóc Ci podjąć decyzję. Inną nazwą okna filtra jest maska ​​0151 to szablon, który ukrywa elementy, na które nie zwracamy uwagi. W naszym przykładzie element, na którym operujemy, znajduje się po lewej stronie okna, w praktyce jednak jego zwykła pozycja jest środkiem okna. Zobaczmy kilka przykładów okien. W jednym wymiarze. Rys. 4. Okno lub maska ​​wielkości 5 w 1D. W dwóch wymiarach. Ryc. 5. Okno lub maska ​​wielkości 3 x 3 w 2D. W trzech wymiarach. Pomyśl o budowaniu. A teraz mdash o pokoju w tym budynku. Pokój jest jak okno 3D, które wycina pewną podprzestrzeń z całej przestrzeni budynku. Możesz znaleźć przetwarzanie obrazu 3D w objętości okna (voxel). 3. Zrozumienie średniego filtru Zobaczmy teraz, jak podzielić średnią na elementy sąsiedztwa. Formuła to proste sumowanie elementów 0151 i podzielenie sumy przez liczbę elementów. Na przykład obliczmy średnią dla przypadku, przedstawioną na rys. 7. Ryc. 7. Średnia. I to wszystko. Tak, po prostu przefiltrowaliśmy sygnał 1D przez filtr średni. Spróbujmy wznowić i zapisz instrukcje krok po kroku dotyczące przetwarzania przez filtr średni. Średni filtr lub algorytm filtru średniego: Umieść okno nad elementem Zrób średnie sumowanie elementów 0151 i podziel sumę przez liczbę elementów. Teraz, gdy mamy już algorytm, nadszedł czas, aby napisać kod mdash, przejdźmy do programowania. 4. 1D programowanie filtrów W tym rozdziale rozwijamy filtr 1D z oknem o rozmiarze 5. Niech jako sygnał wejściowy mamy sygnał 1D o długości N. Pierwszym krokiem jest umieszczenie okna 0151, które robimy poprzez zmianę indeksu elementu wiodącego: Zwróć uwagę, że zaczynamy od trzeciego elementu i kończymy na ostatnim, ale dwóch. Problem polega na tym, że nie możemy zacząć od pierwszego elementu, ponieważ w tym przypadku lewa część okna filtra jest pusta. Omówimy poniżej, jak rozwiązać ten problem. Drugim krokiem jest uzyskanie średniej, ok: Zapiszmy teraz algorytm jako funkcję: Element typu można zdefiniować jako: 5. Traktowanie krawędzi Dla wszystkich filtrów okien istnieje pewien problem. To jest obróbka krawędzi. Jeśli umieścisz okno na pierwszym (ostatnim) elemencie, lewa (prawa) część okna będzie pusta. Aby wypełnić lukę, sygnał należy wydłużyć. W przypadku filtra średniego dobrym pomysłem jest symetryczne rozciągnięcie sygnału lub obrazu, w ten sposób: przed przekazaniem sygnału do naszej funkcji filtra średniego sygnał powinien zostać przedłużony. Zapiszmy opakowanie, które sprawia, że ​​wszystkie przygotowania. Jak widać, nasz kod uwzględnia pewne praktyczne problemy. Przede wszystkim sprawdzamy nasze parametry wejściowe Sygnał 0151 nie powinien mieć wartości NULL, a długość sygnału powinna być dodatnia: Krok drugi 0151 sprawdzamy przypadek N1. Ta sprawa jest wyjątkowa, ponieważ do rozbudowy potrzebujemy co najmniej dwóch elementów. Dla sygnału o długości 1 elementu wynikiem jest sam sygnał. Jak również należy zwrócić uwagę, nasz filtr średniej działa na miejscu, jeśli wynik parametru wynikowego jest NULL. Teraz przydzielmy pamięć do rozszerzenia sygnału. I sprawdź alokację pamięci. Implementacja filtrowania FIR w C (Część 3) Część 2 pokazała przykład filtra FIR w C używając stałej kropki. Ten samouczek dotyczący filtrowania FIR pokazuje, jak zastosować kilka różnych filtrów FIR do tych samych danych wejściowych. Przykłady dla tej części są również w stałym punkcie. Przykładem jest pojedynczy plik C z kodem filtra FIR u góry i małym programem testowym na dole. W rzeczywistej implementacji prawdopodobnie chcesz podzielić kod na kilka plików. Kliknij poniższy link dla wersji PDF przykładu kodu: Przykład kodu pokazano poniżej: Istnieje kilka różnic w stosunku do przykładu kodu części 2. Najpierw utworzyłem funkcję do przechowywania próbek wejściowych do wejściowej tablicy próbek (firStoreNewSamples). Ta funkcja jest wywoływana raz dla każdego bloku próbek wejściowych, które są przetwarzane. Funkcja wywołująca przechodzi w wskaźnik do nowych próbek wejściowych i liczba nowych próbek do skopiowania. Funkcja zwraca adres, pod którym ma zostać zastosowany filtr FIR. Po drugie, dodałem funkcję przenoszenia próbek po przetworzeniu bloku próbek (firMoveProcSamples). Ponownie, ta funkcja jest wywoływana raz na blok próbek, a nie raz na jeden filtr FIR. Funkcja filtrowania FIR (firFixed) ma tę samą listę argumentów, co w przykładzie 2, ale argument wejściowy jest w tym przypadku nieco inny. Wskazywanym wskaźnikiem wejściowym powinien być adres zwrócony z funkcji firStoreNewSamples, a nie wskaźnik do wejściowego bufora próbek. Program testowy pokazuje przykład, w którym dwa różne filtry FIR są stosowane do tych samych danych wyjściowych. Najpierw otwierany jest jeden plik wejściowy (dla próbek wejściowych) i otwierane są dwa pliki wyjściowe (po jednym dla każdego filtra). W pętli przetwarzania próbki blok do 80 próbek jest odczytywany i zapisywany w roboczej tablicy filtrów. Następnie zastosowano filtr pasmowo-przepustowy 63 przez wywołanie firFixed, a blok próbek wyjściowych zapisuje się do pliku. Następnie zastosowany jest filtr z ośmioma ruchomymi średnimi, a próbki wyjściowe są zapisywane do innego pliku. Na koniec bufor próbki przesuwa się w celu przygotowania do następnego bloku próbek wejściowych. Kod, który pokazałem, działa dla wielu filtrów, które chcesz zaimplementować. Pamiętaj, aby śledzić maksymalną długość przesuwania filtra i wprowadzić rozmiar bloku próbki oraz odpowiednio zmienić instrukcje definiowania. To kończy mój tutorial na temat podstawowych filtrów FIR. W ten sposób: Pozostaw odpowiedź Anuluj odpowiedź Dziękuję bardzo za opublikowanie bardzo miłego samouczka. Chciałbym zaimplementować twój przykład w kontrolerze AVR Atmega16. Mam funkcję ADC ReadADC (0x00), która odczytuje wartość 10 bitów z rejestrów ADC. gdzie powinienem wprowadzić wartość ADC do powyższego przykładu. Jestem nowy w programie kontrolerów, będę wdzięczny za twoje wskazówki i sugestie. Proszę wskazać mi, gdzie należy wprowadzić niezbędne zmiany w powyższym przykładzie. Abdul, dzięki za komplement. Powinieneś przeczytać próbki ADC w tablicy, a następnie przekazać adres tej tablicy do funkcji firFixed jako drugi argument. W głównym programie odczytałem próbki z pliku do tablicy o nazwie 8220input8221. W swoim kodzie powinieneś czytać próbki ADC w podobnej tablicy. W przykładzie przetworzyłem 80 próbek na raz, ale powinieneś zmienić tę wartość na odpowiednią dla ciebie aplikację. Przetwarzanie jednej próbki na raz zminimalizowałoby opóźnienie przez filtr, ale byłoby najbardziej kosztowne pod względem cykli. Drogi Shawnie, dziękuję za odpowiedź. odczytałem wartość ADC jako inputSAMPLESADCRead (0x00) i przekazałem adres inputSAMPLES do funkcji firStoreNewSamples jako inp firStoreNewSamples (ampinputSAMPLES, size). jestem zdezorientowany co do wielkości całkowitej. ponieważ rozmiar jest długością, czy mógłbyś zasugerować mi, jaka powinna być wartość rozmiaru. ponieważ funkcja FirFixed ma pięć argumentów jako firFixed (coeffs, inp, output, size, FILTERLEN) i inp jest odczytywane z firStoreNewSamples. Mój program jest wymieniony poniżej. Byłbym wdzięczny za wszystko, dziękuję. include include define ADCVREFTYPE 0x20 define PWM1DCReg OCR1A maksymalna liczba wejść, które można obsłużyć w jednym wywołaniu funkcji zdefiniować MAXINPUTLEN 25 maksymalna długość filtru niż można obsłużyć zdefiniować bufor MAXFLTLEN 16 do przechowywania wszystkich próbek wejściowych określić BUFFERLEN (MAXFLTLEN 8211 1 MAXINPUTLEN ) tablica do przechowywania próbek wejściowych int16t insamp BUFFERLEN zdefiniuj próbki PRÓG 25 FIR init void firFixedInit (void) memset (insamp, 0, sizeof (insamp)) przechowuje nowe próbki wejściowe int16t firStoreNewSamples (int16t inp, int length) umieszcza nowe próbki na wysokim poziomie koniec memcpy buforowej (ampinsampMAXFLTLEN 8211 1, inp, długość sizeof (int16t)) zwracają miejsce, w którym należy zastosować filtrowanie ampinsampMA ReturnMAXFLTLEN 8211 1 przenieść przetworzone próbki void firMoveProcSamples (int length) przesunąć próbki wejściowe z powrotem w czasie do następnego razu memmove (ampinsamp0, ampinsamplength, (MAXFLTLEN 8211 1) sizeof (int16t)) funkcja filtra FI void firFixed (int16t coeffs, int16t wejście, i wyjście nt16t, długość int, int filterLength) Akumulator int32t acc dla MACs int16t wskaźnik coeffp do współczynników int16t wskaźnik wejściowy do próbek wejściowych int n int k zastosować filtr do każdej próbki wejściowej dla (n 0 n l length n) obliczyć cewki coeffff wyników n Stała zaokrąglania obciążenia dla wejścia amppspawanego acc 1 ltlt 14 Wykonaj wielokrotne kumulowanie dla (k 0 k 0x3fffffff) acc 0x3fffffff else, jeśli (acc 15) Częstotliwość graniczna dolnoprzepustowa 1000Hz, częstotliwość próbkowania 8915Hz. define 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 Filtr Wyjście void InitADC (void) ADMUX ADCVREFTYPE amp 0xff Wybierz kanał 0 ADCSRA 0xC4 Włącz ADC amp start 1: st manekin konwersja int16t ReadADC (unsigned char channel) int16t ADCWartość kanał ADMUX (ADCVREFTYPE amp 0xff) Wybierz kanał delayus (10) Opóźnienie potrzebne do stabilizacji napięcia wejściowego ADC ADCSRA 0x40 Rozpocznij konwersję podczas ((ADCSRA amp 0x10)) Sprawdź, czy konwersja jest gotowa ADCSRA 0x10 Wyczyść flagę gotowości Konwersji, ustawiając bit ADCValue ADCL Odczytaj 8 małych bitów jako pierwsze (ważne) ADCValue (int) ADCH ltlt 8 Odczytaj 2 wysokie bity i mnożenie z 256 void timer1 (void) Inicjalizacja TimerCounter 1 Źródło zegara: System Clock Clock Wartość zegara: 8000.000 kHz Tryb: 8-bitowa modulacja szerokości impulsu Wyjście OC1A: Non-Inv. Wyjście OC1B: Discon. Częstotliwość wyjściowa PWM jest podwojona Redukcja szumów: Off91,09 Przechwytywanie danych wejściowych przy spadającej krawędzi TCCR1A 0x91 TCCR1B 0x09 TCNT1H 0x00 TCNT1L 0x00 ICR1H 0x00 ICR1L 0x00 OCR1AH ​​0x00 OCR1AL 0x00 OCR1BH 0x00 OCR1BL 0x00 Zainicjować wszystkie urządzenia cli () Wyczyść wszystko Przerwania InitPort () InitADC () timer1 () int rozmiar int16t inputSAMPLES int16t outputSAMPLES int16t inp zainicjować filtr firFixedInit () wszystkie próbki odczytują próbki z pliku FDA (input, sizeof (int16t), SAMPLES, infid) inputSAMPLES ReadADC (0x00) store new Próbki w działającej macierze inSt. jodStoreNewSamples (ampinputSAMPLES, size) stosują każdy filtr firFixed (coeffs, inp, output, size, FILTERLEN) przenoszą przetworzone próbki firMoveProcSamples (size) while (size 0) Inicjowanie zewnętrznych przerwań INT0: Off INT1: Off MCUCR 0x00 MCUCSR 0x00 Licznik (ów) Licznik (y) Inicjalizacja przerwania (s) Inicjalizacja inicjatora TIMSK 0x83 Inicjalizacja komparatora analogowego Komparator analogowy: Wył. Komparator wejścia analogowego TimerCounter 1: Wył. ACSR 0x80 SFIOR 0x00 sei () Włącz globalne przerwanie PWM1DCReg Wyjście wyjściowe dla filtru PORTB Przełącz port wyjściowy, aby umożliwić pomiar ISR Częstotliwość próbkowania PORTC ADCH Sprawdź wynik statusu ADCH Istnieje kilka błędów w kodzie. Wygląda na to, że czytasz tylko jedną próbkę na raz, więc byłoby sensownie zmienić definicję SAMPLES na 1 (lub po prostu użyć zmiennej zamiast tablicy). Numer 8220size8221 był pierwotnie liczbą próbek odczytanych z pliku w moim przykładzie. Powinieneś po prostu podać 1, jeśli robisz 1 próbkę na raz. Pętla do powinna zostać całkowicie wyeliminowana, ponieważ nie czytasz już z pliku. Powinieneś albo odpytać przerwanie timera, albo napisać ISR, abyś mógł okresowo czytać z ADC (8000 lub 8915 razy na sekundę, sądząc po komentarzach w twoim kodzie). I prawdopodobnie będziesz musiał napisać do swojego rejestru wyjściowego za każdym razem, gdy masz nowe wyjście. Polecam również rozpoczęcie od prostszego programu, w którym po prostu czytasz ADC, a następnie wypiszesz to, co czytasz. Gdy już to zrobisz, wpisz kod filtra. Mam nadzieję że to pomogło. Drogi Shawnie, dziękuję za poradnik i sugestię. Jestem nowy w programowaniu sterowników i muszę zacząć od pierwszego prostszego przykładu. Jestem bardzo zainteresowany nauką programowania sterownika, jeśli to możliwe, proszę zasugerować mi, jak powinienem zacząć. Rozpocząłem znajomość 8-bitowych mikrokontrolerów AVR z rodziny ATmega. i używam AVR Studio do programowania kontrolera. Proszę wskazać mi, jak powinienem zacząć pracować na kontrolerze. Abdul. Moja rada to zacznij od kilku przykładowych programów dostarczonych wraz z zestawem programistycznym (lub narzędziami lub gdzie indziej) i upewnij się, że możesz je poprawnie uruchomić. Następnie spróbuj eksperymentować, modyfikując te programy. Gdy znudzi cię to, spróbuj stworzyć swój własny program. Zacznij od czegoś prostego, jak konfigurowanie ADC i czytanie z niego. Następnie dodaj więcej funkcji, krok po kroku. Dodaj kod do ustawienia timera i sprawdź, czy działa. Dodaj kod, aby odpytać przerwanie licznika czasu. Następnie spróbuj kodować procedurę obsługi przerwań (ISR). Następnie dodaj kod do ISR, aby odczytać ADC. Sztuką jest napisać niewielką ilość kodu na raz i sprawdzić, czy działa na każdym kroku. Zwykle jest to łatwiejsze niż napisanie całej gamy kodu na raz, a następnie próba debugowania go od razu (zwłaszcza jeśli robisz coś, co jest dla ciebie nowe). Drogi Shawnie, Dziękuję bardzo za twoją cenną sugestię. I czekam na twoją pomoc, jeśli napotkam jakiś problem w programowaniu w przyszłości. Jeszcze raz dziękuję. Shawn, próbuję zrobić korektor graficzny za pomocą filtrów FIR i to było jak dotąd pomocne. Ale zastanawiałem się, czy masz jakieś informacje na temat zastosowania wzmocnienia do wydajności każdego zespołu Hi Joseph. W przypadku korektora graficznego, chcesz zastosować wzmocnienie do każdego pasma, mnożąc wynik końcowy filtrowania przez liczbę z zakresu od 0 do 1. Zatem każdy filtr powinien mieć maksymalne wzmocnienie 1 (na częstotliwości środkowej), a następnie powinieneś mieć zestaw zysków dla każdego zespołu. Najlepiej jest wyrazić zyski w dB (deciBels), jeśli tworzysz wyświetlacz graficzny lub kontrolkę (jak suwak). Zysk w dB wynosi 20 log10 (g), gdzie g jest wartością mnożenia (pomiędzy nieco powyżej 0 i 1). Następnie -6 dB odpowiada wzmocnieniu około 0,5. To jest 20 log10 (0,5) to około -6. Odwrotna formuła to g pow10 (G20), gdzie G jest wzmocnieniem w dB. Jeśli więc wzmocnienie wynosi -24 dB, wartość mnożnika to g pow10 (-2420) 0,063. Powodem używania decybeli jest to, że percepcja głośności przebiega według skali logarytmicznej. Mam nadzieję, że ci to pomoże. Cześć Shawn, świetny samouczek Twój blog ma o wiele więcej praktycznych rzeczy niż większość książek do przetwarzania sygnałów. Mam kilka dalszych pytań na temat tutoriala i byłoby wspaniale, gdybyś mógł wskazać mi właściwy kierunek. Próbuję zaimplementować (w hardwareverilog) 32-bitowy mac z 2 16-bitowymi wejściami. Jeśli chcę zachować wynik 32-bitowy w 16-bitowym rejestrze, rozumiem, że dla mnożenia z podpisem ze znakiem stałym należy po prostu (bez zaokrąglania) wydobywać bit od 30 do 15 (a nie 31 w przypadku podwójnego znaku). 1) Jestem trochę zdezorientowany, jeśli potrzebuję innego sprzętu do podpisanego mnożenia mnożenia i mnożenia całkowitej liczby całkowitej. Powiedzmy, że używam dwóch oddzielnych 16-bitowych rejestrów do przechowywania 32-bitowego wyniku mnożenia. Czy uważasz, że wystarczy użyć warunkowego przełącznika między 32-bitowym wynikiem mnożnika (bezpośrednio po sprzęcie wieloparowym) i tuż przed zapisaniem go do 2 osobnych rejestrów? Warunkowe przesunięcie w lewo o 1 dla ułamkowego mnożenia i przesuwanie o 0 dla całkowitej liczby mnożeń za komentarz. Twoje drugie pytanie wydaje się być utracone. Aby odpowiedzieć na pierwsze pytanie, powinieneś być w stanie użyć tego samego mnożnika dla mnożenia liczb całkowitych i stałoprzecinkowych, tak jak to opisałeś. W przypadku mnożnika punktu stałego istnieje jeden specjalny przypadek, o którym należy pamiętać, co oznacza pomnożenie -1 przez -1 (gdzie -1 oznacza 0x8000 w ułamkowej liczbie Q.15). Gdy pomnożysz 0x8000 przez 0x8000, wynik będzie wynosił 0x4000,0000. Jeśli zmienisz to w lewo, otrzymasz 0x8000,0000, więc wynik końcowy jest taki, że -1 razy -1 jest równe -1. Oto kilka sposobów radzenia sobie z tym: 1) Nigdy nie mnożyj -1 przez -1 2) Nasycaj wynik do 0x7FFF, FFFF 3) Podnieś flagę przepełnienia i jakoś poradzisz sobie z błędem. Mam nadzieję, że to pomoże. Wspólne filtrowanie wspólnych nazw: średnie filtrowanie, wygładzanie, uśrednianie, filtrowanie w ramce Skrócony opis Średnie filtrowanie to prosta, intuicyjna i łatwa do wdrożenia metoda wygładzania obrazów, tj. Zmniejszania zmienności intensywności między jednym pikselem a następnym . Jest często stosowany do redukcji szumów na obrazach. Jak to działa Idea średniego filtrowania polega po prostu na zamianie każdej wartości piksela na obrazie na średnią (średnią) wartość jego sąsiadów, w tym samego siebie. Powoduje to wyeliminowanie wartości pikseli, które są niereprezentatywne dla ich otoczenia. Średnie filtrowanie jest zwykle uważane za filtr splotu. Podobnie jak inne nawinięcia, opiera się na jądrze. który reprezentuje kształt i rozmiar sąsiedztwa, z którego mają być pobierane próbki podczas obliczania średniej. Często stosuje się kwadratowe jądro 32153, jak pokazano na Figurze 1, chociaż większe ziarna (na przykład 52155 kwadratów) mogą być stosowane do bardziej intensywnego wygładzania. (Zauważ, że małe jądro może być zastosowane więcej niż raz, aby uzyskać podobny, ale nie identyczny efekt jak pojedyncze przejście z dużym jądrem.) Rysunek 1 32153 uśrednianie jądra często używane w filtrowaniu średnim Obliczanie prostego splotu obrazu z to jądro wykonuje średni proces filtrowania. Wskazówki dotyczące stosowania Filtrowanie średnie jest najczęściej stosowane jako prosta metoda redukcji szumów na obrazie. Pokazujemy filtr z użyciem oryginału uszkodzonego przez szum Gaussa ze średnią zera, a standardowe odchylenie () z 8. pokazuje efekt zastosowania filtra 32153. Zwróć uwagę, że hałas jest mniej widoczny, ale obraz został zmiękczony. Jeśli zwiększymy rozmiar filtra średniego do 52155, otrzymamy obraz z mniejszą ilością szumu i mniejszymi szczegółami wysokiej częstotliwości, jak pokazano w tym samym obrazie, który jest silniej uszkodzony przez szum Gaussa (ze średnią 0 i 13) w jest wynikiem średniego filtrowania z jądrem 32153. Wyzwaniem jest jeszcze bardziej wymagające zadanie, pokazujące efekt wygładzenia hałaśliwego obrazu za pomocą filtra średniego 32153. Ponieważ wartości pikseli szumu oderwania są często bardzo różne od wartości otaczających, mają tendencję do znacznego zniekształcania średniej pikseli obliczonej przez średni filtr. Zamiast tego używa się filtra 52155 Ten wynik nie oznacza znaczącej poprawy w redukcji szumów, a ponadto obraz jest teraz bardzo rozmazany. Te przykłady ilustrują dwa główne problemy ze średnim filtrowaniem, które są następujące: pojedynczy piksel o bardzo niereprezentatywnej wartości może znacząco wpłynąć na średnią wartość wszystkich pikseli w jego sąsiedztwie. Gdy otoczenie filtra znajduje się na krawędzi, filtr będzie interpolował nowe wartości dla pikseli na krawędzi, a więc spowoduje rozmycie krawędzi. Może to stanowić problem, jeśli na wyjściu są wymagane ostre krawędzie. Oba te problemy są rozwiązywane przez filtr medianowy. co jest często lepszym filtrem redukującym szum niż filtr średni, ale obliczenie trwa dłużej. Ogólnie rzecz biorąc, filtr średni działa jako filtr dolnoprzepustowy, a zatem zmniejsza pochodne natężenia pola obecne w obrazie. Widzieliśmy już ten efekt jako zmiękczenie rysów twarzy w powyższym przykładzie. Rozważmy teraz obraz, który przedstawia scenę zawierającą szerszy zakres różnych częstotliwości przestrzennych. Po jednokrotnym wygładzeniu filtrem średnim 32153 uzyskujemy Zauważ, że informacja o niskiej częstotliwości w tle nie uległa znaczącemu wpływowi przez filtrowanie, ale wyraźnie ostre krawędzie pierwszego planu zostały znacząco wygładzone. Po filtrowaniu z filtrem 72157 otrzymujemy jeszcze bardziej dramatyczną ilustrację tego zjawiska w Porównaniu tego wyniku do wyniku uzyskanego przez przepuszczenie filtra 32153 nad obrazem oryginalnym trzykrotnie w Warianty wspólne Warianty na temat średniego filtru wygładzania omówione tutaj obejmują Uśrednianie progowe, w którym wygładzanie jest stosowane pod warunkiem, że środkowa wartość piksela zostanie zmieniona tylko wtedy, gdy różnica pomiędzy pierwotną wartością a wartością średnią jest większa niż ustawiony próg. Powoduje to, że szum jest wygładzany z mniej dramatyczną utratą szczegółów obrazu. Inne filtry splotowe, które nie obliczają średniej sąsiedztwa, są często wykorzystywane do wygładzania. Jednym z najczęstszych z nich jest filtr wygładzający Gaussa. Interaktywna eksperymentacja Możesz interaktywnie eksperymentować z tym operatorem, klikając tutaj. Średni filtr jest obliczany za pomocą splotu. Czy możesz wymyślić jakikolwiek sposób wykorzystania specjalnych właściwości średniego jądra filtra do przyspieszenia splotu Jaka jest złożoność obliczeniowa tego szybszego splotu Użyj detektora krawędzi na obrazie i zanotuj moc wyjściową. Następnie zastosuj filtr średniej 32153 do oryginalnego obrazu i ponownie uruchom czujnik krawędzi. Skomentuj różnicę. Co się dzieje, gdy używany jest filtr 52155 lub 72157? Zastosowanie filtra średniego 32153 dwa razy nie daje takich samych rezultatów jak zastosowanie filtra o średniej wartości 52155 jeden raz. Jednak można skonstruować jądro splotowe 52155, które jest równoważne. Jak wygląda to jądro Utwórz jądro splotu 72157, które ma podobny efekt do trzech przebiegów ze średnim filtrem 32153. Jak myślisz, jaki średni filtr poradziłby sobie z szumem Gaussa, który nie był symetryczny względem zera Spróbuj kilka przykładów. Referencje R. Boyle i R. Thomas Computer Vision: Pierwszy kurs. Blackwell Scientific Publications, 1988, str. 32 - 34. Wizja maszynowa E. Daviesa: Teoria, algorytmy i praktyczne aspekty. Academic Press, 1990, rozdz. 3. D. Vernon Machine Vision. Prentice-Hall, 1991, rozdz. 4. Informacje lokalne Szczegółowe informacje na temat tego operatora można znaleźć tutaj. Więcej ogólnych porad na temat lokalnej instalacji HIPR znajduje się w części wprowadzającej Informacje lokalne.

No comments:

Post a Comment