Hai Habr.
Sebuah publikasi terbaru di sini di situs menggambarkan sebuah perangkat yang memungkinkan orang buta untuk "melihat" gambar, mengubahnya menggunakan gelombang suara. Dari sudut pandang teknis, dalam artikel itu tidak ada detail sama sekali (
bagaimana jika ide untuk sejuta dicuri ), tetapi konsep itu sendiri tampak menarik. Memiliki pengalaman dengan pemrosesan sinyal, saya memutuskan untuk bereksperimen sendiri.

Apa yang terjadi, detail dan contoh file di bawah kucing.
Konversi 2D ke 1D
Tugas nyata pertama yang menanti kita adalah mengubah gambar "datar" dua dimensi menjadi gelombang suara "satu dimensi". Seperti yang disarankan dalam komentar pada artikel itu, nyaman untuk menggunakan
kurva Hilbert untuk ini.

Ini pada dasarnya menyerupai fraktal, dan idenya adalah bahwa dengan peningkatan resolusi gambar, posisi relatif objek tidak berubah (jika objek berada di sudut kiri atas gambar, maka itu
akan tetap di sana ). Dimensi kurva Hilbert yang berbeda dapat memberi kita gambar yang berbeda: 32x32 untuk N = 5, 64x64 untuk N = 6, dan seterusnya. Dengan "berjalan-jalan" gambar di sepanjang kurva ini, kita mendapatkan garis, objek satu dimensi.
Pertanyaan selanjutnya adalah ukuran gambar. Secara intuitif saya ingin mengambil gambar yang lebih besar, tetapi ada "tapi" besar: bahkan gambarnya 512x512, itu adalah 262.144 piksel. Jika kita mengonversi setiap titik menjadi pulsa audio, maka pada frekuensi sampling 44100, kita mendapatkan urutan selama 6 detik, dan ini terlalu lama - gambar harus diperbarui dengan cepat, misalnya menggunakan kamera web. Tidak masuk akal untuk membuat laju sampling lebih tinggi; kita mendapatkan frekuensi ultrasonik yang tidak terdengar oleh telinga (meskipun mungkin bekerja untuk burung hantu atau kelelawar). Akibatnya, resolusi 128x128 dipilih
dengan metode poking ilmiah , yang akan memberikan impuls panjang 0,37c - di satu sisi, cukup cepat untuk bernavigasi secara real time, di sisi lain cukup untuk menangkap setiap perubahan dalam bentuk sinyal dengan telinga.
Pemrosesan gambar
Langkah pertama adalah mengunduh gambar, mengonversinya menjadi b / w dan skala ke ukuran yang diinginkan. Ukuran gambar tergantung pada dimensi kurva Hilbert.
from PIL import Image from hilbertcurve.hilbertcurve import HilbertCurve import numpy as np from scipy.signal import butter, filtfilt
Langkah selanjutnya adalah membentuk gelombang suara. Di sini, tentu saja, ada banyak sekali algoritma dan pengetahuan, untuk pengujian saya hanya mengambil komponen kecerahan. Tentu saja, mungkin ada cara yang lebih baik.
width, height = img_grayscale.size sound_data = np.zeros(width*height) for ii in range(width*height): coord_x, coord_y = hilbert_curve.coordinates_from_distance(ii) pixel_l = img_data[coord_x][coord_y]
Dari kode, saya harap semuanya jelas. Fungsi Coordinate_from_distance melakukan semua pekerjaan untuk kita dalam mengkonversi koordinat (x, y) ke jarak pada kurva Hilbert, kita membalikkan dan mengubah nilai kecerahan L ke warna.
Bukan itu saja. Karena mungkin ada blok besar dengan warna yang sama dalam gambar, ini dapat menyebabkan munculnya "komponen dc" dalam suara - serangkaian panjang nilai-nilai non-nol, misalnya [100.100.100, ...]. Untuk menghapusnya, kami menerapkan filter high-pass (filter
Butterworth ) ke array kami dengan frekuensi cutoff 50 Hz (kebetulan dengan frekuensi jaringan acak). Ada sintesis filter di pustaka yang cerdik, yang akan kita gunakan.
def butter_highpass(cutoff, fs, order=5): nyq = 0.5 * fs normal_cutoff = cutoff / nyq b, a = butter(order, normal_cutoff, btype='high', analog=False) return b, a def butter_highpass_filter(data, cutoff, fs, order=5): b, a = butter_highpass(cutoff, fs, order) y = filtfilt(b, a, data) return y
Langkah terakhir adalah menyimpan gambar. Karena panjang satu impuls pendek, kami ulangi 10 kali, akan mendekati aurally ke gambar berulang yang nyata, misalnya, dari webcam.
Hasil
Algoritma di atas, tentu saja, cukup primitif. Saya ingin memeriksa tiga poin - seberapa banyak Anda dapat membedakan antara berbagai bentuk sederhana, dan seberapa banyak Anda dapat memperkirakan jarak ke bentuk.
Tes 1
Gambar sesuai dengan sinyal suara berikut:

WAV:
cloud.mail.ru/public/nt2R/2kwBvyRupTes 2
Gagasan dari tes ini adalah untuk membandingkan "suara" dari suatu objek dengan bentuk yang berbeda. Sinyal suara:

WAV:
cloud.mail.ru/public/2rLu/4fCNRxCG2Anda mungkin memperhatikan bahwa suaranya benar-benar berbeda, dan ada perbedaan di telinga.
Tes 3
Ide dari tes ini adalah untuk menguji objek yang lebih kecil. Sinyal suara:

WAV:
cloud.mail.ru/public/5GLV/2HoCHvoaYPada prinsipnya, semakin kecil ukuran objek, semakin sedikit akan ada "semburan" dalam suara, sehingga ketergantungan di sini cukup langsung.
Edit:Seperti yang disarankan dalam komentar, Anda dapat menggunakan transformasi Fourier untuk secara langsung mengonversi gambar menjadi suara. Tes cepat yang dilakukan menunjukkan hasil berikut (gambar-gambarnya sama):
Tes 1:
cloud.mail.ru/public/2C5Z/5MEQ8SwjoTes 2:
cloud.mail.ru/public/2dxp/3sz8mjAibTes 3:
cloud.mail.ru/public/3NjJ/ZYrfdTYrkTes terdengar menarik, setidaknya untuk kotak kecil dan besar (file 1 dan 3), perbedaan pendengaran terlihat. Tetapi bentuk angka (1 dan 2) praktis tidak berbeda, jadi ada juga sesuatu untuk dipikirkan. Namun secara umum, suara yang didapat menggunakan FFT, oleh telinga saya lebih suka.
Kesimpulan
Tes ini, tentu saja, bukan disertasi, tetapi hanya bukti konsep, dibuat dalam beberapa jam waktu luang. Namun meski begitu, ini pada dasarnya bekerja, dan sangat mungkin untuk merasakan perbedaannya di telinga. Saya tidak tahu apakah mungkin untuk belajar menavigasi di ruang angkasa dengan suara seperti itu, secara hipotesis, mungkin setelah beberapa pelatihan. Meskipun ada bidang besar untuk peningkatan dan percobaan, misalnya, Anda dapat menggunakan suara stereo, yang akan memungkinkan Anda untuk memisahkan objek dari sisi yang berbeda, Anda dapat bereksperimen dengan metode lain untuk mengubah gambar menjadi suara, misalnya, menyandikan warna pada frekuensi yang berbeda, dll. Akhirnya, menjanjikan penggunaan kamera 3d yang mampu memahami kedalaman (sayangnya, kamera seperti itu tidak tersedia). Omong-omong, dengan bantuan kode OpenCV sederhana, algoritma di atas dapat disesuaikan untuk menggunakan kamera web, yang akan memungkinkan Anda untuk bereksperimen dengan gambar yang dinamis.
Nah, seperti biasa, semua percobaan berhasil.