logo

Генерація фільтра Гауса в C++

Фільтрація Гауса широко використовується в області обробки зображень. Використовується для зменшення шуму зображення. У цій статті ми створимо a Двовимірне ядро ​​Гауса. Ядро 2D Gaussian дотримується наведеного нижче розподілу Gaussian. 
G(x y)=frac{1}{2pi сигма ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Де y — відстань уздовж вертикальної осі від початку координат, x — відстань уздовж горизонтальної осі від початку координат і ? є стандартним відхиленням.

Що таке фільтрація Гауса?

Фільтр Гауса — це техніка, яка використовується в обробці зображень для згладжування зображень і зменшення шуму. Він працює шляхом застосування ефекту розмиття за допомогою математичної функції, яка називається функцією Гаусса, яка надає більшої ваги центральним пікселям і меншій – оточуючим. Це призводить до природного розмиття, яке допомагає видалити небажані деталі, як-от зернистість або дрібні артефакти. Фільтрація Гауса широко використовується як етап попередньої обробки в таких завданнях, як розпізнавання об’єктів виявлення країв і покращення зображення, що полегшує алгоритмам зосередження на важливих функціях.



Реалізація в 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;  } } 

Вихід: 

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 

Реальні застосування фільтрації Гауса

Фільтри Гауса використовуються в багатьох повсякденних технологіях покращити якість зображення і отримати корисну інформацію :

  • Комп'ютерний зір : Допомагає виявляти краї та форми шляхом зменшення шуму перед застосуванням алгоритмів виявлення.
  • Медична візуалізація : Використовується для згладжування МРТ або КТ, що полегшує ідентифікацію тканин і аномалій.
  • Виявлення об'єктів : готує зображення, усуваючи відволікання, дозволяючи моделям зосередитися на ключових функціях.
  • Інструменти для редагування фотографій : Зазвичай використовується для застосування ефекти розмиття пом’якшити зображення або зменшити зернистість для більш чистого вигляду.

Порівняння з іншими фільтрами

Ось як Фільтр Гауса виділяється серед інших поширених фільтрів:



  • Коробковий фільтр (середній фільтр) : Розмиває зображення, надаючи однакова вага до всіх навколишніх пікселів. Фільтр Гауса кращий, оскільки він дає більша вага центральних пікселів створення більш плавного, більш природного розмиття.
  • Медіанний фільтр : замінює кожен піксель на медіана близьких значень, які чудово видалити солоно-перцевий шум . На відміну від Гаусса, це не сильно розмиває зображення, але може спотворювати краї.
  • Двосторонній фільтр : Як Гаусс, але також враховує інтенсивність пікселів збереження відмінностей краю під час розгладжування. Це більш просунуте, але також більше обчислювально важкий .

2D проти 1D фільтрації Гауса

А 2D фільтр Гаусса можна розбити на два 1D фільтри — один горизонтальний і один вертикальний. Це називається роздільність і це означає, що нам не потрібно відразу застосовувати повне двовимірне ядро.

Чому це важливо:

Замість того, щоб виконувати важкі обчислення з великим двовимірним ядром (наприклад, 5×5), ми застосовуємо 1D ядро ​​горизонтально потім те саме ядро ​​по вертикалі . Це скорочує час обчислень і дає такий же результат .

хто такий фредді мерк'юрі

Зауваження продуктивності

Створення та застосування a Ядро Гауса може бути обчислювально дорогий особливо для великих зображень або ядер.



  • Часова складність :
    • Для ядра розміром k × k застосовується до ан n × n зображення часової складності O(n² × k²) .
    • Це пов’язано з тим, що кожна операція з пікселями включає цикл над усім ядром.
  • Оптимізація – роздільні фільтри :
    Ядра Гауса є роздільні тобто 2D-фільтр можна зламати два 1D фільтри : один горизонтальний і один вертикальний.
    • Це зменшує часову складність O(n² × k) роблячи це набагато швидше для великих ядер.

Використання роздільних фільтрів є поширеним трюком у реальних системах для прискорення фільтрації Гауса без втрати якості.

Необхідно прочитати

  • Застосуйте фільтр Гауса до зображення за допомогою Python
  • Як створити 2-D масив Гауса за допомогою NumPy?
  • Інтегрування функцій Гауса

Висновок

Фільтрація за Гауссом є простою, але потужною технікою для зменшення шуму та розмитості зображення з використанням плавного зваженого середнього на основі функції Гауса. У цій статті ми створили a Двовимірне ядро ​​Гауса і досліджував її роль у різних реальні програми як медичне зображення комп’ютерного зору та редагування фотографій. Ми також порівняли його з іншими фільтрами та обговорили способи оптимізувати продуктивність з використанням роздільних фільтрів. Загальна фільтрація Гауса є a основний інструмент обробки зображень допомагає покращити якість зображення та полегшує алгоритмам зосередження на важливих візуальних деталях.