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

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

Однако у меня все еще есть несколько вопросов:

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

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

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

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

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

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


person LodeRunner    schedule 24.07.2013    source источник
comment
Поскольку это не ограничивается GLSL, возможно, стоит попробовать сайт обработки сигналов на StackExchange.   -  person Brett Hale    schedule 25.07.2013
comment
Спасибо. Мне было сложно пометить этот вопрос для Stack Overflow.   -  person LodeRunner    schedule 25.07.2013


Ответы (1)


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

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

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

Это определит, сколько размытия вы хотите, что соответствует размеру ядра, которое будет использоваться в свертке. Большие значения приведут к большему размытию.

Реализация NVidia использует размер ядра int (sigma * 3).

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

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

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

Вы можете опубликовать код для более подробного объяснения. У NVidia есть довольно хорошая глава о том, как создать гауссовское ядро ​​. Посмотрите на Пример 40-1.

person Aaron Hagan    schedule 25.07.2013