Seperti yang bisa dikatakan oleh fotografer amatir kepada Anda, pasca-pemrosesan ekstrem selalu baik. Salah satu teknik semacam itu disebut " pemalsuan miniatur ".
Tujuannya adalah untuk membuat gambar tampak seperti foto versi mainan miniatur itu sendiri. Ini berfungsi baik untuk foto yang diambil dari sudut sedang / tinggi ke tanah, dengan varians rendah pada tinggi subjek, tetapi dapat diterapkan dengan berbagai efektivitas ke gambar lain.
Tantangannya: Ambil foto dan terapkan algoritma pemalsuan miniatur. Ada banyak cara untuk melakukan ini, tetapi untuk tujuan tantangan ini, intinya adalah:
Kabur selektif
Beberapa bagian dari gambar harus buram untuk mensimulasikan kedalaman-bidang-dangkal. Ini biasanya dilakukan sepanjang beberapa gradien, baik linier atau berbentuk. Pilih algoritma blur / gradien apa pun yang Anda suka, tetapi antara 15-85% gambar harus memiliki blur "nyata".
Meningkatkan saturasi
Pompa warna untuk membuat hal-hal tampak mereka dilukis dengan tangan. Output harus memiliki tingkat saturasi rata-rata> + 5% bila dibandingkan dengan input. (menggunakan saturasi HSV )
Meningkatkan Kontras
Tingkatkan kontras untuk mensimulasikan kondisi pencahayaan yang lebih keras (seperti yang Anda lihat dengan lampu indoor / studio daripada matahari). Output harus memiliki kontras> + 5% bila dibandingkan dengan input. (menggunakan algoritma RMS )
Ketiga perubahan itu harus diimplementasikan, dan tidak ada peningkatan / perubahan lain yang diizinkan. Tidak ada pemotongan, penajaman, penyesuaian white balance, tidak ada.
Input adalah gambar, dan dapat dibaca dari file atau memori. Anda dapat menggunakan perpustakaan eksternal untuk membaca dan menulis gambar, tetapi Anda tidak dapat menggunakannya untuk memproses gambar. Fungsi yang disediakan juga tidak diizinkan untuk tujuan ini (Anda tidak bisa hanya menelepon
Image.blur()
misalnya)Tidak ada input lain. Kekuatan pemrosesan, level, dll, harus ditentukan oleh program, bukan oleh manusia.
Output dapat ditampilkan atau disimpan sebagai file dalam format gambar standar (PNG, BMP, dll).
Cobalah untuk menggeneralisasi. Seharusnya tidak hanya bekerja pada satu gambar, tetapi dapat dimengerti bahwa itu tidak akan bekerja pada semua gambar. Beberapa adegan tidak merespon dengan baik untuk teknik ini, tidak peduli seberapa bagus algoritma tersebut. Terapkan akal sehat di sini, baik ketika menjawab dan memilih jawaban.
Perilaku tidak ditentukan untuk input yang tidak valid, dan gambar-gambar yang tidak mungkin memenuhi spesifikasi. Misalnya, gambar skala abu-abu tidak dapat dijenuhkan (tidak ada rona dasar), gambar putih murni tidak dapat meningkatkan kontras, dll.
Sertakan setidaknya dua gambar keluaran dalam jawaban Anda:
Satu harus dihasilkan dari salah satu gambar di folder dropbox ini . Ada enam untuk dipilih, tetapi saya mencoba membuat semuanya layak untuk berbagai tingkatan. Anda dapat melihat output sampel untuk masing-masing dalam
example-outputs
subfolder. Harap dicatat bahwa ini adalah gambar JPG 10MP penuh langsung dari kamera, sehingga Anda memiliki banyak piksel untuk bekerja.Yang lain bisa berupa gambar pilihan Anda. Jelas, cobalah untuk memilih gambar yang dapat digunakan secara bebas. Juga, sertakan baik gambar asli atau tautan untuk perbandingan.
Misalnya, dari gambar ini:
Anda mungkin menampilkan sesuatu seperti:
Untuk referensi, contoh di atas diproses dalam GIMP dengan gradien gaussian blur berbentuk kotak sudut, saturasi +80, kontras +20. (Saya tidak tahu unit apa yang digunakan GIMP untuk itu)
Untuk inspirasi lebih banyak, atau untuk mendapatkan ide yang lebih baik tentang apa yang ingin Anda capai, lihat situs ini , atau yang ini . Anda juga dapat mencari miniature faking
dan tilt shift photography
untuk contoh.
Ini adalah kontes popularitas. Pemilih, pilih entri yang Anda rasa terlihat terbaik sambil tetap setia pada tujuan.
Klarifikasi:
Mengklarifikasi fungsi apa yang dilarang, itu bukan maksud saya untuk melarang fungsi matematika . Itu maksud saya untuk melarang fungsi manipulasi gambar . Ya, ada beberapa tumpang tindih di sana, tetapi hal-hal seperti FFT, konvolusi, matrik matematika, dll, berguna di banyak bidang lainnya. Anda seharusnya tidak menggunakan fungsi yang hanya mengambil gambar dan mengaburkan. Jika Anda menemukan cara matematis yang sesuai untuk membuat buram, itu permainan yang adil.
GeometricTransformation
,DistanceTransform
,ImageAdd
,ColorNegate
,ImageMultiply
,Rasterize
, danImageAdjust
.) Bahkan dengan bantuan fungsi gambar-pengolahan tingkat tinggi seperti, kode memakan 22 k. Kode untuk antarmuka pengguna masih sangat kecil.Jawaban:
Java: Implementasi Referensi
Berikut ini adalah implementasi referensi dasar di Jawa. Ini bekerja paling baik pada bidikan sudut tinggi, dan itu sangat tidak efisien.
Blur adalah blur kotak yang sangat mendasar, sehingga loop lebih dari piksel yang sama lebih dari yang diperlukan. Kontras dan saturasi bisa digabungkan menjadi satu loop juga, tetapi sebagian besar waktu yang dihabiskan adalah blur, sehingga tidak akan melihat banyak keuntungan dari itu. Yang sedang berkata, itu bekerja cukup cepat pada gambar di bawah 2MP atau lebih. Gambar 10MP membutuhkan waktu untuk diselesaikan.
Kualitas blur dapat dengan mudah ditingkatkan dengan menggunakan apa pun kecuali blur kotak datar. Algoritma kontras / saturasi melakukan tugasnya, jadi tidak ada keluhan nyata di sana.
Tidak ada kecerdasan nyata dalam program ini. Ini menggunakan faktor konstan untuk blur, saturasi, dan kontras. Saya bermain-main dengannya untuk menemukan pengaturan menengah yang menyenangkan. Akibatnya, ada yang beberapa adegan yang tidak melakukannya dengan sangat baik. Sebagai contoh, ia memompa kontras / saturasi sedemikian rupa sehingga gambar dengan area besar berwarna sama (think sky) pecah menjadi pita warna.
Mudah digunakan; cukup berikan nama file sebagai satu-satunya argumen. Ini output dalam PNG terlepas dari apa file input itu.
Contoh:
Dari pilihan dropbox:
Gambar-gambar pertama ini diperkecil untuk memudahkan pengiriman. Klik gambar untuk melihat ukuran penuh.
Setelah:
Sebelum:
Pilihan lain-lain:
Setelah:
Sebelum:
sumber
C #
Alih-alih melakukan iterative box blur, saya memutuskan untuk melakukan semua cara dan menulis blur Gaussian. Itu
GetPixel
panggilan benar-benar memperlambatnya ketika menggunakan kernel yang besar, tapi itu tidak benar-benar berharga untuk mengubah metode untuk penggunaanLockBits
kecuali kami memproses beberapa gambar yang lebih besar.Beberapa contoh di bawah ini, yang menggunakan parameter penyetelan standar yang saya tetapkan (saya tidak terlalu banyak bermain dengan parameter penyetelan, karena tampaknya berfungsi dengan baik untuk gambar uji).
Untuk test case disediakan ...
Lain...
Lain...
Peningkatan saturasi dan kontras harus cukup mudah dari kode. Saya melakukan ini di ruang HSL dan mengubahnya kembali ke RGB.
The 2D Gaussian kernel yang dihasilkan didasarkan pada ukuran
n
tertentu, dengan:... dan dinormalisasi setelah semua nilai kernel ditetapkan. Catat itu
A=sigma_x=sigma_y=1
.Untuk mengetahui di mana harus menerapkan kernel, saya menggunakan bobot yang kabur, dihitung dengan:
... yang memberikan respons yang layak, pada dasarnya menciptakan elips nilai yang dilindungi dari keburaman yang secara bertahap memudar lebih jauh. Filter band-pass yang dikombinasikan dengan persamaan lain (mungkin beberapa varian
y=-x^2
) berpotensi bekerja lebih baik di sini untuk gambar tertentu. Saya menggunakan cosine karena memberikan respon yang baik untuk base case yang saya uji.sumber
Jawa
Menggunakan blur kotak dua arah rata-rata yang berjalan cepat agar cukup cepat untuk menjalankan beberapa lintasan, meniru blur Gaussian. Blur adalah gradien elips bukan bi-linear juga.
Secara visual, ini bekerja paling baik pada gambar besar. Memiliki tema grungier yang lebih gelap. Saya senang dengan bagaimana hasil blur pada gambar berukuran tepat, itu cukup bertahap dan sulit untuk membedakan mana itu "dimulai."
Semua perhitungan dilakukan pada array bilangan bulat atau ganda (untuk HSV).
Mengharapkan jalur file sebagai argumen, menampilkan file ke lokasi yang sama dengan akhiran "miniaturized.png" Juga menampilkan input dan output dalam JFrame untuk dilihat segera.
(klik untuk melihat versi besar, mereka jauh lebih baik)
Sebelum:
Setelah:
Saya mungkin harus menambahkan beberapa pemetaan nada yang lebih cerdas atau pelestarian luma, karena ini bisa menjadi sangat gelap:
Sebelum:
Setelah:
Namun tetap menarik, menempatkannya dalam suasana yang sama sekali baru.
Kode:
sumber
J
Ini adalah tantangan yang bagus. Pengaturan untuk blur, saturasi, dan kontras adalah kode-keras tetapi dapat dengan mudah diubah jika diinginkan. Namun, area dalam fokus dikodekan sebagai garis horizontal di tengah. Itu tidak dapat dengan mudah dimodifikasi seperti pengaturan lainnya. Itu dipilih karena sebagian besar gambar uji fitur tampilan di kota.
Setelah melakukan blur Gaussian, saya membagi gambar secara horizontal menjadi 5 wilayah. Daerah atas dan bawah akan menerima 100% blur. Wilayah tengah akan menerima 0% blur. Dua wilayah yang tersisa akan berskala proporsional dengan kubus terbalik dari 0% hingga 100%.
Kode ini akan digunakan sebagai skrip dalam J dan skrip itu akan berada di folder yang sama dengan
input.bmp
yang akan menjadi gambar input. Ini akan membuatoutput.bmp
yang akan menjadi miniatur palsu input.Performanya bagus dan di pc saya menggunakan i7-4770k, dibutuhkan sekitar 20 detik untuk memproses gambar dari perangkat OP. Sebelumnya, butuh sekitar 70 detik untuk memproses gambar menggunakan konvolusi standar dengan
;._3
operator subarray. Kinerja ditingkatkan dengan menggunakan FFT untuk melakukan konvolusi.Kode ini mengharuskan
bmp
danmath/fftw
addon diinstal. Anda dapat menginstalnya menggunakaninstall 'bmp'
daninstall 'math/fftw'
. Sistem Anda juga mungkin perlufftw
pustaka untuk diinstal.sumber