Friday 7 July 2017

Moving Average As Konvolution


Blurring for Beginners Pendahuluan Ini adalah tutorial singkat tentang teknik blur untuk pemula. Ketika saya mempelajari hal ini, hanya ada sedikit materi yang berguna. Itu tentu saja tidak benar - ada banyak materi, tapi setengahnya terlalu sederhana dan separuh lainnya mulai Biarkan T menjadi fungsi vektor yang dievaluasi selama interval setengah terbuka. Dan penuh dengan persamaan multi-line yang sangat menakutkan dengan simbol sigma dan benda-benda itu. Artikel ini dimaksudkan untuk memperbaiki itu. Saya berbicara tentang berbagai jenis kabur dan efek yang bisa Anda gunakan untuk mereka, dengan kode sumber di Jawa. Sebuah Disclaimer Setiap kali kabur disebutkan, selalu ada seseorang yang mengatakan Hey Thats bukan sebuah gerakan nyata yang kabur, atau menulis surat-surat marah dengan tinta hijau yang mengeluh bahwa matematika itu meragukan atau bahwa ada cara yang lebih cepat untuk melakukannya dengan menggunakan register sponglerizer di HAL. -9000. Abaikan orang-orang ini. Ini adalah topik yang besar, dan artikel ini hanya untuk pemula (yang dengan bangga bisa saya katakan bahwa saya adalah seseorang). Yang penting adalah Anda mendapatkan hasil yang Anda inginkan, dan jika hasil yang Anda inginkan membutuhkan matematika yang meragukan, maka jadilah itu. Jika hasilnya youre bertujuan untuk terlihat mengerikan untuk saya, maka itu baik-baik saja, asalkan mereka terlihat baik untuk Anda. Penafian lain Ada source code di Jawa untuk semua yang saya bicarakan dengan baik di sini. Saya tidak membuat klaim bahwa ini dioptimalkan dengan cara apapun - saya telah memilih kesederhanaan dari kecepatan di mana-mana dan mungkin Anda akan berhasil membuat sebagian besar dari hal ini berjalan lebih cepat dengan sedikit usaha. Anda bisa menggunakan kode sumber untuk apapun yang Anda inginkan, termasuk tujuan komersial, tapi tidak ada tanggung jawab. Jika sistem pembangkit tenaga nuklir atau sistem rudal Anda gagal karena kabur yang tidak semestinya, itu bukan salah saya. Apa yang Mengaburkan Kita semua tahu apa yang kabur, jangan kita hal yang terjadi saat kamera Anda tidak fokus atau anjing mencuri kacamata Anda. Apa yang terjadi adalah bahwa apa yang harus dilihat sebagai titik tajam akan diolesi, biasanya ke bentuk disk. Dalam istilah gambar, ini berarti setiap piksel dalam gambar sumber disebarkan dan dicampur ke piksel sekitarnya. Cara lain untuk melihat ini adalah bahwa setiap piksel pada gambar tujuan dibuat dari campuran piksel sekitarnya dari gambar sumber. Operasi yang kita butuhkan untuk ini disebut konvolusi. Ini terdengar rumit tapi hanya karena matematikawan suka membuat hal-hal yang terdengar rumit untuk mempertahankan keajaiban dan menjaga agar dana tetap masuk. Nah, Im ke mereka dan saya dapat mengungkapkan bahwa konvolusi tidak begitu rumit (pada tingkat saya) . Cara kerjanya adalah ini: kita bayangkan meluncur sejumlah angka dari gambar kita. Array ini disebut kernel konvolusi. Untuk setiap piksel pada gambar, kami mengambil nomor yang sesuai dari kernel dan piksel yang mereka lewati, memperbanyaknya bersama-sama dan menambahkan semua hasilnya bersamaan untuk membuat piksel baru. Sebagai contoh, bayangkan kita ingin melakukan blur yang benar-benar sederhana dimana kita rata-rata mengumpulkan setiap pixel dan delapan tetangga terdekatnya. Kernel yang kita butuhkan adalah: Perhatikan bahwa semua ini menambahkan hingga 1, yang berarti gambar yang dihasilkan akan sama terangnya dengan aslinya. Tanpa basa-basi lagi, mari kita blur gambar di Jawa. Semua hal konvolusi terdengar rumit untuk diterapkan, tapi untungnya Jawa hadir dengan operator built-in dan siap pakai untuk melakukan hal itu. Saya berbicara ConvolveOp di sini. Heres kode: Fantastic Sebuah gambar buram Its tidak sangat kabur sekalipun. Mari kita lakukan blur yang sangat besar seperti ini: Hmmmmmm. Well thats tidak begitu baik. Tidak hanya butuh waktu yang sangat lama, tapi hasilnya sedikit aneh - semuanya terlihat bagus, semacam persegi, dan apa yang telah terjadi di sekitar tepian First the edge: ConvolveOp adalah hal yang nakal-pamby yang menakutkan Jatuh dari tepi gambar. Jika kernel akan tumpang tindih dengan tepi gambar, itu hanya menyerah dan hanya meninggalkan pixel tidak berubah. Anda bisa mengubah ini dengan melewatkan EDGEZEROFILL dan bukan EDGENOOP, tapi itu lebih buruk lagi - piksel di sekeliling tepi hanya bisa diset ke nol dan hilang secara efektif. Apa yang harus kita lakukan Nah, kita bisa memberi bayangan di sekeliling tepinya sebelum mengaburkan dan memotong hasilnya, tapi itu hanya memberi, dan selain itu kita tidak bisa belajar apapun. Sebagai gantinya, tulislah dengan baik, operator tanpa rasa takut dan nakal yang tidak takut pada tepinya. Nah, sebutlah ConvolveFilter untuk membedakannya dari ConvolveOp. Saya tidak akan membahas rincian sumber dalam artikel ini - tidak cukup banyak waktu atau ruang dan kami memiliki lebih banyak filter untuk ditulis, namun Anda dapat mendownload atau melihat sumbernya dan harus cukup jelas. Sekarang masalah kuadrat: Alasan semuanya terlihat persegi adalah karena apa yang dilakukan di sini disebut kotak kabur - kernel kita berbentuk seperti kotak, seolah-olah menggunakan kamera yang memiliki aperture persegi. Kebetulan, jangan biarkan orang mengatakan kepada Anda bahwa kotak buram tidak ada gunanya - sebenarnya jika Anda mensimulasikan bayangan yang dilemparkan oleh cahaya persegi, persis apa yang Anda inginkan. Bagaimanapun, mereka akan berguna lebih lanjut. Hal lain: Jangan bingung - Im menggunakan istilah kotak kabur untuk merujuk pada bentuk kernel, bukan profilnya, yang akan saya sebut saringan kotak. Lebih lanjut tentang ini nanti. Untuk mendapatkan kabur yang lebih realistis, apa yang seharusnya kita lakukan adalah menggunakan sebuah kernel berbentuk lingkaran. Ini mensimulasikan lebih baik apa yang kamera sebenarnya tidak. Itu lebih baik. Nah kembali lagi nanti, tapi pertama pengalihan kembali ke kotak buram. Weve memecahkan masalah pixel tepi, tapi kabur kita masih berjalan sangat lambat, dan keadaan akan semakin memburuk. Masalahnya adalah bahwa jumlah perkalian dalam konvolusi akan naik seperti kuadrat jari-jari kernel. Dengan kernel 100x100, akan melakukan 10000 mengalikan dan menambahkan per pixel (approx). Bagaimana kita bisa mengatasi hal ini Ternyata ada banyak cara untuk mengatasi hal ini daripada mungkin saya punya waktu untuk menulis tentang, atau bahkan repot-repot untuk melihat. Salah satu cara yang akan saya sebutkan dengan cepat sebelum menyapunya di bawah karpet adalah: Anda bisa membuat kotak buram dengan mengecilkan gambar Anda, mengaburkannya dan menskalakannya lagi. Ini mungkin baik untuk tujuan Anda, dan Anda harus mengingatnya. Satu masalah adalah bahwa hal itu tidak bernyawa dengan baik, tapi mungkin tidak menjadi perhatian Anda. Mari kita lihat kotak itu buram lagi: Ternyata ada beberapa cara mudah untuk mempercepatnya. Pertama, ternyata kotak blur itu bisa dipisah. Ini berarti kita bisa melakukan blur 2D dengan melakukan dua blur 1D, sekali pada arah horisontal dan sekali dalam arah vertikal. Ini jauh lebih cepat daripada melakukan blur 2D karena waktu yang dibutuhkan naik sebanding dengan ukuran kernel, bukan sebagai kuadratnya. Kedua, Pikirkan tentang jendela yang meluncur di atas gambar. Saat kita memindahkannya dari kiri ke kanan, piksel masuk ke tepi kanan dan ditambahkan ke piksel total dan pada saat yang sama piksel meninggalkan tepi kiri dan dikurangi dari total. Yang perlu kita lakukan hanyalah melakukan penambahan dan pengurangan untuk memasukkan dan meninggalkan piksel pada setiap langkah alih-alih menambahkan semua piksel di jendela. Kita hanya perlu menyimpan satu set run total yang merupakan lebar atau tinggi kernel. Ini memberikan peningkatan kecepatan yang sangat besar dengan biaya karena harus menulis beberapa kode. Untungnya, saya telah menulis kode untuk Anda, jadi Anda menang semua bulat. Kita butuh dua lintasan, sekali untuk mengaburkan secara horisontal dan sekaligus vertikal. Kode untuk ini tentu saja sangat berbeda. Tapi tunggu ada trik yang bisa kita lakukan yang memungkinkan kita hanya menulis kode satu kali. Jika kita menulis fungsi blurring yang melakukan blur horizontal namun menulis gambar outputnya dialihkan, maka kita bisa menyebutnya dua kali. Jalur pertama mengaburkan secara horisontal dan transposisi, jalur kedua sama, namun karena gambarnya sekarang dialihkan, benar-benar melakukan blur vertikal. Transposisi kedua membuat gambar dengan benar naik lagi dan voila - kotak yang sangat cepat kabur. Cobalah di applet ini: Dan heres source code. Anda mungkin telah memperhatikan bahwa kita hanya menggunakan radius bilangan bulat sejauh ini yang membuatnya mudah untuk mengetahui indeks array untuk mengaburkan. Kita dapat memperpanjang teknik untuk melakukan pengaburan sub-pixel (yaitu radius non-integral) hanya dengan interpolasi linier antara nilai array. Kode sumber saya tidak melakukan ini, tapi mudah untuk menambahkan. Gaussian Blur Sekarang waktunya untuk mengatasi masalah blur dan blur persegi pada saat yang bersamaan. Untuk menyingkirkan tampilan persegi ke kabur, kita membutuhkan sebuah kernel berbentuk lingkaran. Sayangnya, trik yang kami gunakan untuk box blurs tidak bekerja dengan lingkaran tapi ada celah: Jika kernel memiliki profil yang benar - profil Gaussian - maka kita dapat melakukan blur 2D dengan melakukan dua pengaburan 1D, seperti yang kita lakukan dengan Kotak kabur Its tidak begitu cepat karena trik jendela geser tidak bekerja, tapi masih jauh lebih cepat daripada melakukan konvolusi 2D. Profil yang kita butuhkan adalah lonceng yang dikenal, atau kurva Gaussian yang telah Anda dengar: Heres beberapa kode untuk membuat kernel Gauss 1D untuk radius tertentu. Yang perlu kita lakukan adalah menerapkannya dua kali, sekali secara horisontal dan sekali secara vertikal. Sebagai bonus, saya telah membungkusnya di GaussianFilter agar mudah digunakan. Inilah sebabnya mengapa kabur Gaussian ditemukan di setiap paket grafis - jauh lebih cepat daripada jenis blur lainnya. Satu-satunya masalah adalah bahwa hal itu tidak terlalu realistis ketika datang untuk mensimulasikan lensa kamera, namun lebih pada hal itu nanti. Jika Anda ingin melakukan hal-hal seperti simulasi bayangan, maka Gaussian blur, atau bahkan kotak blur mungkin baik-baik saja. Ada tempat untuk semua efek ini - hanya karena mereka tidak realistis berarti mereka tidak berguna. The Gaussian blur jauh lebih cepat, tapi tempat di dekat secepat kotak buram kita lakukan sebelumnya. Kalau saja ada cara untuk menggabungkan keduanya. Saya membayangkan Anda sudah bisa menduga sekarang bahwa mungkin ada satu, jadi Sakitlah yang tidak menahan ketegangan lagi: Jika Anda membuat banyak kotak, hasilnya terlihat lebih dan lebih seperti kabut Gaussian. Sebenarnya, Anda bisa membuktikannya secara matematis jika Anda memiliki waktu luang (tapi jangan beritahu saya bagaimana - saya tidak tertarik). Dalam prakteknya, 3 sampai 5 kotak kabur terlihat cukup bagus. Jangan hanya mengambil kata-kata saya untuk itu: Kotak kabur applet di atas memiliki slider Iterasi sehingga Anda bisa mencobanya sendiri. Alpha Channels Pengalihan cepat disini untuk membahas masalah yang sering muncul: Bayangkan Anda ingin mengaburkan bentuk yang berlatar belakang transparan. Anda punya gambar kosong, dan Anda menggambar bentuk di atasnya, lalu buram gambarnya. Tunggu - mengapa bit buram terlihat terlalu gelap Alasannya adalah bahwa kita akan mengaburkan setiap saluran secara terpisah, namun di mana saluran alfa nol (bit transparan), saluran merah, hijau dan biru nol atau hitam. Saat Anda melakukan blur, warna hitam bercampur dengan potongan buram dan Anda mendapatkan bayangan gelap. Solusinya adalah dengan premultiply gambar alpha sebelum kabur dan saat itu juga tidak. Tentu saja, jika gambar Anda sudah premultiplied, youre all set. Motion Blur Time untuk perubahan arah. Sejauh ini hanya berbicara tentang blur seragam, tapi ada tipe lain. Motion blur adalah blur yang Anda dapatkan saat sebuah benda (atau kamera) bergerak saat terpapar. Gambar menjadi kabur di sepanjang jalan yang jelas dari objek. Berikut ini hanya akan berbicara tentang simulasi motion blur pada gambar diam yang ada - melakukan motion blur dalam animasi adalah area yang berbeda. Yang juga hanya akan mengaburkan keseluruhan gambar - tidak akan mencoba dan mengaburkan objek dalam gambar. Kabar baiknya adalah bahwa weve sudah melakukan motion blur yang sederhana. Kembali ke kotak blur applet di atas dan atur radius horizontal menjadi, katakanlah 10, dan jari-jari vertikal ke nol. Ini memberi Anda gerakan horisontal yang bagus. Untuk beberapa tujuan, ini mungkin semua yang Anda butuhkan. Misalnya, salah satu cara untuk menghasilkan tekstur logam yang disikat adalah dengan mengambil gambar yang terdiri dari noise acak dan menerapkan motion blur. Jika kita ingin kabur ke arah selain horizontal atau vertikal, maka hal menjadi lebih rumit. Salah satu tekniknya adalah memutar gambar, kabur lalu memutar kembali. Apa yang baik di sini meskipun adalah untuk melakukannya dengan cara yang keras dan lambat. Yang perlu kita lakukan adalah melompati gambar, dan untuk setiap piksel, tambahkan semua piksel di sepanjang jalur gerakan. Untuk gerakan lurus blur, ini hanya berarti mengikuti garis lurus dari pixel, tapi Anda bisa mengikuti jalur wiggly jika Anda ingin mensimulasikan gamer kamera jarak jauh, katakanlah. Spin dan Zoom Blur Sekali kode untuk blur di tempat, adalah hal yang mudah untuk dimodifikasinya agar zoom dan spin blurs, atau bahkan kombinasi ketiganya. Ini hanya masalah mengikuti jalur yang benar untuk setiap piksel. Untuk kabur radial, ikuti saja jalan yang menuju pusat blur. Untuk putaran kabur, ikuti jalur tangensial. Cobalah di applet ini: Heres kode sumber untuk melakukan ketiga jenis motion blur ini: Faster Motion Blur Anda mungkin telah memperhatikan bahwa melakukan motion blur adalah bisnis yang cukup lambat - semua sinus dan kosinus benar-benar memperlambat segalanya. Jika tidak terlalu mengkhawatirkan kualitas, kita bisa mempercepatnya. Yang perlu kita lakukan adalah menambahkan bersama-sama banyak versi gambar yang telah diubah dengan cara yang cerdas. Bagian yang pandai adalah kita bisa melakukan motion blur 1 pixel dengan merata-ratakan gambar dan gambar yang sama diterjemahkan dengan satu pixel. Kita bisa melakukan blur 2-pixel dengan mengulanginya dengan gambar buram 1-pixel. Dengan mengulangi hal ini kita bisa melakukan kesalahan pada pixel N dalam log2 (N) operasi, yang jauh lebih baik daripada melakukannya dengan cara yang keras dan lambat. Zoom dan spin blurs bisa dilakukan dengan penskalaan dan rotasi alih-alih menerjemahkan. Satu filter akan melakukan ketiganya menggunakan AffineTransform. Cobalah di applet ini: Pergeseran Domain Ada cara lain untuk melakukan gerakan ini mengaburkan: Ingat, saya katakan bahwa Anda bisa melakukan gerakan linier blur dengan memutar gambar, melakukan kotak horizontal yang kabur dan berputar kembali. Nah, hal yang sama juga terjadi pada Zoom dan spin blurs, kecuali Anda butuh sesuatu yang lebih rumit daripada rotasi. Yang Anda butuhkan adalah transformasi kutub. Setelah Anda mengubah gambar Anda, kotak horisontal kabur adalah putaran saat Anda mengubah kembali, dan kotak vertikal akan memberi Anda blur zoom. Satu detail adalah bahwa Anda memerlukan kotak buram khusus yang membungkus tepinya jika tidak, Anda akan mendapatkan garis vertikal tajam pada gambar buram Anda dimana sudut spin harus membungkusnya. Blurring by Fourier Transform Gaussian blur sangat baik bila Anda menginginkan efek blur Gaussian itu, tapi bagaimana jika Anda menginginkan blur lensa yang tepat yang mensimulasikan aperture kamera yang sebenarnya Tonton film atau program TV untuk sementara waktu, terutama yang ditembak di malam hari dengan lampu. Di latar belakang, dan Anda akan melihat hal-hal yang tidak fokus membentuk bentuk disk, atau mungkin pentagons. Ada juga fenomena yang disebut mekar dimana bagian terang dari gambar membersihkan gambar, menjadi lebih terang dibandingkan dengan yang lainnya. Bentuk ini disebut Bokeh. Beberapa orang menyukainya dan beberapa orang membencinya. Kami tidak peduli apakah orang menyukainya atau membencinya, kami hanya ingin memperbanyaknya. Anda tidak akan mendapatkan bentuk disk dengan Gaussian blur - yang terlalu kabur sepanjang tepi. Yang perlu Anda lakukan menggunakan kernel konvolusi tajam yang bagus dalam bentuk aperture kamera Anda. Masalah yang akan Anda sajikan di sini adalah bahwa semua trik itu berkaitan dengan kernel yang dapat dipisahkan, kotak yang diurungkan kabur dan pekerjaan biasa seperti di sini - tidak ada kernel terpisah yang akan memberi Anda pentagon (mungkin, tidak - tidak ada matematikawan) - kembali ke Masalah lama dari waktu blur naik seperti kuadrat dari jari-jari buram. Jangan takut, kita bisa mengubah senjata matematika yang berat menjadi masalah. Saya tidak tahu bagaimana senjata berat itu bekerja, tapi saya bisa mengarahkannya. Senapan beratnya adalah Fourier Transforms. Saya tidak tahu bagaimana mereka bekerja karena saya tidak mendengarkan ceramah di universitas saya, tapi ada banyak hal yang dapat Anda temukan di Internet, walaupun praktis tidak praktis (yaitu dengan kode sumber) tentang masalah pengaburan. Dengan Fourier Transforms, Anda bisa membuat blur yang membutuhkan waktu yang tidak terpengaruh oleh radius blur (dalam praktiknya, berurusan dengan tepi gambar berarti ini tidak benar). Sayangnya, ini berarti untuk radius kecil, lamban, tapi Anda benar-benar menang dengan radius besar. Salah satu cara untuk mengatasi hal ini adalah dengan menggunakan konvolusi sederhana untuk jari-jari kecil, dan beralih ke Fourier Transforms saat Anda mencapai titik crossover pada waktunya, dengan asumsi Anda telah melakukan eksperimen untuk menentukan di mana letaknya. Tapi hati-hati, jika youre menghidupkan kabur, Anda harus memastikan bahwa Anda tidak mendapatkan artefak yang terlihat pada titik di mana Anda beralih algoritma - mata benar-benar bagus untuk melihat itu. Oleh karena itu, Anda dapat memilih untuk tetap menggunakan satu algoritma untuk keseluruhan animasi. Untuk gambar diam, tidak ada yang akan memperhatikannya. Sangat. Apakah itu benar-benar terlihat berbeda Tentunya, kita bisa lolos dengan Gaussian blur Well, Heres sebuah contoh yang akan membantu Anda mengambil keputusan. Prinsip di balik melakukan blur tidak terlalu sulit, meski nampaknya seperti sihir. Apa yang kita lakukan adalah mengambil gambar dan kernel, dan melakukan transformasi Fourier pada keduanya. Kami kemudian memperbanyak keduanya bersama-sama dan invers mengubah kembali. Ini sama persis dengan melakukan konvolusi panjang di atas (terlepas dari kesalahan pembulatan). Anda benar-benar tidak perlu tahu apa yang dilakukan transformasi Fourier untuk menerapkan ini, namun bagaimanapun, yang dilakukannya adalah mengubah gambar menjadi ruang frekuensi - gambar yang dihasilkan adalah representasi frekuensi spasial yang tampak aneh pada gambar. Kebalikannya, tentu saja, berubah kembali ke ruang angkasa. Eh, ruang Anggap saja seperti equalizer grafis untuk gambar. Anda bisa memikirkan mengaburkan gambar karena mengeluarkan frekuensi tinggi darinya, jadi bagaimana transformasi Fourier masuk ke gambar. Menerapkan ini sebenarnya cukup mudah, tapi ada banyak rincian buruk yang perlu dikhawatirkan. Pertama-tama kita membutuhkan beberapa fungsi untuk melakukan transformasi dan inversnya. Ini bisa ditemukan di kelas FFT. Ini sama sekali bukan implementasi super optimal - Anda dapat menemukan banyak dari mereka di tempat lain di Internet. Selanjutnya, kita perlu mengubah kernel menjadi gambar dengan ukuran yang sama dengan gambar yang kabur (saya yakin ada beberapa cara untuk menghindari hal ini, tapi saya tidak cukup tahu matematika - jika hanya Id yang mendengarkan ceramah tersebut). Kita juga perlu memberi tahu sumber gambar kita dengan jari-jari kabur, menduplikat piksel tepi karena sulit membuat FFT menghadapinya seperti ini. Sekarang, FFT bekerja pada bilangan kompleks, jadi kita perlu menyalin gambar dan kernel ke dalam array float. Kita bisa melakukan trik disini - gambar kita memiliki empat saluran (alpha, red, green dan blue) jadi kita perlu melakukan empat transformasi plus satu untuk kernel, membuat lima, tapi karena menggunakan bilangan kompleks kita bisa melakukan dua transformasi sekaligus. Dengan menempatkan satu saluran di bagian sebenarnya dari array dan satu saluran di bagian imajiner. Sekarang semuanya menjadi mudah, cukup ubah gambar dan kernelnya, komplekskan kalikannya bersama-sama dan invers transform dan kita lihat kembali, tapi terpecahkan dengan kernel. Satu detail kecil terakhir adalah proses transformasi melompati kuadran gambar sehingga kita perlu melepaskannya. Hanya satu detail kecil yang tersisa: FFT hanya bekerja pada gambar yang memiliki kekuatan 2 di setiap arah. Yang harus kita lakukan adalah menambahkan dua kali radius kabur ke lebar dan tinggi, temukan kekuatan tertinggi berikutnya dari 2 dan buat ukuran array kami. Untuk gambar besar ini memiliki beberapa masalah: Salah satunya adalah dengan menggunakan banyak memori. Ingatlah bahwa kita memiliki gambar kita dalam array float dan kita membutuhkan 6 dari susunan ini, yang masing-masing berukuran 4 kali lebih besar dari gambar ketika telah diperluas menjadi kekuatan dua. Mesin virtual Java Anda mungkin mengeluh pada Anda jika Anda mencoba ini pada gambar besar (saya tahu, saya telah mencoba). Masalah kedua adalah terkait: Hal-hal hanya pergi lebih lambat dengan gambar besar karena masalah memori caching. Jawabannya adalah membagi gambar menjadi ubin dan mengaburkan setiap ubin secara terpisah. Memilih ukuran genteng yang baik adalah pilihan masalah penelitian (yaitu saya havent telah repot-repot bereksperimen banyak), tapi rumit - kita perlu tumpang tindih ubin oleh radius blur jadi jika kita memilih ukuran genteng 256 dengan radius kabur 127 , Kawin saja kabur 4 pixel dengan masing-masing genteng. Cobalah di applet ini: Threshold Blurs Sesuatu yang sering dikehendaki adalah kabur yang mengaburkan bagian gambar yang sangat mirip namun tetap mempertahankan tepi yang tajam. Ini adalah krim kerut digital dan Anda bisa melihat ini di poster film manapun yang pernah dicetak - wajah-wajah bintang memiliki semua noda buruk yang disetrika tanpa gambar tampak buram. Seringkali ini sangat berlebihan sehingga aktor terlihat seperti waxworks atau tokoh yang menghasilkan komputer. Cara kita melakukan ini adalah dengan melakukan konvolusi biasa, namun hanya menghitung piksel sekitarnya yang serupa dengan pixel target. Secara khusus, kami memiliki ambang batas dan hanya menyertakan piksel dalam konvolusi jika berbeda dari piksel tengah kurang dari ambang batas. Sayangnya, jalan pintas yang kami ambil di atas tidak akan berfungsi di sini karena kami perlu menyertakan kumpulan piksel sekeliling yang berbeda untuk setiap piksel target, jadi kembali ke putaran penuh lagi. Sekarang, walaupun ini sangat meragukan, sebenarnya bekerja cukup baik untuk tetap melakukan dua resolusi 1D untuk kabur Gaussian yang lebih cepat daripada melakukan konvolusi 2D penuh, jadi itulah yang telah saya lakukan di sini. Merasa bebas untuk memodifikasi sumber untuk melakukan hal yang sama. Cobalah di applet ini: Variable Blurs Sejauh ini hanya berbicara tentang blur seragam - di mana jari-jari buram sama pada setiap titik. Untuk beberapa tujuan, bagus untuk memiliki kabur yang memiliki radius berbeda pada setiap titik pada gambar. Salah satu contohnya adalah mensimulasikan kedalaman lapangan: Anda bisa mengambil gambar yang fokus di seluruh dan menerapkan variabel blur padanya agar bagian terlihat tidak fokus. Kedalaman lapangan yang sebenarnya lebih rumit dari pada ini karena objek yang berada di belakang objek lain tidak boleh menerima blur dari objek di depan, tapi abaikan saja dan serahkan ke profesional. Sekarang, trik mewah kami di atas arent akan membantu kita banyak di sini karena segala sesuatu melibatkan precalculating kernel atau bergantung pada radius blur yang sama pada gambar dan pada pandangan pertama sepertinya tidak ada pilihan selain kembali pada konvolusi penuh di Setiap pixel, hanya kali ini yang jauh lebih buruk karena kernel mungkin telah berubah dari pixel sebelumnya. Namun, semua tidak hilang. Ingat trik itu dengan kotak yang buram di mana kita hanya menambahkan piksel saat mereka memasuki kernel dan menguranginya saat mereka pergi. Sepertinya ini biasa dilakukan dalam kasus radius variabel karena harus tetap total untuk setiap radius yang mungkin, namun ada modifikasi Kita bisa membuat trik yang memungkinkan kita menarik secara ajaib jumlah total radius dengan hanya satu pengurangan. Apa yang kita lakukan adalah melakukan preproses gambar dan mengganti setiap piksel dengan jumlah semua piksel ke kiri. Dengan begitu ketika kita ingin menemukan total semua pixel antara dua titik di scanline, kita hanya perlu mengurangi yang pertama dari yang kedua. Hal ini memungkinkan kita untuk melakukan blur variabel cepat menggunakan versi modifikasi kode blur box diatas. Berurusan dengan tepi sedikit lebih rumit karena hanya mengurangkan total yang tidak bekerja untuk piksel di luar tepi, tapi ini adalah detail kecil. Kita juga membutuhkan ruang penyimpanan yang sedikit lebih banyak karena totalnya akan melampaui nilai maksimum piksel - perlu menggunakan int per channel daripada menyimpan empat saluran dalam satu int. Well, OK, tapi ini adalah Gaussian (ish) blur isnt it Bagaimana dengan melakukan hal yang blur lensa dengan radius variabel Sayangnya, youre kurang beruntung disini. Saya tidak mengatakan bahwa tidak ada cara super cepat untuk melakukan ini, tapi sejauh yang saya tahu, Anda harus melakukan hal konvolusi penuh. Cobalah di applet ini, yang mengaburkan lebih banyak saat Anda bergerak ke kanan: Sharpening by Blurring Anda bisa menggunakan blur untuk mempertajam gambar dan juga mengaburkannya dengan teknik yang disebut unsharp masking. Apa yang Anda lakukan adalah mengambil gambar dan mengurangi versi buram, pastikan Anda mengimbangi hilangnya kecerahan. Ini terdengar seperti sihir, tapi benar-benar bekerja: bandingkan gambar ini dengan yang asli. Cobalah di applet ini: Jika mengurangkan versi buram dari sebuah gambar dari dirinya sendiri mempertajamnya, apa yang menambahkannya lakukan Seperti biasa, Anda tidak perlu menebak - Im ke sini untuk memberi tahu Anda. Apa yang Anda dapatkan adalah semacam efek bercahaya yang bisa terlihat cukup bagus, atau sangat murahan tergantung sudut pandang Anda. Memvariasikan jumlah blur yang ditambahkan bervariasi efek bercahaya. Anda bisa melihat efek ini banyak digunakan di televisi untuk melihat mimpi. Cobalah di applet ini: Membuat Bayangan Membuat bayangan hanyalah masalah untuk menciptakan gambar yang menyerupai siluet objek bayangan, mengaburkannya, mungkin mendistorsi atau menggerakkannya, dan menempelkan gambar asli di atas. Karena ini adalah hal yang sangat biasa yang ingin dilakukan, seharusnya ada filter untuk melakukannya, dan ini dia. Ini sebenarnya adalah implementasi yang sangat sederhana - hanya mengaburkan bayangan dan menggambar gambar asli dari atas. Dalam prakteknya, lebih baik jangan repot-repot mengaburkan pixel yang benar-benar tersembunyi oleh objek. Casting Rays Kita bisa melakukan trik yang sama untuk membuat sinar cahaya muncul dari sebuah objek, hanya saja kali ini membuat warna bayangan putih dan menggunakan zoom blur bukan blur biasa, lalu menambahkan hasilnya di atas yang asli. Sinar sering terlihat lebih baik jika Anda hanya membuangnya dari bagian gambar yang terang, sehingga filter memiliki ambang batas yang dapat Anda setel untuk membatasi sinar ke daerah terang. Ini adalah efek yang baik untuk bernyawa: jadikan bagian tengah sinar bergerak melintasi gambar dan Anda mendapatkan efek sumber cahaya bergerak di belakang gambar. Kesimpulan Well, thats it, dan Ive bahkan tidak disebutkan metode blurring lainnya seperti filter IIR, filter rekursif dan semua hal buruk lainnya. Kuharap kau datang dengan sesuatu yang berguna dari ini, meski hanya keinginan membakar tinta hijau dan menulis surat untukku. Akhirnya, Anda mungkin telah memperhatikan bahwa sumber di atas bergantung pada beberapa kelas lainnya. Jangan khawatir, ini dia: Lodes Computer Graphics Tutorial Image Filtering Daftar Isi Pendahuluan Image filtering memungkinkan Anda untuk menerapkan berbagai efek pada foto. Jenis penyaringan gambar yang dijelaskan di sini menggunakan filter 2D yang serupa dengan yang ada di Paint Shop Pro sebagai User Defined Filter dan di Photoshop sebagai Custom Filter. Konvolusi Trik penyaringan gambar adalah Anda memiliki matriks penyaring 2D, dan gambar 2D. Kemudian, untuk setiap piksel gambar, ambil jumlah produk. Setiap produk adalah nilai warna dari pixel saat ini atau tetangganya, dengan nilai matriks filter yang sesuai. Pusat matriks filter harus dikalikan dengan piksel saat ini, elemen lain dari matriks filter dengan piksel tetangga yang sesuai. Operasi ini di mana Anda mengambil jumlah produk elemen dari dua fungsi 2D, di mana Anda membiarkan salah satu dari dua fungsi bergerak di atas setiap elemen fungsi lainnya, disebut Convolution or Correlation. Perbedaan antara Konvolusi dan Korelasi adalah bahwa untuk konvolusi Anda harus memantulkan matriks filter, namun biasanya simetrisnya tetap jadi tidak ada bedanya. Filter dengan konvolusi relatif sederhana. Filter yang lebih kompleks, yang dapat menggunakan lebih banyak fungsi mewah, ada juga, dan dapat melakukan hal-hal yang jauh lebih rumit (misalnya filter Pensil Warna di Photoshop), namun filter semacam itu tidak dibahas di sini. Operasi konvolusi 2D memerlukan loop 4-double, jadi tidak begitu cepat, kecuali jika Anda menggunakan filter kecil. Disini biasanya menggunakan filter 3x3 atau 5x5. Ada beberapa aturan tentang filter: Ukurannya harus tidak rata, sehingga memiliki pusat, misalnya 3x3, 5x5 dan 7x7 yang ok. Tidak harus, tapi jumlah semua elemen filter seharusnya 1 jika Anda menginginkan gambar yang dihasilkan memiliki kecerahan yang sama seperti aslinya. Jika jumlah elemen lebih besar dari 1, hasilnya akan menjadi gambar yang lebih terang, dan jika nilainya lebih kecil dari 1, gambar lebih gelap. Jika jumlahnya adalah 0, gambar yang dihasilkan tidak harus benar-benar hitam, tapi akan sangat gelap. Gambar memiliki dimensi yang terbatas, dan jika Anda misalnya menghitung piksel di sisi kiri, tidak ada piksel lagi di sebelah kiri sementara ini diperlukan untuk konvolusi. Anda bisa menggunakan nilai 0 di sini, atau membungkusnya ke sisi lain gambar. Dalam tutorial ini, pembungkus di sekitar dipilih karena dapat dengan mudah dilakukan dengan pembagian modulo. Nilai piksel yang dihasilkan setelah menerapkan filter bisa negatif atau lebih besar dari 255, jika itu terjadi, Anda dapat memotongnya sehingga nilai yang lebih kecil dari 0 adalah Dibuat 0 dan nilai yang lebih besar dari 255 diatur ke 255. Untuk nilai negatif, Anda juga bisa mengambil nilai absolutnya. Di Domain Fourier atau Domain Frekuensi, operasi konvolusi menjadi perkalian, yang lebih cepat. Di Domain Fourier, filter yang jauh lebih hebat dan lebih besar bisa diterapkan lebih cepat, terutama jika Anda menggunakan Fast Fourier Transform. Lebih lanjut tentang ini ada dalam artikel Fourier Transform. Pada artikel ini, perhatikan beberapa filter kecil yang sangat khas, seperti blur, deteksi tepi dan emboss. Filter gambar tidak layak untuk aplikasi dan permainan real time, namun berguna dalam pemrosesan gambar. Filter audio dan elektronik digital bekerja dengan konvolusi juga, tapi di 1D. Heres kode yang akan digunakan untuk mencoba filter yang berbeda. Selain menggunakan matriks filter, juga memiliki faktor pengali dan bias. Setelah menerapkan filter, faktor tersebut akan dikalikan dengan hasilnya, dan bias ditambahkan ke dalamnya. Jadi jika Anda memiliki filter dengan elemen 0,25 di dalamnya, namun faktornya diatur ke 2, semua elemen filter secara teori dikalikan dua sehingga elemen 0,25 sebenarnya 0,5. Bias bisa digunakan jika ingin membuat gambar yang dihasilkan lebih cerah. Hasil satu piksel disimpan dalam floats merah, hijau dan biru, sebelum mengubahnya menjadi nilai integer pada buffer hasil. Perhitungan saringan itu sendiri adalah loop 4-double yang harus melewati setiap piksel gambar, dan kemudian melalui setiap elemen matriks filter. Lokasi imageX dan imageY dihitung sehingga elemen tengah filter menjadi x, y, tapi untuk elemen lainnya akan ada pixel dari gambar ke kiri, kanan, atas atau bawah x, y. Modulo-nya dibagi melalui lebar (w) atau tinggi (h) gambar sehingga piksel di luar gambar akan dililitkan. Sebelum modulo membaginya, w atau h juga ditambahkan padanya, karena divisi modulo ini tidak bekerja dengan benar untuk nilai negatif. Sekarang, pixel (-1, -1) benar akan menjadi pixel (w-1, h-1). Jika Anda ingin mengambil nilai absolut dari nilai yang lebih kecil dari nol daripada memotongnya, gunakan kode ini sebagai gantinya: Analisis Time Series tsa statsmodels. tsa berisi kelas dan fungsi model yang berguna untuk analisis deret waktu. Ini saat ini mencakup model autoregresif univariat (AR), model vektor autoregresif (VAR) dan model rata-rata bergerak autoregresif univariat (ARMA). Ini juga mencakup statistik deskriptif untuk deret waktu, misalnya autokorelasi, fungsi autokorelasi parsial dan periodogram, serta sifat teoritis ARMA atau proses terkait lainnya. It also includes methods to work with autoregressive and moving average lag-polynomials. Additionally, related statistical tests and some useful helper functions are available. Estimation is either done by exact or conditional Maximum Likelihood or conditional least-squares, either using Kalman Filter or direct filters. Currently, functions and classes have to be imported from the corresponding module, but the main classes will be made available in the statsmodels. tsa namespace. The module structure is within statsmodels. tsa is stattools. empirical properties and tests, acf, pacf, granger-causality, adf unit root test, ljung-box test and others. armodel. univariate autoregressive process, estimation with conditional and exact maximum likelihood and conditional least-squares arimamodel. univariate ARMA process, estimation with conditional and exact maximum likelihood and conditional least-squares vectorar, var. vector autoregressive process (VAR) estimation models, impulse response analysis, forecast error variance decompositions, and data visualization tools kalmanf. estimation classes for ARMA and other models with exact MLE using Kalman Filter armaprocess. properties of arma processes with given parameters, this includes tools to convert between ARMA, MA and AR representation as well as acf, pacf, spectral density, impulse response function and similar sandbox. tsa. fftarma. similar to armaprocess but working in frequency domain tsatools. additional helper functions, to create arrays of lagged variables, construct regressors for trend, detrend and similar. filters. helper function for filtering time series Some additional functions that are also useful for time series analysis are in other parts of statsmodels, for example additional statistical tests. Some related functions are also available in matplotlib, nitime, and scikits. talkbox. Those functions are designed more for the use in signal processing where longer time series are available and work more often in the frequency domain. Descriptive Statistics and Tests stattools. acovf (x, unbiased, demean, fft)

No comments:

Post a Comment