Gaussian Blur
Gaussian Blur, juga dikenal sebagai Smoothing Gaussian, adalah efek pemrosesan yang banyak digunakan dalam perangkat lunak pemrosesan gambar seperti Adobe Photoshop, GIMP, dan Paint.net. Biasanya digunakan untuk mengurangi kebisingan gambar dan mengurangi tingkat detail. Efek visual dari gambar yang dihasilkan oleh teknologi blur ini seperti mengamati gambar melalui layar tembus cahaya, yang secara signifikan berbeda dari efek pencitraan lensa di luar fokus bokeh dan bayangan pencahayaan biasa. Smoothing Gaussian juga digunakan dalam fase pra-pemrosesan dalam algoritma penglihatan komputer untuk meningkatkan efek gambar gambar pada skala yang berbeda. Dari perspektif matematika, proses blur Gaussian dari suatu gambar adalah konvolusi dengan distribusi normal. Karena distribusi normal juga disebut Distribusi Gaussian, teknologi ini disebut Gaussian Fuzzy. Konvolusi gambar dan blur persegi melingkar akan menghasilkan efek pencitraan di luar fokus yang lebih akurat. Karena transformasi Fourier dari fungsi Gaussian adalah fungsi Gaussian lain, Gaussian Blur adalah filter low-pass untuk gambar.
Gaussian Fuzzing menggunakan fungsi kepadatan distribusi normal Gaussian untuk menghitung transformasi setiap piksel dalam gambar.
Berdasarkan fungsi Gaussian satu dimensi, fungsi Gaussian dua dimensi dapat diturunkan:
di mana r adalah jari -jari fuzzy, r^2 = x^2 + y^2, dan σ adalah standar deviasi dari distribusi normal. Dalam ruang dua dimensi, garis kontur permukaan yang dihasilkan oleh formula ini adalah lingkaran konsentris yang secara normal didistribusikan dari pusat. Matriks konvolusi yang terdiri dari piksel dengan distribusi non-nol diubah dengan gambar asli. Nilai masing -masing piksel adalah rata -rata tertimbang dari nilai piksel tetangga di sekitar. Nilai piksel asli memiliki nilai distribusi Gaussian terbesar, sehingga memiliki bobot terbesar. Ketika piksel yang berdekatan semakin jauh dari piksel asli, bobotnya menjadi lebih kecil dan lebih kecil. Proses fuzzing ini mempertahankan efek tepi lebih dari filter fuzzy penyesuaian lainnya.
Bahkan, mudah untuk menerapkan Gaussian Blur di iOS. Pada awal iOS 5.0, ada API gambar inti, dan sejumlah besar implementasi filter disediakan di CoreImage.Framework Library.
+(UIImage *) CoreBlurImage: (UIImage *) Gambar WithBlurnumber: (cgfloat) blur {cicontext *context = [cicontext contextWithOptions: nil]; Ciimage *inputimage = [ciimage imagewithcgimage: image.cgimage]; // atur filter cifilter *filter = [cifilter filterWithname:@"cigausiablur"]; [filter setValue: inputimage forkey: kCiInputImageKey]; [filter setValue: @(blur) forkey: @"inputradius"]; // blurimage ciimage *result = [filter valueforkey: kcioutputimageKey]; Cgimageeref outimage = [konteks createCgimage: hasil dariRect: [tingkat hasil]]; Uiimage *blurimage = [uiimage imagewithcgimage: outimage]; CGimagerelease (outimage); mengembalikan blurimage;}Anda juga dapat menggunakan API asli - RenderScript untuk mengimplementasikan Gaussian Blur di Android, tetapi API Android di atas 17, yaitu Android versi 4.2.
/** * Algoritma untuk mengimplementasikan fuzzy gaussian menggunakan renderscript * @park bitmap * @return */bitmap publik blur (bitmap bitmap) {// mari kita buat bitmap kosong (bitmapmap.createMap.createMap.createMap (bitmap. Bitmap.config.argb_8888); // instantiate renderscripTrendScript baru = renderscript.create (getApplicationContext ()); // Buat skrip blur intrinsik/renderscriptintrinsicblur blurscript = scriptintinssicblur.create (rendicripscrinsicblur blurscript = scriptintinsicblur.create, rendicrinscripTrinsicblur blurscript = scriptintinsicblur.create, rendicrinscripTrinsicblur blurscript = scriptINtrinsicblur (masuk/keluar) dengan renderscript dan bitmapsallocation in/out allin = alokasi.createFrombitMap (rs, bitmap); allocation allout = allocation.createFrombitMap (rs, outbitmap); // atur Radius dari blur: 0 <Radius <= 25blurscript.setrcript); RenderScriptBlurscript.setInput (allin); blurscript.foreach (allout); // salin bitmap akhir yang dibuat oleh outalokasi ke outbitmapallout.copyto (outbitmap); // daur ulang outbitmap.cycrip (); // setelah menyelesaikan semuanya, kami menghancurkan renderscrip.recrip.);Bingkai gambar CV4J yang kami kembangkan juga menyediakan filter untuk mengimplementasikan Blur Gaussian.
GaussianBlurfilter Filter = GaussianBlurfilter baru (); filter.setsigma (10); rximageData.bitmap (bitmap) .addfilter (filter) .Into (gambar2);
Dapat dilihat bahwa fuzzy Gaussian yang diimplementasikan dalam CV4J konsisten dengan efek implementasi RenderScript.
Di antara mereka, Kode GaussianBlurfilter adalah sebagai berikut:
Kelas Publik GaussianBlurfilter mengimplementasikan CommonFilter {private float [] kernel; private double sigma = 2; ExecutorService mexecutor; completionservice <void> layanan; public gaussianblurfilter () {Kernel = new float [0];} public void setsigma double a) {this. src) {final int width = src.getWidth (); final int height = src.getheight (); ukuran int int = lebar*tinggi; int redup = src.getchannels (); makegaussiankernel (sigma, 0,002, (int) math.min (lebar, tinggi)); Mexutor (Sigma, 0.002, (int) Math.min (lebar, tinggi)); Mexoror (Sigma, 0.002, (int) Math.min (lebar, tinggi)); Mexoror (Sigma, 0.002, (int) (lebar); Taskutils.newfixedThreadPool ("cv4j", dims); service = ExecutorCompletionservice baru <> (mexecutor); // simpan hasil untuk (int i = 0; i <redup; i ++) {final int temp src.tobyte (temp); byte [] temp = byte baru [ukuran]; blur (inpixels, temp, lebar, tinggi); // h gaussianblur (temp, inpixels, tinggi, lebar); // v GausainRurn null;}});} for (int i = 0; (InterruptedException e) {e.printstacktrace ();}} mexecutor.shutdown (); return src;}/** * <p> Berikut ini adalah 1d gaussian, </p> * @privy inpixels * @param outpixels * @param lebar * @param height * @privy inpixels * @param @priving inpixels * @param weldth * @param height * @privy inpixels * @privy void [@privy in @param wid -wid lebar, tinggi int) {int subcol = 0; int index = 0, index2 = 0; float sum = 0; int k = kernel.length -1; for (int row = 0; baris <tinggi; baris ++) {int c = 0; index = row; for (int col = 0; col <width; col ++) {sum = 0; untuk (int m = 0; col = 0; col <width; col ++) {sum = 0; for (int m = 0; col = 0; col <width; col ++ m; if (subcol <0 || subcol> = lebar) {subcol = 0;} index2 = baris * lebar +subkol; c = inpixels [index2] & 0xff; jumlah += c * kernel [math.abs (m)];} overpixels [indeks] = byte) byte.clamps (sum); makegausiakernel (sigma ganda akhir, akurasi ganda akhir, int maxradius) {int kradius = (int) math.ceil (sigma*math.sqrt (-2*math.log (akurasi))+1; if (maxradius <50) maxradius = 50;// terlalu kecil maxradius akan dihasilkan dengan maxradius <50) maxradius = 50; maxRadius;kernel = new float[kRadius];for (int i=0; i<kRadius; i++) // Gaussian functionkernel[i] = (float)(Math.exp(-0.5*i*i/sigma/sigma));double sum;// sum over all kernel elements for normalizationif (kRadius < maxRadius) {sum = kernel[0];for (int i = 1; i <kradius; i ++) jumlah+= 2*kernel [i];} lain jumlah = sigma*math.sqrt (2*math.pi); untuk (int i = 0; i <kradius; i ++) {double v = (kernel [i]/sum); kernel [i] = (float) v;} return;}}Konvolusi ruang
Konvolusi dua dimensi sering ditemui dalam pemrosesan gambar, dan sebagian besar bentuk diskrit dari konvolusi dua dimensi digunakan dalam pemrosesan gambar.
Berikut ini adalah berbagai efek konvolusi yang diimplementasikan oleh CV4J.
CV4J saat ini mendukung filter konvolusi spasial berikut
| menyaring | nama | memengaruhi |
|---|---|---|
| ConvolutionHvFilter | lilitan | Pengurangan kabur atau kebisingan |
| MinMaxfilter | Penyaringan maksimum dan minimum | Denoising |
| Sapnoisefilter | Kebisingan garam dan merica | Meningkatkan kebisingan |
| Sharpfilter | Mengasah | Ditingkatkan |
| Medimafilter | Penyaringan median | Denoising |
| Laplasfilter | Laplace | Ekstrak tepi |
| FindedGefilter | Temukan tepi | Ekstraksi gradien |
| Sobelfilter | gradien | Dapatkan ekstraksi gradien dalam arah x dan y |
| VarianceFilter | Pemfilteran varians | Penyaringan high-pass |
| Maeroperatorfilter | Operasi MAR | Penyaringan high-pass |
| USMFilter | USM | Ditingkatkan |
CV4J adalah perpustakaan pemrosesan gambar yang dikembangkan oleh Gloomyfish dan I, dan masih dalam versi awal.
Fungsi yang telah diimplementasikan saat ini:
Minggu ini, kami melakukan penyesuaian besar pada CV4J dan mengoptimalkan arsitektur keseluruhan. Fungsi konvolusi spasial (peningkatan gambar, penajaman, kabur, dll.) Juga ditambahkan. Selanjutnya, kami akan melakukan analisis gambar biner (korosi, ekspansi, operasi pembukaan dan penutupan, ekstraksi kontur, dll.)
Meringkaskan
Di atas adalah semua isi artikel ini tentang pemrograman Java untuk mengimplementasikan Gaussian Blur dan konvolusi spasial gambar. Saya harap ini akan membantu semua orang. Teman yang tertarik dapat terus merujuk ke situs ini:
70 baris kode java untuk mengimplementasikan berbagi algoritma jaringan saraf dalam
Bahasa Java mengimplementasikan contoh kode algoritma cruzkal berdasarkan grafik resmi yang tidak diarahkan
Contoh kode lengkap dari algoritma Java untuk mengimplementasikan pohon merah dan hitam
Jika ada kekurangan, silakan tinggalkan pesan untuk menunjukkannya. Terima kasih teman atas dukungan Anda untuk situs ini!