Размытие по Гауссу - стандартное отклонение, радиус и размер ядра

19

Я реализовал гауссовский размытый фрагментный шейдер в GLSL. Я понимаю основные концепции, лежащие в основе всего этого: свертка, разделение x и y с использованием линейности, несколько проходов для увеличения радиуса ...

У меня все еще есть несколько вопросов:

  • Какая связь между сигмой и радиусом?

    Я читал, что сигма эквивалентна радиусу, я не вижу, как сигма выражается в пикселях. Или «радиус» - это просто название сигмы, не связанное с пикселями?

  • Как выбрать сигму?

    Учитывая, что я использую несколько проходов для увеличения сигмы, как выбрать хорошую сигму для получения сигмы, которую я хочу на любом данном проходе? Если полученная сигма равна квадратному корню из суммы квадратов сигм, а сигма эквивалентна радиусу, каков простой способ получить любой желаемый радиус?

  • Какой размер ядра подходит и как он связан с сигмой?

    Я видел, что большинство реализаций используют ядро ​​5x5. Это, вероятно, хороший выбор для быстрой реализации с достойным качеством, но есть ли другая причина выбрать другой размер ядра? Как сигма соотносится с размером ядра? Должен ли я найти лучшую сигму, чтобы коэффициенты вне моего ядра были незначительными и просто нормализовались?

LodeRunner
источник

Ответы:

21

Какая связь между сигмой и радиусом? Я читал, что сигма эквивалентна радиусу, я не вижу, как сигма выражается в пикселях. Или «радиус» - это просто название сигмы, не связанное с пикселями?

Здесь есть три вещи. Дисперсия, ( σ2 ), радиус и количество пикселей. Поскольку это двумерная гауссовская функция, имеет смысл говорить о ковариационной матрице . Как бы то ни было, эти три понятия слабо связаны.Σ

Прежде всего, двумерный гауссиан задается уравнением:

грамм(Z)знак равно1(2π)2|Σ|е-12(Z-μ)TΣ-1 (Z-μ)

Где - вектор-столбец, содержащий координаты и на вашем изображении. Итак, и вектор - столбца кодифицирующего средних вашей гауссовой функции, в и направлениях . x y z = [ x y ] μ x y μ = [ μ x μ y ]ZИксYZзнак равно[ИксY]μИксYμзнак равно[μИксμY]

Пример:

Теперь допустим, что мы установили ковариационную матрицу и . Я также установлю количество пикселей х . Кроме того, моя «сетка», в которой я оцениваю этот PDF, будет иметь значение от до как по и по . Это означает, что у меня разрешение сетки . Но это совершенно произвольно. С этими настройками я получу изображение функции плотности вероятности слева. Теперь, если я изменю «дисперсию» (на самом деле ковариацию), такую, чтоΣзнак равно[1001]μзнак равно[00]100100-1010ИксY10-(-10)100знак равно0.2Σзнак равно[9009] и оставьте все остальное таким же, я получаю изображение справа.

введите описание изображения здесь

Количество пикселей остается одинаковым для обоих, х , но мы изменили дисперсию. Предположим, что вместо этого мы проводим тот же эксперимент, но вместо этого используем х пикселей, но я все еще бегал от до . Тогда моя сетка имеет разрешение . Если я использую те же ковариации, что и раньше, я получаю это:1001002020-101010-(-10)20знак равно1

введите описание изображения здесь

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

Как выбрать сигму?

Выбор дисперсионной / ковариационной матрицы вашего фильтра Гаусса чрезвычайно зависит от приложения. Нет правильного ответа. Это все равно что спросить, какую полосу пропускания выбрать для фильтра. Опять же, это зависит от вашего приложения. Как правило, вы хотите выбрать гауссов фильтр, чтобы обнулить значительное количество высокочастотных компонентов в вашем изображении. Одна вещь, которую вы можете сделать, чтобы получить хорошую меру, это вычислить 2D DFT вашего изображения и наложить его коэффициенты на ваше 2D гауссовое изображение. Это скажет вам, какие коэффициенты в значительной степени наказываются.

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

Тарин Зияе
источник
1
Эти изображения были бы лучше, если бы они использовали последовательную цветовую карту. Самолет худший.
эндолит
@endolith "Лучше" зависит от приложения. Я не использую струю, когда требуется визуальная контрастная дискриминация. (Горячее лучше). Здесь, однако, сообщение находится в пределах гауссовского размера, так что с помощью jet не будет никакого вреда. И все же спасибо за ссылку.
Тарин Зияи
2
Это хорошо продуманный и действительно хорошо визуализированный ответ! Возьмите это верхнее левое изображение, например. Ясно, что такая комбинация дисперсии и размера ядра была бы расточительной, поскольку это ядро ​​100x100, где только центр 30x30 (~ 9%) не равен нулю.
Адам Смит
5

Параметра сигма достаточно, чтобы определить размытие по Гауссу с непрерывной точки зрения. Однако на практике изображения и ядра свертки являются дискретными. Как выбрать оптимальное дискретное приближение непрерывного гауссова ядра?

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

В идеале, можно выбрать значение для сигмы, а затем вычислить радиус, который позволяет точно представить соответствующее непрерывное ядро ​​Гаусса. Для данной ошибки аппроксимации, чем больше сигма, тем больше должен быть радиус.

Интересно, что это может стать очень сложным, чтобы понять это правильно. При построении гауссовой матрицы лучшее решение для выборки непрерывного ядра или есть лучшие приближения? Как нормализовать вычисленное дискретное ядро ​​для учета усечения? и т.п.

В качестве ссылки, в Mathematica функция GaussianMatrix предлагает несколько способов вычисления гауссовой дискретной матрицы, например, с использованием дискретного приближения Бесселя. По умолчанию радиус = 2 * сигма, что означает, что при сигме = 1 матрица будет 5x5.

Матиас Одисио
источник
Это довольно старый вопрос. Но разве радиус 2 * сигма не приведет к матрице 9x9?
Бредовая логика
@DelusionalLogic с sigma = 1, radius = 2, поэтому матрица будет иметь размер 4, но ей нужен нечетный размер, поэтому размер 5x5. По крайней мере, так я это понимаю ..
Мика,
Если радиус равен 2, окрестность расширяет центральный пиксель на 2 пикселя влево, 2 вправо и т. Д. Это просто соглашение, которое использует Mathematica.
Матиас Одисио
2

Оказывается, что строки треугольника Паскаля очень хорошо аппроксимируют гауссиану и имеют практическое преимущество, заключающееся в том, что они имеют целочисленные значения, сумма которых равна степени 2 (мы можем хранить эти значения в точности как целые числа, значения с фиксированной запятой или числа с плавающей запятой). Например, скажем, мы хотим построить гауссово ядро ​​7x7, которое мы можем сделать, используя 7-ю строку треугольника Паскаля следующим образом:

введите описание изображения здесь

Обратите внимание, что этот фильтр оказывает минимальное влияние на углы, оставаясь целочисленным. Вы можете использовать среднее значение 20/64, чтобы определить соответствующую сигму стандартного отклонения, которая в этом случае равна 64 / (20 * sqrt (2 * pi)) = 1,276 для приближенного гауссиана. Вы можете построить график Гаусса, чтобы увидеть, что это отлично подходит.

Таким образом, хорошей отправной точкой для определения разумного стандартного отклонения для ядра Гаусса является треугольник Паскаля ( биномиальные коэффициенты ) - для фильтра (N + 1) x (N + 1), соответствующего описанному выше использованию конструкции

введите описание изображения здесь

GaussianMatrix [3] Wolfram Alpha просто использует r / 2 = 1,5. Как ни странно, GaussianMatrix [{3,1.276}] не дает того же 2D-фильтра, что и мой, и не является следующим для x, y между -3 и 3:

введите описание изображения здесь

Я не уверен, почему нет? Мой 2D-фильтр отлично подходит.

wcochran
источник