Saya tahu pertanyaan ini mungkin tidak terlalu relevan dengan pemrograman, tetapi jika saya tidak mengerti teori di balik pemrosesan gambar saya tidak akan pernah bisa mengimplementasikan sesuatu dalam praktiknya.
Jika saya benar, filter Gaussian berbelit-belit dengan gambar untuk pengurangan noise karena mereka menghitung rata-rata lingkungan piksel yang ditimbang dan mereka sangat berguna dalam deteksi tepi, karena Anda dapat menerapkan blur dan mendapatkan gambar pada saat yang sama dengan hanya berbelit-belit dengan turunan dari fungsi Gaussian.
Tetapi adakah yang bisa menjelaskan saya, atau memberi saya beberapa referensi tentang bagaimana mereka dihitung?
Misalnya detektor tepi Canny berbicara tentang filter Gaussian 5x5, tetapi bagaimana mereka mendapatkan angka-angka tertentu? Dan bagaimana mereka beralih dari konvolusi kontinu ke perkalian Matriks?
Jawaban:
Agar operasi ini berfungsi, Anda perlu membayangkan bahwa gambar Anda dibentuk kembali sebagai vektor. Kemudian, vektor ini dikalikan di sebelah kirinya oleh matriks konvolusi untuk mendapatkan gambar yang kabur. Perhatikan bahwa hasilnya juga merupakan vektor dengan ukuran yang sama dengan input, yaitu gambar dengan ukuran yang sama.
Setiap baris matriks konvolusi sesuai dengan satu piksel pada gambar input. Ini berisi bobot kontribusi semua piksel lain dalam gambar ke mitra kabur dari piksel yang dipertimbangkan.
Ilustrasi visual dari proses yang berkaitan erat (konvolusi + pengurangan) dapat ditemukan di posting blog ini (dari blog pribadi saya).
sumber
Untuk aplikasi ke gambar atau jaringan konvolusi, untuk lebih efisien menggunakan pengganda matriks dalam GPU modern, input biasanya dibentuk kembali menjadi kolom-kolom matriks aktivasi yang kemudian dapat dikalikan dengan beberapa filter / kernel sekaligus.
Lihat tautan ini dari Stan2's CS231n, dan gulir ke bawah ke bagian "Implementasi sebagai Penggandaan Matriks" untuk detailnya.
Proses ini bekerja dengan mengambil semua tambalan lokal pada gambar input atau peta aktivasi, yang akan dikalikan dengan kernel, dan merentangkannya ke dalam kolom matriks X baru melalui operasi yang biasa disebut im2col. Kernel juga diregangkan untuk mengisi baris-baris dari matriks bobot W sehingga ketika melakukan operasi matriks W * X, matriks yang dihasilkan Y memiliki semua hasil konvolusi. Akhirnya, matriks Y harus dibentuk kembali lagi dengan mengubah kolom kembali menjadi gambar dengan operasi yang biasanya disebut cal2im.
sumber
Konvolusi dalam domain Waktu sama dengan perkalian matriks dalam domain frekuensi dan sebaliknya.
Penyaringan setara dengan konvolusi dalam domain waktu dan karenanya penggandaan matriks dalam domain frekuensi.
Adapun peta atau topeng 5x5, mereka datang dari mendiskreditkan operator canny / sobel.
sumber
Saya menulis sebuah fungsi yang memecahkan ini dalam StackOverflow Q2080835 GitHub Repository saya (Lihat
CreateImageConvMtx()
).Sebenarnya fungsi tersebut dapat mendukung bentuk konvolusi yang Anda inginkan -
full
,same
danvalid
.Kode tersebut adalah sebagai berikut:
Saya juga membuat fungsi untuk membuat Matriks Penyaringan Gambar (Ide serupa dengan MATLAB
imfilter()
):Kode divalidasi terhadap MATLAB
imfilter()
.Kode lengkap tersedia di Repositori GitHub StackOverflow Q2080835 saya .
sumber