logo

Generovanie Gaussovho filtra v C++

Gaussovo filtrovanie je široko používaný v oblasti spracovania obrazu. Používa sa na zníženie šumu obrazu. V tomto článku vygenerujeme a 2D Gaussovo jadro. 2D Gaussovské jadro sa riadi nižšie uvedeným Gaussovým rozdelením. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Kde y je vzdialenosť pozdĺž zvislej osi od začiatku x je vzdialenosť pozdĺž vodorovnej osi od začiatku a ? je štandardná odchýlka.

Čo je Gaussova filtrácia?

Gaussovské filtrovanie je technika používaná pri spracovaní obrazu na vyhladenie obrazu a zníženie šumu. Funguje tak, že aplikuje efekt rozostrenia pomocou matematickej funkcie nazývanej Gaussova funkcia, ktorá dáva väčšiu váhu centrálnym pixelom a menšiu váhu okolitým. Výsledkom je prirodzene vyzerajúce rozostrenie, ktoré pomáha odstrániť nežiaduce detaily, ako je zrno alebo malé artefakty. Gaussovské filtrovanie sa široko používa ako krok predspracovania v úlohách, ako je rozpoznávanie objektov s detekciou hrán a vylepšenie obrazu, čo uľahčuje algoritmom zamerať sa na dôležité funkcie.



Implementácia v 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;  } } 

výstup: 

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 

Reálne aplikácie Gaussovho filtrovania

Gaussove filtre sa používajú v mnohých každodenných technológiách zlepšiť kvalitu obrazu a získať užitočné informácie :

  • Počítačové videnie : Pomáha detekovať hrany a tvary znížením šumu pred použitím detekčných algoritmov.
  • Lekárske zobrazovanie : Používa sa na vyhladenie skenov MRI alebo CT, čo uľahčuje identifikáciu tkanív a abnormalít.
  • Detekcia objektov : Pripravuje snímky odstránením rušivých vplyvov, čo modelom umožňuje sústrediť sa na kľúčové funkcie.
  • Nástroje na úpravu fotografií : Bežne sa používa efekty rozmazania zjemnite obrázky alebo znížte zrnitosť pre čistejší vzhľad.

Porovnanie s inými filtrami

Tu je postup Gaussov filter sa odlišuje od ostatných bežných filtrov:



  • Box Filter (priemerný filter) : Rozostruje obraz zadaním rovnakú váhu na všetky okolité pixely. Gaussov filter je lepší, pretože dáva väčšiu váhu na stredové pixely vytvorenie jemnejšieho a prirodzenejšieho rozmazania.
  • Stredný filter : Nahradí každý pixel znakom medián blízkych hodnôt, čo je skvelé na odstránenie hluk soli a korenia . Na rozdiel od Gaussovho obrazu sa obraz až tak nerozmazáva, ale môže skresľovať okraje.
  • Obojstranný filter : Rovnako ako Gaussian, ale tiež uvažuje intenzita pixelov zachovanie rozdielov hrany pri vyhladzovaní. Je to pokročilejšie, ale aj viac výpočtovo ťažké .

2D vs 1D Gaussovské filtrovanie

A 2D Gaussov filter možno rozložiť na dva 1D filtre — jedna horizontálna a jedna vertikálna. Toto sa nazýva oddeliteľnosť a to znamená, že nemusíme použiť celé 2D jadro naraz.

Prečo na tom záleží:

Namiesto náročných výpočtov s veľkým 2D jadrom (napr. 5×5) použijeme 1D jadro vodorovne potom rovnaké jadro vertikálne . To skracuje čas výpočtu a dáva rovnaký výsledok .

python __name__

Úvahy o výkone

Generovanie a aplikácia a Gaussovo jadro môže byť výpočtovo drahé najmä pre veľké obrázky alebo jadrá.



  • Časová zložitosť :
    • Pre jadro veľ k × k aplikovaný na an n × n časová zložitosť je O(n² × k²) .
    • Je to preto, že každá operácia pixelov zahŕňa slučkovanie celého jadra.
  • Optimalizácia – oddeliteľné filtre :
    Gaussove jadrá sú oddeliteľné čo znamená, že do 2D filtra je možné vniknúť dva 1D filtre : jedna horizontálna a jedna vertikálna.
    • Tým sa znižuje časová náročnosť na O(n² × k) robiť to oveľa rýchlejšie pre väčšie jadrá.

Používanie oddeliteľných filtrov je bežným trikom v reálnych systémoch na urýchlenie Gaussovho filtrovania bez straty kvality.

Musíte si prečítať

  • Použite Gaussov filter na obrázok pomocou Pythonu
  • Ako vygenerovať 2-D Gaussovské pole pomocou NumPy?
  • Integrácia Gaussových funkcií

Záver

Gaussovské filtrovanie je jednoduchá, ale účinná technika zníženie šumu a rozmazania obrazu pomocou hladkého váženého priemeru na základe Gaussovej funkcie. V tomto článku sme vygenerovali a 2D Gaussovo jadro a skúmal jej úlohu v rôznych aplikácie v reálnom svete ako lekárske zobrazovanie počítačovým videním a úprava fotografií. Porovnali sme to aj s inými filtrami a diskutovali o spôsoboch, ako na to optimalizovať výkon pomocou oddeliteľných filtrov. Celkové Gaussovo filtrovanie je a základný nástroj na spracovanie obrazu pomáha zlepšovať kvalitu obrazu a uľahčuje algoritmom zamerať sa na dôležité vizuálne detaily.