Розмиття Гаусса - стандартне відхилення, радіус і розмір ядра


19

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

У мене все ще є кілька питань:

  • Який зв’язок між сигмою та радіусом?

    Я читав, що сигма еквівалентна радіусу, не бачу, як сигма виражається в пікселях. Або "радіус" - це лише назва сигми, не пов'язане з пікселями?

  • Як вибрати сигму?

    Зважаючи на те, що я використовую кілька пропусків для збільшення сигми, як я можу вибрати хорошу сигму для отримання потрібної сигми в будь-який момент часу? Якщо отримана сигма дорівнює квадратному кореню суми квадратів сигм і сигм, еквівалентних радіусу, то який простий спосіб отримати бажаний радіус?

  • Який розмір ядра хороший і як він відноситься до сигми?

    Я бачив, що більшість реалізацій використовують ядро ​​5x5. Це, мабуть, хороший вибір для швидкої реалізації з гідною якістю, але чи є ще одна причина вибрати інший розмір ядра? Як сигма стосується розміру ядра? Чи варто мені знайти найкращу сигму, щоб коефіцієнти поза моїм ядром були незначними і просто нормалізувалися?

Відповіді:


21

Який зв’язок між сигмою та радіусом? Я читав, що сигма еквівалентна радіусу, не бачу, як сигма виражається в пікселях. Або "радіус" - це лише назва сигми, не пов'язане з пікселями?

Тут грають три речі. Дисперсія, ( ), радіус та кількість пікселів. Оскільки це двовимірна гауссова функція, має сенс говорити про матрицю коваріації \ boldsymbol {\ Sigma} . Хоч як би це не було, ці три поняття слабко пов'язані між собою. Σσ2Σ

Перш за все, 2-D гаусса задається рівнянням:

г(z)=1(2π)2|Σ|е-12(z-мк)ТΣ-1 (z-мк)

Де - вектор стовпця, що містить координати і на вашому зображенні. Отже, , а - вектор стовпця, що кодує середнє значення вашої гауссової функції, у напрямках та . x y z = [ x y ] μ x y μ = [ μ x μ y ]zхуz=[ху]мкхумк=[мкхмку]

Приклад:

Тепер скажемо, що ми встановлюємо коваріаційну матрицю , і . Я також встановлю кількість пікселів на х . Крім того, моя "сітка", де я оцінюю цей PDF, збирається від до , як і . Це означає, що у мене є роздільна здатність сітки . Але це абсолютно довільно. За допомогою цих налаштувань я отримаю зображення функції щільності ймовірності зліва. Тепер, якщо я зміню 'дисперсію', (справді коваріація), така, щоΣ=[1001]мк=[00]100100-1010ху10-(-10)100=0,2Σ=[9009] а все інше залишиться однаковим, я отримую зображення праворуч.

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

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

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

Ось як ви повинні зрозуміти взаємодію між цими змінними. Якщо ви хочете код, я можу розмістити його і тут.

Як вибрати сигму?

Вибір дисперсії / коваріації-матриці вашого гауссового фільтра залежить від застосування. Немає правильної відповіді. Це як запитати, яку пропускну здатність слід вибрати для фільтра. Знову ж таки, це залежить від вашої заявки. Зазвичай ви хочете вибрати гауссовий фільтр таким, що ви знімаєте значну кількість високочастотних компонентів на зображенні. Одне, що ви можете зробити, щоб отримати хороший показник, - обчислити 2D DFT вашого зображення і накласти його коефіцієнти на 2D-зображення гаусса. Це підкаже, які кооперативи зазнають серйозних санкцій.

Наприклад, якщо ваше гауссове зображення має коваріацію настільки широкою, що охоплює багато високочастотних коефіцієнтів вашого зображення, то вам потрібно зменшити його елементи коваріації.


1
Ці зображення були б краще, якби вони використовували послідовну кольорову карту. струмінь - найгірший.
ендоліт

@endolith "Краще" залежить від програми. Я не використовую струмінь, коли потрібна візуальна контрастна дискримінація. (Гаряче - краще). Тут, однак, повідомлення знаходиться в межах гаусса, тому ніякої шкоди, завданої струменем. Дякуємо за посилання.
Тарін Зіяее

2
Це гарно продумана і справді добре візуалізована відповідь! Візьміть, наприклад, верхнє ліве зображення, наприклад. Зрозуміло, що ця комбінація дисперсії та розміру ядра була б марною, оскільки це ядро ​​100x100, де лише центр 30x30 (~ 9%) не дорівнює нулю.
Адам Сміт

5

Сигми параметра достатньо для визначення розмитості Гаусса з неперервної точки зору. На практиці, однак, зображення та згортання ядер дискретні. Як вибрати оптимальне дискретне наближення безперервного ядра Гаусса?

Дискретна апроксимація буде ближче до безперервного ядра Гаусса при використанні більшого радіуса. Але це може статися ціною додаткової тривалості обчислень.

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

Цікаво, що це може стати дуже складним, щоб виправити це правильно. Під час побудови матриці Гаусса найкраще рішення для вибірки суцільного ядра чи кращі наближення? Як нормалізувати обчислене дискретне ядро ​​для обліку усічення? тощо.

В якості прикладу, в Mathematica функція GaussianMatrix містить кілька способів обчислення дискретної матриці Гаусса, наприклад, з використанням дискретного наближення Бесселя. За замовчуванням радіус = 2 * сигма, що означає, що при sigma = 1 матриця буде 5x5.


Це досить старе питання. Але хіба радіус 2 * сигми не призведе до матриці 9x9?
Delusional Logic

@DelusionalLogic із сигмою = 1, радіус = 2, тому матриця матиме розмір 4, але потребує непарного розміру, тому розмір 5x5. Принаймні, так я це розумію ..
Micka

Якщо радіус дорівнює 2, околиця розширює центральний піксель на 2 пікселі зліва, 2 праворуч тощо. Це лише умова, яку використовує Mathematica.
Маттіас Одісіо

2

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

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

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

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

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

GaussianMatrix Вольфрама Альфи [3] просто використовує r / 2 = 1,5. Як не дивно, GaussianMatrix [{3,1276}] не дає такого ж двовимірного фільтра, як мій, і не є таким для x, y між -3 і 3:

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.