logo

Генериране на филтър на Гаус в C++

Филтриране по Гаус се използва широко в областта на обработката на изображения. Използва се за намаляване на шума в изображението. В тази статия ще генерираме a 2D гаусово ядро. Двумерното ядро ​​на Гаус следва даденото по-долу разпределение на Гаус. 
G(x y)=frac{1}{2pi сигма ^{2}}e^{-frac{x^{2}+y^{2}}{2sigma ^{2}}}   
Където y е разстоянието по вертикалната ос от началото x е разстоянието по хоризонталната ос от началото и ? е стандартното отклонение.

Какво е Gaussian Filtering?

Gaussian Filtering е техника, използвана при обработката на изображения за изглаждане на изображения и намаляване на шума. Той работи чрез прилагане на ефект на размазване с помощта на математическа функция, наречена функция на Гаус, която дава по-голяма тежест на централните пиксели и по-малко на околните. Това води до естествено изглеждащо замъгляване, което помага за премахване на нежелани детайли като зърнистост или малки артефакти. Филтрирането по Гаус се използва широко като стъпка на предварителна обработка в задачи като разпознаване на обекти за откриване на ръбове и подобряване на изображението, което улеснява фокусирането на алгоритмите върху важни характеристики.



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

Реални приложения на Гаусово филтриране

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

  • Компютърно зрение : Помага за откриване на ръбове и форми чрез намаляване на шума преди прилагане на алгоритми за откриване.
  • Медицински изображения : Използва се за изглаждане на MRI или CT сканиране, което улеснява идентифицирането на тъкани и аномалии.
  • Откриване на обекти : Подготвя изображения, като премахва разсейването, което позволява на моделите да се съсредоточат върху ключови характеристики.
  • Инструменти за редактиране на снимки : Обикновено се използва за нанасяне ефекти на размазване омекотете изображенията или намалете зърнистостта за по-чист вид.

Сравнение с други филтри

Ето как Гаусов филтър се отличава от другите често срещани филтри:



  • Кутиен филтър (среден филтър) : Размазва изображението чрез подаване еднакво тегло към всички околни пиксели. Филтърът на Гаус е по-добър, защото дава повече тегло на централните пиксели създавайки по-гладко по-естествено размазване.
  • Медианен филтър : Заменя всеки пиксел с медиана на близки стойности, което е чудесно за премахване сол и пипер шум . За разлика от Gaussian, той не размазва изображението толкова много, но може да изкриви ръбовете.
  • Двустранен филтър : Като Gaussian, но също така взема предвид интензитет на пикселите запазване на различията ръбове при изглаждане. Това е по-напреднало, но и повече изчислително тежък .

2D срещу 1D Гаусово филтриране

А 2D филтър на Гаус може да се раздели на два 1D филтъра — един хоризонтален и един вертикален. Това се нарича разделимост и това означава, че не е необходимо да прилагаме пълно 2D ядро ​​наведнъж.

Защо има значение:

Вместо да правим тежки изчисления с голямо 2D ядро ​​(напр. 5×5), ние прилагаме 1D ядро ​​хоризонтално след това същото ядро ​​вертикално . Това намалява времето за изчисление и дава същия резултат .

съединения и видове съединения

Съображения за производителност

Генериране и прилагане на a Гаусово ядро може да бъде изчислително скъпо особено за големи изображения или ядра.



  • Времева сложност :
    • За ядро ​​с размер k × k приложен към an n × n изображение времевата сложност е O(n² × k²) .
    • Това е така, защото всяка операция с пиксели включва цикъл върху цялото ядро.
  • Оптимизация – Разделими филтри :
    Гаусовите ядра са разделим което означава, че 2D филтър може да бъде пробит два 1D филтъра : една хоризонтална и една вертикална.
    • Това намалява времевата сложност до O(n² × k) правейки го много по-бързо за по-големи ядра.

Използването на разделяеми филтри е често срещан трик в системите от реалния свят за ускоряване на филтрирането по Гаус без загуба на качество.

Трябва да се прочете

  • Приложете филтър на Гаус към изображение с Python
  • Как да генерирам 2-D гауссов масив с помощта на NumPy?
  • Интегриране на Гаусови функции

Заключение

Филтрирането по Гаус е проста, но мощна техника за намаляване на шума и замъгляването на изображението използвайки гладка среднопретеглена стойност, базирана на функцията на Гаус. В тази статия генерирахме a 2D гаусово ядро и изследва ролята му в различни приложения от реалния свят като медицински изображения с компютърно зрение и редактиране на снимки. Също така го сравнихме с други филтри и обсъдихме начини за това оптимизирайте производителността използване на разделящи се филтри. Като цяло филтрирането по Гаус е a основен инструмент за обработка на изображения помага за подобряване на качеството на изображението и улеснява фокусирането на алгоритмите върху важни визуални детайли.