Размытие матрицы с использованием быстрых преобразований Фурье

Я хочу размывать значения в матрице, чтобы в соседних элементах не было резких переходов.

Со страницы Википедии Gaussian Blur Я нашел некоторую информацию о размытии по Гауссу. Я попробовал это с самым простым алгоритмом, и, следовательно, время выполнения было слишком длинным. Честно говоря, я не уверен, что моя реализация верна, поскольку на граничных тайлах все еще существует резкий переход.

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

Итак, идея в том, что мы можем получить размытую матрицу по формулам ниже:

blurredMatrix = IFFT[FFT[initialMatrix]FFT[weightingFunction]]

Где FFT / IFFT — быстрое преобразование Фурье / обратное быстрое преобразование Фурье.

В настоящее время я пытаюсь провести некоторое тестирование на Wolfram Mathematica, чтобы убедиться в правильности такого приближения с помощью преобразований Фурье.

я использую GaussianMatrix в качестве весовой функции.

Мне нужно 2d размытие, поэтому я создал гауссову матрицу, как показано ниже:

Предположим, что наша исходная матрица имеет nxn размеров, где n = 2k + 1

G = Chop[GaussianMatrix[k] GaussianMatrix[k], 10^6]

И тогда я попытался создать blurredMatrix, как показано ниже:

blurredMatrix = Chop[FourierDCT[(FourierDCT[G]) (FourierDCT[initialMatrix]), 3], 10^-6]

Но я получаю нули в результате.

Кажется, я все делаю неправильно.

Также я попробовал другой подход:

f[xi_, yj_] := 1/(2 \[Pi] \[Sigma]^2) Exp[-(((xi^2) + (yj^2) )/(2 \[Sigma]^2))];<br/>
[Sigma] = 3;<br/>
G = Chop[N[Table[f[i, j], {i, 1, 100}, {j, 1, 100}]]]; <br/>
Tavg = Chop[ 1000 InverseFourier[(Fourier[G]) (Fourier[T]) ], 10^-6]; <br/>

При таком подходе картинка выглядит хорошо (изображение размыто), но между значениями blurredMatrix и initialMatrix существует большая разница.

Кажется, есть некоторая нормализация или другие проблемы.

Мне нужно написать код на C / C ++, есть библиотека FFTW на C, которая поддерживает дискретные преобразования Фурье.

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

2

Решение

Использование БПФ для сверток эффективно только тогда, когда у вас очень большие сверточные ядра. В большинстве приложений размывания ядро ​​намного меньше, чем изображение, например 3х3, поэтому БПФ будет значительно медленнее.

Есть много реализаций для выполнения сверток с небольшим ядром.
Большинство современного оборудования поддерживает такие внутренние операции (MMX, SSE, GPU …).
БПФ, вероятно, не подходит в вашем случае.

В C ++ OpenCV поддерживает кроссплатформенные и аппаратно-ускоренные свертки изображений. Свертки действительно являются одной из (если не) самой основной операцией любого пакета обработки изображений и сигналов.

5

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


По вопросам рекламы [email protected]