Generowanie filtrów Gaussa w C++
Filtrowanie Gaussa jest szeroko stosowany w dziedzinie przetwarzania obrazu. Służy do redukcji szumów obrazu. W tym artykule wygenerujemy plik Jądro Gaussa 2D. Jądro Gaussa 2D jest zgodne z podanym poniżej rozkładem Gaussa.
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}
Gdzie y to odległość wzdłuż osi pionowej od początku, x to odległość wzdłuż osi poziomej od początku, a? jest odchyleniem standardowym.
Co to jest filtrowanie Gaussa?
Filtrowanie Gaussa to technika stosowana w przetwarzaniu obrazu w celu wygładzenia obrazów i redukcji szumów. Działa poprzez zastosowanie efektu rozmycia za pomocą funkcji matematycznej zwanej funkcją Gaussa, która przypisuje większą wagę centralnym pikselom, a mniej otaczającym. Powoduje to naturalnie wyglądające rozmycie, które pomaga usunąć niechciane szczegóły, takie jak ziarno lub małe artefakty. Filtrowanie Gaussa jest szeroko stosowane jako etap wstępnego przetwarzania w zadaniach takich jak rozpoznawanie obiektów z wykrywaniem krawędzi i ulepszanie obrazu, co ułatwia algorytmom skupienie się na ważnych funkcjach.
Implementacja w C++
C++ // C++ program to generate Gaussian filter #include #include #include using namespace std ; // Function to create Gaussian filter void FilterCreation ( double GKernel [][ 5 ]) { // initialising standard deviation to 1.0 double sigma = 1.0 ; double r s = 2.0 * sigma * sigma ; // sum is for normalization double sum = 0.0 ; // generating 5x5 kernel for ( int x = -2 ; x <= 2 ; x ++ ) { for ( int y = -2 ; y <= 2 ; y ++ ) { r = sqrt ( x * x + y * y ); GKernel [ x + 2 ][ y + 2 ] = ( exp ( - ( r * r ) / s )) / ( M_PI * s ); sum += GKernel [ x + 2 ][ y + 2 ]; } } // normalising the Kernel for ( int i = 0 ; i < 5 ; ++ i ) for ( int j = 0 ; j < 5 ; ++ j ) GKernel [ i ][ j ] /= sum ; } // Driver program to test above function int main () { double GKernel [ 5 ][ 5 ]; FilterCreation ( GKernel ); for ( int i = 0 ; i < 5 ; ++ i ) { for ( int j = 0 ; j < 5 ; ++ j ) cout < < GKernel [ i ][ j ] < < ' t ' ; cout < < endl ; } }
Wyjście:
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.0219382 0.0983203 0.162103 0.0983203 0.0219382
0.0133062 0.0596343 0.0983203 0.0596343 0.0133062
0.00296902 0.0133062 0.0219382 0.0133062 0.00296902Zastosowania w świecie rzeczywistym filtrowania Gaussa
Filtry Gaussa są stosowane w wielu technologiach codziennego użytku poprawić jakość obrazu I wydobyć przydatne informacje :
- Wizja komputerowa : Pomaga wykrywać krawędzie i kształty poprzez redukcję szumów przed zastosowaniem algorytmów wykrywania.
- Obrazowanie medyczne : Służy do wygładzania skanów MRI lub CT, ułatwiając identyfikację tkanek i nieprawidłowości.
- Wykrywanie obiektów : Przygotowuje obrazy, usuwając elementy rozpraszające, umożliwiając modelom skupienie się na kluczowych cechach.
- Narzędzia do edycji zdjęć : Powszechnie stosowane do stosowania efekty rozmycia zmiękczyć obrazy lub zmniejszyć ziarnistość, aby uzyskać czystszy wygląd.
Porównanie z innymi filtrami
Oto jak to zrobić Filtr Gaussa wyróżnia się na tle innych popularnych filtrów:
- Filtr skrzynkowy (filtr średni) : Rozmywa obraz, dając równą wagę do wszystkich otaczających pikseli. Filtr Gaussa jest lepszy, ponieważ daje większa waga środkowych pikseli tworząc gładsze, bardziej naturalne rozmycie.
- Filtr medianowy : Zamienia każdy piksel na mediana pobliskich wartości, co doskonale nadaje się do usuwania odgłosy soli i pieprzu . W przeciwieństwie do Gaussa nie rozmywa tak bardzo obrazu, ale może zniekształcić krawędzie.
- Filtr dwustronny : Podobnie jak Gaussian, ale także rozważa intensywność pikseli zachowanie różnic krawędzie podczas wygładzania. Jest bardziej zaawansowany, ale też bardziej ciężki obliczeniowo .
Filtrowanie gaussowskie 2D i 1D
A Filtr Gaussa 2D można podzielić na dwa filtry 1D — jeden poziomy i jeden pionowy. To się nazywa rozdzielność oznacza to, że nie musimy od razu instalować pełnego jądra 2D.
Dlaczego to ma znaczenie:
Zamiast wykonywać ciężkie obliczenia z dużym jądrem 2D (np. 5×5) stosujemy a Jądro 1D poziomo potem to samo jądro w pionie . Skraca to czas obliczeń i daje ten sam wynik .
Rozważania dotyczące wydajności
Generowanie i stosowanie a Jądro Gaussa może być kosztowne obliczeniowo szczególnie w przypadku dużych obrazów lub jąder.
- Złożoność czasu :
- Dla jądra o rozmiarze k × k zastosowany do n × n obraz złożoności czasowej O(n² × k²) .
- Dzieje się tak, ponieważ każda operacja na pikselach wymaga zapętlenia całego jądra.
- Optymalizacja – filtry rozdzielne :
Jądra Gaussa są rozdzielny co oznacza, że można rozbić filtr 2D dwa filtry 1D : jeden poziomy i jeden pionowy.- Zmniejsza to złożoność czasową do O(n² × k) zrobienie tego znacznie szybciej dla większych jąder.
Używanie filtrów rozdzielnych jest powszechną sztuczką w rzeczywistych systemach, mającą na celu przyspieszenie filtrowania Gaussa bez utraty jakości.
Musisz przeczytać
- Zastosuj filtr Gaussa do obrazu za pomocą Pythona
- Jak wygenerować dwuwymiarową tablicę Gaussa za pomocą NumPy?
- Całkowanie funkcji Gaussa
Wniosek
Filtrowanie Gaussa jest prostą, ale potężną techniką redukując szumy i rozmycie obrazu stosując gładką średnią ważoną opartą na funkcji Gaussa. W tym artykule wygenerowaliśmy plik Jądro Gaussa 2D i zbadał jego rolę w różnych aplikacje w świecie rzeczywistym jak obrazowanie medyczne metodą komputerową i edycja zdjęć. Porównaliśmy go również z innymi filtrami i omówiliśmy sposoby zoptymalizować wydajność przy użyciu oddzielnych filtrów. Ogólna filtracja Gaussa to: podstawowe narzędzie w przetwarzaniu obrazu pomagając poprawić jakość obrazu i ułatwiając algorytmom skupienie się na ważnych szczegółach wizualnych.