logo

Gausa filtra ģenerēšana programmā C++

Gausa filtrēšana tiek plaši izmantots attēlu apstrādes jomā. To izmanto, lai samazinātu attēla troksni. Šajā rakstā mēs ģenerēsim a 2D Gausa kodols. 2D Gausa kodols atbilst tālāk norādītajam Gausa sadalījumam. 
G(x y)=frac{1}{2pi sigma ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Kur y ir attālums pa vertikālo asi no sākuma punkta x ir attālums pa horizontālo asi no sākuma un ? ir standarta novirze.

Kas ir Gausa filtrēšana?

Gausa filtrēšana ir metode, ko izmanto attēlu apstrādē, lai izlīdzinātu attēlus un samazinātu troksni. Tas darbojas, izmantojot izplūšanas efektu, izmantojot matemātisko funkciju, ko sauc par Gausa funkciju, kas piešķir lielāku nozīmi centrālajiem pikseļiem un mazāk apkārtējiem pikseļiem. Tas rada dabiska izskata izplūšanu, kas palīdz noņemt nevēlamas detaļas, piemēram, graudus vai mazus artefaktus. Gausa filtrēšana tiek plaši izmantota kā priekšapstrādes solis tādos uzdevumos kā malu noteikšanas objektu atpazīšana un attēla uzlabošana, kas atvieglo algoritmu koncentrēšanos uz svarīgām funkcijām.



Ieviešana C++ valodā  

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;  } } 

Izvade: 

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 

Gausa filtrēšanas reālās pasaules pielietojumi

Gausa filtri tiek izmantoti daudzās ikdienas tehnoloģijās uzlabot attēla kvalitāti un iegūt noderīgu informāciju :

  • Datorredze : palīdz noteikt malas un formas, samazinot troksni pirms noteikšanas algoritmu piemērošanas.
  • Medicīniskā attēlveidošana : izmanto, lai izlīdzinātu MRI vai CT skenēšanu, atvieglojot audu un anomāliju identificēšanu.
  • Objektu noteikšana : sagatavo attēlus, novēršot traucējošos faktorus, ļaujot modeļiem koncentrēties uz galvenajām funkcijām.
  • Fotoattēlu rediģēšanas rīki : parasti izmanto, lai piemērotu izplūšanas efekti mīkstiniet attēlus vai samaziniet graudainību, lai iegūtu tīrāku izskatu.

Salīdzinājums ar citiem filtriem

Lūk, kā Gausa filtrs izceļas no citiem izplatītākajiem filtriem:



  • Kastes filtrs (vidējais filtrs) : aizmiglo attēlu, dodot vienāds svars uz visiem apkārtējiem pikseļiem. Gausa filtrs ir labāks, jo tas dod vairāk svara centrālajiem pikseļiem radot vienmērīgāku un dabiskāku izplūšanu.
  • Vidējais filtrs : aizstāj katru pikseli ar mediāna tuvumā esošās vērtības, kas ir lieliski piemērotas noņemšanai sāls un piparu troksnis . Atšķirībā no Gausa attēla tas neizplūst tik daudz, bet var izkropļot malas.
  • Divpusējais filtrs : Tāpat kā Gauss, bet arī uzskata pikseļu intensitāte atšķirību saglabāšana malām gludināšanas laikā. Tas ir vairāk uzlabots, bet arī vairāk skaitļošanas ziņā smags .

2D pret 1D Gausa filtrēšana

A 2D Gausa filtrs var sadalīt divi 1D filtri — viens horizontāls un viens vertikāls. To sauc atdalāmība un tas nozīmē, ka mums nav uzreiz jāpielieto pilns 2D kodols.

Kāpēc tas ir svarīgi:

Tā vietā, lai veiktu smagus aprēķinus ar lielu 2D kodolu (piemēram, 5 × 5), mēs izmantojam 1D kodols horizontāli tad tas pats kodols vertikāli . Tas samazina aprēķina laiku un dod tāds pats rezultāts .

c# datetime

Veiktspējas apsvērumi

ģenerēšana un pielietošana a Gausa kodols var būt skaitļošanas ziņā dārgi īpaši lieliem attēliem vai kodoliem.



  • Laika sarežģītība :
    • Lieluma kodolam k × k attiecas uz an n × n attēla laika sarežģītība ir O(n² × k²) .
    • Tas ir tāpēc, ka katra pikseļa darbība ietver cilpu pa visu kodolu.
  • Optimizācija — atdalāmi filtri :
    Gausa kodoli ir atdalāms tas nozīmē, ka 2D filtru var uzlauzt divi 1D filtri : viens horizontāls un viens vertikāls.
    • Tas samazina laika sarežģītību līdz O(n² × k) padarot to daudz ātrāk lielākiem kodoliem.

Atdalāmu filtru izmantošana ir izplatīts triks reālās pasaules sistēmās, lai paātrinātu Gausa filtrēšanu, nezaudējot kvalitāti.

Jālasa

  • Izmantojiet Gausa filtru attēlam, izmantojot Python
  • Kā ģenerēt 2-D Gausa masīvu, izmantojot NumPy?
  • Gausa funkciju integrācija

Secinājums

Gausa filtrēšana ir vienkārša, taču jaudīga metode samazinot attēla trokšņus un izplūšanu izmantojot vienmērīgu vidējo svērto vērtību, pamatojoties uz Gausa funkciju. Šajā rakstā mēs izveidojām a 2D Gausa kodols un pētīja tās lomu dažādās reālās pasaules lietojumprogrammas piemēram, datorredzes medicīniskā attēlveidošana un fotoattēlu rediģēšana. Mēs to arī salīdzinājām ar citiem filtriem un apspriedām veidus, kā to izdarīt optimizēt veiktspēju izmantojot atdalāmus filtrus. Kopējā Gausa filtrēšana ir a pamatrīks attēlu apstrādē palīdzot uzlabot attēla kvalitāti un atvieglot algoritmu koncentrēšanos uz svarīgām vizuālām detaļām.