Gaussian Blur - Standar Deviasi, Radius dan Ukuran Kernel

18

Saya telah menerapkan shader fragmen gaussian blur di GLSL. Saya memahami konsep utama di balik semua itu: konvolusi, pemisahan x dan y menggunakan linearitas, beberapa lintasan untuk meningkatkan radius ...

Saya masih punya beberapa pertanyaan:

  • Apa hubungan antara sigma dan jari-jari?

    Saya telah membaca bahwa sigma setara dengan jari-jari, saya tidak melihat bagaimana sigma diekspresikan dalam piksel. Atau "radius" hanya nama untuk sigma, tidak terkait dengan piksel?

  • Bagaimana saya memilih sigma?

    Mengingat saya menggunakan beberapa pass untuk meningkatkan sigma, bagaimana cara saya memilih sigma yang baik untuk mendapatkan sigma yang saya inginkan pada setiap pass yang diberikan? Jika sigma yang dihasilkan sama dengan akar kuadrat dari jumlah kuadrat sigma dan sigma setara dengan jari-jari, apa cara mudah untuk mendapatkan jari-jari yang diinginkan?

  • Apa ukuran yang baik untuk kernel, dan bagaimana hubungannya dengan sigma?

    Saya telah melihat sebagian besar implementasi menggunakan kernel 5x5. Ini mungkin pilihan yang baik untuk implementasi cepat dengan kualitas yang layak, tetapi apakah ada alasan lain untuk memilih ukuran kernel lain? Bagaimana sigma berhubungan dengan ukuran kernel? Haruskah saya menemukan sigma terbaik sehingga koefisien di luar kernel saya dapat diabaikan dan hanya menjadi normal?

LodeRunner
sumber

Jawaban:

21

Apa hubungan antara sigma dan jari-jari? Saya telah membaca bahwa sigma setara dengan jari-jari, saya tidak melihat bagaimana sigma diekspresikan dalam piksel. Atau "radius" hanya nama untuk sigma, tidak terkait dengan piksel?

Ada tiga hal yang berperan di sini. Varians, ( σ2 ), jari-jari, dan jumlah piksel. Karena ini adalah fungsi gaussian 2 dimensi, masuk akal untuk berbicara tentang matriks kovariansΣ . Namun demikian, ketiga konsep tersebut memiliki hubungan yang lemah.

Pertama-tama, gaussian 2-D diberikan oleh persamaan:

g(z)=1(2π)2|Σ|e12(zμ)TΣ1 (zμ)

Di mana adalah vektor kolom yang berisi koordinat x dan y pada gambar Anda. Jadi, z = [ x y ] , dan μ adalah vektor kolom kodifikasi mean fungsi gaussian Anda, di x dan y arah μ = [ μ x μ y ] .zxyz=[xy]μxyμ=[μxμy]

Contoh:

Sekarang, katakanlah kita menetapkan matriks kovarians , dan μ = [ 0 0 ] . Saya juga akan mengatur jumlah piksel menjadi 100 x 100 . Lebih jauh lagi, 'kisi' saya, tempat saya mengevaluasi PDF ini, akan berubah dari - 10 menjadi 10 , dalam x dan y . Ini berarti saya memiliki resolusi grid 10 - ( - 10 )Σ=[1001]μ=[00]1001001010xy. Tapi ini sepenuhnya arbitrer. Dengan pengaturan itu, saya akan mendapatkan probabilitas fungsi kepadatan gambar di sebelah kiri. Sekarang, jika saya mengubah 'varians', (sungguh, kovarians), sehinggaΣ=[ 9 0 0 9 ]dan menjaga semuanya tetap sama, saya mendapatkan gambar di sebelah kanan.10(10)100=0.2Σ=[9009]

masukkan deskripsi gambar di sini

1001002020101010(10)20=1

masukkan deskripsi gambar di sini

Ini adalah bagaimana Anda harus memahami interaksi antara variabel-variabel tersebut. Jika Anda menginginkan kode tersebut, saya dapat mempostingnya di sini juga.

Bagaimana saya memilih sigma?

Pilihan varians / kovarians-matriks dari filter gaussian Anda sangat tergantung pada aplikasi. Tidak ada jawaban yang 'benar'. Itu seperti menanyakan bandwidth apa yang harus dipilih untuk filter. Sekali lagi, itu tergantung pada aplikasi Anda. Biasanya, Anda ingin memilih filter gaussian sehingga Anda menghapus komponen frekuensi tinggi dalam gambar Anda. Satu hal yang dapat Anda lakukan untuk mendapatkan ukuran yang baik, adalah menghitung DFT 2D gambar Anda, dan overlay koefisiensi dengan gambar gaussian 2D Anda. Ini akan memberi tahu Anda apa koefisien yang sedang dihukum berat.

Misalnya, jika gambar gaussian Anda memiliki kovarian yang begitu luas sehingga mencakup banyak koefisien frekuensi tinggi dari gambar Anda, maka Anda perlu membuat elemen kovariannya lebih kecil.

Tarin Ziyaee
sumber
1
Gambar-gambar itu akan lebih baik jika mereka menggunakan colormap berurutan. jet adalah yang terburuk.
endolith
@endolith "Lebih baik" tergantung pada aplikasi. Saya tidak menggunakan jet saat diskriminasi kontras visual diperlukan. (Panas lebih baik). Namun di sini, pesannya berada dalam ukuran gaussian, jadi tidak ada salahnya dilakukan dengan jet. Terima kasih untuk tautannya.
Tarin Ziyaee
2
Ini adalah jawaban yang dipikirkan dengan baik dan divisualisasikan dengan sangat baik! Ambil gambar kiri atas itu, misalnya. Jelas bahwa kombinasi varian dan ukuran kernel akan sia-sia, karena ini adalah kernel 100x100 di mana hanya center 30x30 (~ 9%) yang bukan nol.
Adam Smith
4

Parameter sigma cukup untuk mendefinisikan blur Gaussian dari sudut pandang kontinu. Namun dalam praktiknya, gambar dan kernel konvolusi terpisah. Bagaimana memilih perkiraan diskrit optimal dari kernel Gaussian kontinu?

Perkiraan diskrit akan lebih dekat ke kernel Gaussian kontinu ketika menggunakan radius yang lebih besar. Tetapi ini mungkin datang dengan biaya tambahan durasi perhitungan.

Idealnya, seseorang akan memilih nilai untuk sigma, kemudian menghitung radius yang memungkinkan untuk mewakili dengan setia kernel Gaussian kontinu yang sesuai. Untuk kesalahan perkiraan yang diberikan, semakin besar sigma, semakin besar radiusnya.

Menariknya, ini bisa menjadi sangat rumit untuk memperbaikinya. Ketika membangun matriks Gaussian, apakah solusi terbaik untuk sampel kernel kontinu atau ada perkiraan yang lebih baik? Bagaimana cara menormalkan kernel diskrit yang dihitung untuk memperhitungkan pemotongan? dll.

Sebagai referensi, dalam Mathematica fungsi GaussianMatrix menampilkan beberapa cara untuk menghitung matriks diskrit Gaussian, misalnya menggunakan pendekatan Bessel diskrit. Secara default, radius = 2 * sigma, yang berarti bahwa dengan sigma = 1, matriks akan menjadi 5x5.

Matthias Odisio
sumber
Ini pertanyaan yang cukup lama. Tapi bukankah jari-jari 2 * sigma menghasilkan matriks yang 9x9?
Delusional Logic
@DelusionalLogic dengan sigma = 1, radius = 2, sehingga matriks akan memiliki ukuran 4 tetapi membutuhkan ukuran aneh sehingga ukuran 5x5. Setidaknya begitulah aku memahaminya ..
Micka
Jika jari-jarinya 2, lingkungan memanjang piksel tengah 2 piksel ke kiri, 2 ke kanan, dll. Itu hanya konvensi yang digunakan Mathematica.
Matthias Odisio
2

Ternyata deretan Pascal's Triangle mendekati Gaussian dengan cukup baik dan memiliki keuntungan praktis memiliki nilai integer yang jumlahnya adalah kekuatan 2 (kita dapat menyimpan nilai-nilai ini tepat sebagai integer, nilai titik tetap, atau mengapung). Sebagai contoh, katakanlah kita ingin membangun 7x7 Gaussian Kernel kita dapat melakukannya menggunakan baris ke-7 dari segitiga Pascal sebagai berikut:

masukkan deskripsi gambar di sini

Perhatikan bahwa filter ini memiliki pengaruh minimum di sudut-sudutnya sementara sisanya bernilai integer. Anda dapat menggunakan nilai tengah 20/64 untuk menentukan sigma standar deviasi yang sesuai yaitu 64 / (20 * sqrt (2 * pi)) = 1.276 untuk Gaussian yang diperkirakan dalam kasus ini. Anda dapat membuat grafik Gaussian untuk melihat ini sangat cocok.

Jadi titik awal yang baik untuk menentukan standar deviasi yang wajar untuk Gaussian Kernel berasal dari Segitiga Pascal (alias Koefisien Binomial ) - untuk filter (N + 1) x (N + 1) yang sesuai dengan penggunaan konstruksi di atas

masukkan deskripsi gambar di sini

GaussianMatrix dari Wolfram Alpha [3] hanya menggunakan r / 2 = 1.5. Anehnya, GaussianMatrix [{3,1.276}] tidak menghasilkan filter 2D yang sama dengan tambang dan bukan yang berikut untuk x, y antara -3 dan 3:

masukkan deskripsi gambar di sini

Saya tidak yakin mengapa tidak? Filter 2D saya sangat pas.

wcochran
sumber