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.00296902 

Zastosowania 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.