Ini menggangguku selama akhir pekan: Apa cara yang baik untuk menyelesaikan masalah Where's Waldo? Teka-teki [ 'Wally' di luar Amerika Utara], menggunakan Mathematica (pemrosesan gambar dan fungsi lainnya)?
Inilah yang saya miliki sejauh ini, sebuah fungsi yang sedikit mengurangi kompleksitas visual dengan meredupkan beberapa warna non-merah:
whereIsWaldo[url_] := Module[{waldo, waldo2, waldoMask},
waldo = Import[url];
waldo2 = Image[ImageData[
waldo] /. {{r_, g_, b_} /;
Not[r > .7 && g < .3 && b < .3] :> {0, 0,
0}, {r_, g_, b_} /; (r > .7 && g < .3 && b < .3) :> {1, 1,
1}}];
waldoMask = Closing[waldo2, 4];
ImageCompose[waldo, {waldoMask, .5}]
]
Dan contoh URL tempat ini 'bekerja':
whereIsWaldo["http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/DepartmentStore.jpg"]
(Waldo ada di kasir):
image-processing
wolfram-mathematica
Arnoud Buzing
sumber
sumber
Jawaban:
Saya telah menemukan Waldo!
Bagaimana saya melakukannya
Pertama, saya memfilter semua warna yang tidak merah
Selanjutnya, saya menghitung korelasi gambar ini dengan pola hitam dan putih sederhana untuk menemukan transisi merah dan putih di kemeja.
Saya gunakan
Binarize
untuk memilih piksel dalam gambar dengan korelasi yang cukup tinggi dan menggambar lingkaran putih di sekitarnya untuk menekankan mereka gunakanDilation
Saya harus bermain-main sedikit dengan level. Jika levelnya terlalu tinggi, terlalu banyak false positive yang dipilih.
Akhirnya saya menggabungkan hasil ini dengan gambar asli untuk mendapatkan hasil di atas
sumber
WhereIsWaldo
fungsi, karena itu bukan solusi umum. Heike sendiri telah menunjukkan bahwa level perlu dimainkan sebelum Anda bisa mendapatkan yang positif. Untuk melihat apa yang saya maksud, coba fungsi paket Anda seperti pada."http://www.findwaldo.com/fankit/graphics/IntlManOfLiterature/Scenes/AtTheBeach.jpg"
Ini lebih sulit dengan yang ini.Tebakan saya pada "cara anti peluru untuk melakukan ini" (pikirkan CIA menemukan Waldo di citra satelit kapan saja, bukan hanya satu gambar tanpa elemen yang bersaing, seperti kemeja bergaris) ... Saya akan melatih mesin Boltzmann pada banyak gambar Waldo - semua variasi dia duduk, berdiri, menyumbat, dll.; baju, topi, kamera, dan semua karya. Anda tidak perlu korpus besar Waldos (mungkin 3-5 akan cukup), tetapi semakin banyak semakin baik.
Ini akan menetapkan awan probabilitas ke berbagai elemen yang terjadi dalam pengaturan apa pun yang benar, dan kemudian menetapkan (melalui segmentasi) apa ukuran objek rata-rata, memecah-mecah gambar sumber menjadi sel-sel objek yang paling menyerupai individu orang (mempertimbangkan kemungkinan penyumbatan dan menimbulkan perubahan) ), tetapi karena gambar Waldo biasanya menyertakan BANYAK orang pada skala yang sama, ini seharusnya menjadi tugas yang sangat mudah, kemudian memberi makan segmen-segmen ini dari mesin Boltzmann yang sudah dilatih sebelumnya. Ini akan memberi Anda kemungkinan masing-masing menjadi Waldo. Ambil satu dengan probabilitas tertinggi.
Beginilah cara kerja OCR, pembaca kode ZIP, dan pengenalan tulisan tangan yang tidak berbelit-belit hari ini. Pada dasarnya Anda tahu jawabannya ada di sana, Anda tahu kurang lebih seperti apa bentuknya, dan yang lainnya mungkin memiliki elemen yang sama, tetapi jelas "bukan", jadi Anda tidak repot dengan "bukan", Anda lihat saja kemungkinan "itu" di antara semua kemungkinan "itu" yang pernah Anda lihat sebelumnya "(dalam kode ZIP misalnya, Anda akan melatih BM hanya untuk 1s, hanya 2s, hanya 3s, dll, lalu beri makan setiap digit ke setiap mesin, dan pilih satu yang paling percaya diri) .Ini bekerja jauh lebih baik daripada fitur pembelajaran jaringan saraf tunggal dari semua angka.
sumber
Saya setuju dengan @GregoryKlopper bahwa cara yang tepat untuk menyelesaikan masalah umum menemukan Waldo (atau objek yang menarik) dalam gambar sewenang-wenang adalah dengan melatih classifier pembelajaran mesin yang diawasi. Menggunakan banyak contoh berlabel positif dan negatif, suatu algoritma seperti Support Vector Machine , Boosted Decision Stump atau Boltzmann Machine kemungkinan bisa dilatih untuk mencapai akurasi tinggi pada masalah ini. Mathematica bahkan memasukkan algoritma ini ke dalam Kerangka Pembelajaran Mesinnya .
Dua tantangan dengan pelatihan classifier Waldo adalah:
Pencarian gambar Google cepat menghasilkan beberapa data yang bagus - Saya akan mencoba mengumpulkan beberapa contoh pelatihan dan mengkodekannya sekarang!
Namun, bahkan pendekatan pembelajaran mesin (atau pendekatan berbasis aturan yang disarankan oleh @iND) akan berjuang untuk gambar seperti Land of Waldos !
sumber
Saya tidak tahu Mathematica. . . sangat buruk. Tapi saya suka jawaban di atas, sebagian besar.
Masih ada kelemahan utama dalam mengandalkan strip sendirian untuk mendapatkan jawabannya (saya pribadi tidak punya masalah dengan satu penyesuaian manual). Ada sebuah contoh (terdaftar oleh Brett Champion, di sini ) yang disajikan yang menunjukkan bahwa mereka, kadang-kadang, memecah pola baju. Jadi itu menjadi pola yang lebih kompleks.
Saya akan mencoba pendekatan id bentuk dan warna, bersama dengan hubungan spasial. Sama seperti pengenalan wajah, Anda dapat mencari pola geometris pada rasio tertentu dari satu sama lain. Peringatannya adalah bahwa biasanya satu atau lebih bentuk itu tersumbat.
Dapatkan white balance pada gambar, dan red white balance dari gambar. Saya percaya Waldo selalu memiliki nilai yang sama / rona, tetapi gambar mungkin dari pemindaian, atau salinan yang buruk. Kemudian selalu merujuk pada array warna yang sebenarnya dimiliki Waldo: merah, putih, coklat tua, biru, persik, {warna sepatu}.
Ada pola baju, dan juga celana, kacamata, rambut, wajah, sepatu dan topi yang mendefinisikan Waldo. Juga, relatif terhadap orang lain dalam gambar, Waldo ada di sisi kurus.
Jadi, cari orang acak untuk mendapatkan ketinggian orang di foto ini. Ukur tinggi rata-rata banyak hal pada titik acak dalam gambar (garis besar sederhana akan menghasilkan beberapa orang secara individu). Jika setiap hal tidak berada dalam beberapa standar deviasi satu sama lain, mereka diabaikan untuk saat ini. Bandingkan rata-rata ketinggian dengan tinggi gambar. Jika rasionya terlalu besar (mis. 1: 2, 1: 4, atau hampir sama), lalu coba lagi. Jalankan 10 (?) Kali untuk memastikan bahwa sampel semuanya cukup berdekatan, tidak termasuk rata-rata di luar beberapa standar deviasi. Mungkinkah dalam Mathematica?
Ini adalah ukuran Waldo Anda. Walso kurus, jadi Anda mencari sesuatu 5: 1 atau 6: 1 (atau apa pun) ht: wd. Namun, ini tidak cukup. Jika Waldo sebagian tersembunyi, tingginya bisa berubah. Jadi, Anda mencari balok merah-putih yang ~ 2: 1. Tetapi harus ada lebih banyak indikator.
Semua itu bisa berlaku. Ini juga cek negatif terhadap orang-orang yang sama di foto - misalnya, # 2 meniadakan mengenakan celemek merah-putih (terlalu dekat dengan sepatu), # 5 menghilangkan rambut berwarna terang. Selain itu, bentuk hanya satu indikator untuk masing-masing tes ini. . . warna saja dalam jarak yang ditentukan dapat memberikan hasil yang baik.
Ini akan mempersempit area yang akan diproses.
Menyimpan hasil ini akan menghasilkan seperangkat area yang seharusnya memiliki Waldo di dalamnya. Kecualikan semua area lain (mis., Untuk setiap area, pilih satu lingkaran dua kali lebih besar dari ukuran rata-rata orang), dan kemudian jalankan proses yang diatur oleh @Heike dengan menghapus semua kecuali merah, dan seterusnya.
Adakah pemikiran tentang cara membuat kode ini?
Edit:
Pikiran tentang cara kode ini. . . kecualikan semua area kecuali Waldo red, skeletonize area merah, dan pangkas hingga satu titik. Lakukan hal yang sama untuk Waldo hair brown, celana Waldo blue, warna sepatu Waldo. Untuk warna kulit Waldo, singkirkan, lalu temukan garis besarnya.
Selanjutnya, kecualikan non-merah, melebarkan (banyak) semua area merah, kemudian skeletonize dan pangkas. Bagian ini akan memberikan daftar kemungkinan poin pusat Waldo. Ini akan menjadi penanda untuk membandingkan semua bagian warna Waldo lainnya.
Dari sini, menggunakan area merah kerangka (bukan yang melebar), hitung garis di setiap area. Jika ada nomor yang benar (empat, kan?), Ini tentunya merupakan area yang memungkinkan. Jika tidak, saya kira hanya mengecualikannya (sebagai pusat Waldo ... mungkin masih topinya).
Kemudian periksa apakah ada bentuk wajah di atas, titik rambut di atas, titik celana di bawah, titik sepatu di bawah, dan sebagainya.
Belum ada kode - masih membaca dokumen.
sumber
Saya punya solusi cepat untuk menemukan Waldo menggunakan OpenCV.
Saya menggunakan fungsi pencocokan templat yang tersedia di OpenCV untuk menemukan Waldo.
Untuk melakukan ini diperlukan templat. Jadi saya memotong Waldo dari gambar asli dan menggunakannya sebagai templat.
Selanjutnya saya memanggil
cv2.matchTemplate()
fungsi bersama dengan koefisien korelasi dinormalisasi sebagai metode yang digunakan. Ini mengembalikan probabilitas tinggi di satu wilayah seperti yang ditunjukkan dalam warna putih di bawah (di suatu tempat di wilayah kiri atas):Posisi wilayah kemungkinan tertinggi ditemukan menggunakan
cv2.minMaxLoc()
fungsi, yang kemudian saya gunakan untuk menggambar persegi panjang untuk menyorot Waldo:sumber