Как вы реализуете вычисленное гауссово ядро?

Я борюсь со своей способностью реализовать вычисленное гауссовское ядро, чтобы вернуть размытое изображение.
Мой текущий код, который вычисляет ядро ​​ниже:

const int m = 5;
const int n = 5;
double sigma = std;
Mat Gauss;
double kernel[m][n];
for ( int x = 0; x < m; ++x )
for ( int y = 0; y < n; ++y )
{
kernel[x][y] = (1 / (sigma * (sqrt(2 * M_PI))))
* exp(-0.5 * (std::pow((x - avg) / sigma, 2.0)
+ pow((y - avg) / sigma, 2.0) ) / (2 * M_PI * sigma * sigma));
}

Однако я не могу понять, как применить это к изображению таким образом, чтобы мне возвращалось размытое изображение.
Я был бы признателен, если бы кто-нибудь дал мне несколько советов, чтобы я мог применить это к изображению.

Я думал об использовании цикла for для замены пикселей исходного изображения, но я не смог правильно реализовать эту идею.
Спасибо за ваше время.

0

Решение

Похоже, вы хотите вычислить свертку исходного изображения с гауссовым ядром, что-то вроде этого:

размыто [x] [y] = интеграл (ядро [s] [t] * оригинал [x-s] [y-t]) ds dt

Есть несколько методов для этого:

  1. Прямая свертка: пройдите через сетку и вычислите вышеуказанный интеграл в каждой точке. Это хорошо работает для ядер с очень небольшой поддержкой, порядка 5 точек сетки в каждом направлении, но для ядер с большей поддержкой становится слишком медленным. Для ядер Гаусса эмпирическое правило для усечения поддержки составляет около 3 * сигма, поэтому нецелесообразно делать прямую свертку с сигмой под 2 точками сетки.

  2. Быстрое преобразование Фурье (БПФ). Это работает достаточно быстро для любого ядра. Поэтому FFT стал стандартным способом вычисления свертки почти всего с чем угодно. Прямая свертка превосходит FFT только для ядра с очень маленькой поддержкой.

  3. Аналитические: интегралы некоторых ядер имеют аналитические выражения. В частности, интеграл от гауссиана — это функция Erf, и, по крайней мере в системах Unix, она доступна как вызов функции. Более того, на некоторых аппаратных средствах (например, графических процессорах) Erf реализован аппаратно. В некоторых редких (но важных) случаях грубых двухуровневых изображений можно заменить свертку гауссовой на цикл вызовов функции Erf.

Для большинства вычислительных систем лучше всего использовать FFT: это быстро и достаточно гибко, чтобы правильно обрабатывать любые ядра и изображения.

0

Другие решения

Других решений пока нет …