Friday 11 August 2017

Moving average gaussian window


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 bagi 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 terlalu 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 hanya 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 kabur 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 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 lakukan. 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 box blur 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 melintasi 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 dikurangkan 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 kabur 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 blus persegi pada saat 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 kabut 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 mensimulasikan 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 kabur 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 tanpa disadari kemudian. 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 pada gambar. Kabar baiknya adalah bahwa weve sudah melakukan motion blur yang sederhana. Kembali ke kotak blur applet di atas dan atur radius horizontal ke, 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 keadaan jadi 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 blur gerak lurus, ini berarti mengikuti garis lurus dari piksel, tapi Anda bisa mengikuti jalur wiggly jika Anda ingin mensimulasikan gamer kamera jarak jauh, misalnya. Spin dan Zoom Blur Begitu kode untuk blur di tempat, ada masalah sederhana untuk memodifikasinya 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 sangat 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 kriptografi N-pixel pada 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 dengan mengarahkan 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 kabur blur 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 The 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 temui 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 (well, maybe - Im no mathematician) - 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 bekerja, tapi saya bisa mengarahkan mereka. 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 mungkin lebih 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 blur Gaussian Nah, ini 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 secara bersamaan 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 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 hanya dengan 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 menggunakan 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 di 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 dapat 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 agar sinar tampak muncul dari suatu 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: Alat komputasional Secara analog, DataFrame memiliki metode untuk menghitung kovarian pairwise di antara seri di DataFrame, juga mengecualikan nilai NAnull. Dengan asumsi data yang hilang hilang secara acak, ini menghasilkan perkiraan matriks kovariansi yang tidak bias. Namun, untuk banyak aplikasi perkiraan ini mungkin tidak dapat diterima karena matriks kovariansi yang diperkirakan tidak dijamin bersifat semi-pasti positif. Hal ini dapat menyebabkan korelasi yang diperkirakan memiliki nilai absolut yang lebih besar dari satu, dan atau matriks kovariansi yang tidak dapat dibalik. Lihat Estimasi matriks kovarian untuk lebih jelasnya. DataFrame. cov juga mendukung kata kunci minperiod opsional yang menentukan jumlah pengamatan minimum yang diperlukan untuk setiap pasangan kolom agar memiliki hasil yang valid. Bobot yang digunakan di jendela ditentukan oleh kata kunci wintype. Daftar tipe yang dikenali adalah: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (kebutuhan beta) gaussian (kebutuhan std) generalgausia (butuh daya, lebar) slepian (kebutuhan lebar). Perhatikan bahwa jendela boxcar setara dengan mean (). Untuk beberapa fungsi windowing, parameter tambahan harus ditentukan: Untuk. sum () dengan wintype. Tidak ada normalisasi yang dilakukan pada bobot jendela. Melewati bobot kebiasaan 1, 1, 1 akan menghasilkan hasil yang berbeda dari pada bobot yang di atas 2, 2, 2. misalnya. Ketika melewati sebuah wintype dan bukan secara eksplisit menentukan bobotnya, bobotnya sudah dinormalisasi sehingga bobot terbesar adalah 1. Sebaliknya, sifat perhitungan. mean () adalah sedemikian rupa sehingga bobotnya dinormalisasi satu sama lain. Bobot 1, 1, 1 dan 2, 2, 2 menghasilkan hasil yang sama. Time-aware Rolling New di versi 0.19.0. Baru di versi 0.19.0 adalah kemampuan untuk melewatkan offset (atau konversi) ke metode. rolling () dan memilikinya menghasilkan jendela berukuran variabel berdasarkan jendela waktu yang berlalu. Untuk setiap titik waktu, ini mencakup semua nilai sebelumnya yang terjadi dalam delta waktu yang ditunjukkan. Ini bisa sangat berguna untuk indeks frekuensi waktu non-reguler. Ini adalah indeks frekuensi reguler. Menggunakan parameter jendela integer bekerja untuk memutar sepanjang frekuensi jendela. Menentukan offset memungkinkan spesifikasi frekuensi rolling yang lebih intuitif. Menggunakan indeks non-reguler, namun masih monoton, bergulir dengan jendela integer tidak memberikan perhitungan khusus. Menggunakan spesifikasi waktu menghasilkan jendela variabel untuk data yang jarang ini. Selanjutnya, sekarang kami mengizinkan parameter opsional untuk menentukan kolom (bukan default indeks) di DataFrame. Time-aware Rolling vs. Resampling Menggunakan. rolling () dengan indeks berbasis waktu sangat mirip dengan resampling. Mereka berdua mengoperasikan dan melakukan operasi reduktif pada objek panda yang diindeks dengan waktu. Bila menggunakan. rolling () dengan offset. Offset adalah waktu-delta. Ambil jendela belakang mundur, dan agregat semua nilai di jendela itu (termasuk titik akhir, tapi bukan titik awal). Ini adalah nilai baru pada saat itu hasilnya. Ini adalah jendela berukuran variabel dalam ruang waktu untuk setiap titik masukan. Anda akan mendapatkan hasil ukuran yang sama seperti input. Bila menggunakan. resample () dengan offset. Buatlah indeks baru yang merupakan frekuensi offset. Untuk setiap bin frekuensi, titik agregat dari input dalam jendela mencari mundur yang pada waktu itu berada dalam bin itu. Hasil agregasi ini adalah output untuk titik frekuensi tersebut. Jendela adalah ukuran ukuran tetap di ruang frekuensi. Hasil Anda akan memiliki bentuk frekuensi reguler antara min dan max dari objek masukan asli. Untuk meringkas. Rolling () adalah operasi jendela berbasis waktu, sementara. resample () adalah operasi jendela berbasis frekuensi. Memusatkan Windows Secara default label disetel ke tepi kanan jendela, namun kata kunci tengah tersedia sehingga labelnya dapat disetel di tengahnya. Fungsi Binary Window cov () dan corr () dapat menghitung statistik window bergerak sekitar dua Series atau kombinasi DataFrameSeries atau DataFrameDataFrame. Inilah perilaku dalam setiap kasus: dua Seri. Hitung statistik untuk pemasangan. DataFrameSeries. Hitung statistik untuk setiap kolom DataFrame dengan Seri yang dilewati, sehingga mengembalikan DataFrame. DataFrameDataFrame. Secara default hitung statistik untuk mencocokkan nama kolom, mengembalikan DataFrame. Jika kata kunci argumen pairwiseTrue dilewatkan maka hitung statistik untuk setiap pasangan kolom, mengembalikan Panel yang itemnya adalah tanggal yang dimaksud (lihat bagian selanjutnya). Computing rolling pairwise covariances and correlations Dalam analisis data keuangan dan bidang lainnya, hal itu umum untuk menghitung matriks kovarians dan korelasi untuk kumpulan deret waktu. Seringkali seseorang juga tertarik pada kovarians bergerak-jendela dan matriks korelasi. Hal ini dapat dilakukan dengan melewatkan argumen kata kunci berpasangan, yang jika input DataFrame akan menghasilkan Panel yang itemnya adalah tanggal yang dimaksud. Dalam kasus argumen DataFrame tunggal argumen berpasangan bahkan dapat diabaikan: Nilai yang hilang diabaikan dan setiap entri dihitung dengan menggunakan pengamatan lengkap berpasangan. Silakan lihat bagian kovarian untuk peringatan yang terkait dengan metode penghitungan kovarians dan matriks korelasi ini. Selain tidak memiliki parameter jendela, fungsi ini memiliki antarmuka yang sama dengan rekan mereka. rolling. Seperti di atas, parameter yang mereka terima adalah: minperiods. Ambang data non-null diperlukan. Default ke minimum yang dibutuhkan untuk menghitung statistik. Tidak ada NaN yang akan menjadi output setelah titik data non-null minperiod terlihat. pusat. Boolean, apakah untuk mengatur label di bagian tengah (default adalah False) Output dari metode. rolling dan. expanding tidak mengembalikan NaN jika setidaknya ada nilai minperiods non-null di jendela aktif. Ini berbeda dari cumsum. Cumprod Cummax Dan cummin. Yang mengembalikan NaN ke output dimanapun NaN ditemui di input. Statistik jendela yang meluas akan lebih stabil (dan kurang responsif) daripada penggabungan window rolling karena meningkatnya ukuran jendela akan mengurangi dampak relatif dari titik data individual. Sebagai contoh, berikut ini adalah mean () output untuk dataset seri waktu sebelumnya: Windows yang tertimbang secara eksponensial Satu set fungsi yang terkait adalah versi tertimbang secara eksponensial dari beberapa statistik di atas. Antarmuka yang serupa dengan. rolling dan. expanding diakses melalui metode. ewm untuk menerima objek EWM. Sejumlah metode EW (exponentially weighted) yang meluas disediakan: Slideshare menggunakan cookies untuk meningkatkan fungsionalitas dan kinerja, dan memberi Anda iklan yang relevan. Jika Anda terus browsing situs, Anda setuju dengan penggunaan cookies di situs ini. Lihat Perjanjian Pengguna dan Kebijakan Privasi kami. Slideshare menggunakan cookies untuk meningkatkan fungsionalitas dan performa, dan memberi Anda iklan yang relevan. Jika Anda terus browsing situs, Anda setuju dengan penggunaan cookies di situs ini. Lihat Kebijakan Privasi dan Perjanjian Pengguna kami untuk rinciannya. Jelajahi semua topik favorit Anda di aplikasi SlideShare Dapatkan aplikasi SlideShare untuk Simpan untuk Nanti bahkan secara offline Terus ke situs mobile Upload Masuk Signup Ketuk dua kali untuk memperkecil Program matlab dasar Berbagi SlideShare ini LinkedIn Corporation copy 2017

No comments:

Post a Comment