Я борюсь со своей способностью реализовать вычисленное гауссовское ядро, чтобы вернуть размытое изображение.
Мой текущий код, который вычисляет ядро ниже:
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 для замены пикселей исходного изображения, но я не смог правильно реализовать эту идею.
Спасибо за ваше время.
Похоже, вы хотите вычислить свертку исходного изображения с гауссовым ядром, что-то вроде этого:
размыто [x] [y] = интеграл (ядро [s] [t] * оригинал [x-s] [y-t]) ds dt
Есть несколько методов для этого:
Прямая свертка: пройдите через сетку и вычислите вышеуказанный интеграл в каждой точке. Это хорошо работает для ядер с очень небольшой поддержкой, порядка 5 точек сетки в каждом направлении, но для ядер с большей поддержкой становится слишком медленным. Для ядер Гаусса эмпирическое правило для усечения поддержки составляет около 3 * сигма, поэтому нецелесообразно делать прямую свертку с сигмой под 2 точками сетки.
Быстрое преобразование Фурье (БПФ). Это работает достаточно быстро для любого ядра. Поэтому FFT стал стандартным способом вычисления свертки почти всего с чем угодно. Прямая свертка превосходит FFT только для ядра с очень маленькой поддержкой.
Аналитические: интегралы некоторых ядер имеют аналитические выражения. В частности, интеграл от гауссиана — это функция Erf, и, по крайней мере в системах Unix, она доступна как вызов функции. Более того, на некоторых аппаратных средствах (например, графических процессорах) Erf реализован аппаратно. В некоторых редких (но важных) случаях грубых двухуровневых изображений можно заменить свертку гауссовой на цикл вызовов функции Erf.
Для большинства вычислительных систем лучше всего использовать FFT: это быстро и достаточно гибко, чтобы правильно обрабатывать любые ядра и изображения.
Других решений пока нет …