Isi kandungan:
- Langkah 1: Ambil Foto
- Langkah 2: Muatkan Imej Ke MATLAB
- Langkah 3: Analisis Imej
- Langkah 4: Hitung Lebar Kotak Putih di Papan Centang
- Langkah 5: Ulangi Langkah 3 dan 4 untuk Imej Ujian
- Langkah 6: Hitung Pembesaran Lensa
- Langkah 7: Mencari R-kuasa dua dan Preskripsi Pengguna Melalui Interpolasi
- Langkah 8: Menunjukkan Preskripsi Pengguna pada Graf
- Langkah 9: Ringkas Preskripsi Anda
Video: Preskripsi Bola Mata Anda: Projek BME60B: 9 Langkah
2024 Pengarang: John Day | [email protected]. Diubah suai terakhir: 2024-01-30 11:07
Oleh: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste
Pembesaran adalah salah satu ciri utama yang terdapat pada kacamata baca, yang dikelaskan berdasarkan resep diopter mereka. Menurut Michigan Technology University, diopter adalah panjang fokus lensa, biasanya diukur dalam mm, dalam unit meter (Michigan Technology University). Oleh kerana kacamata baca mempunyai lensa cembung, panjang fokus akan positif, menyebabkan dioptor juga positif (HyperPhysics). Panjang fokus meningkat apabila jarak antara objek semakin jauh dari lensa sebenar, dan ini menyebabkan dioptor menurun kerana berkadar songsang. Oleh itu, dengan menggunakan cermin mata dengan dioptor tambahan akan membantu lensa memperbesar pandangan sehingga kelihatan seperti panjang fokus kurang dengan meningkatkan nilai diopter.
Kod yang ditunjukkan akan digunakan untuk meramalkan diopter lensa dengan preskripsi yang tidak diketahui. Dua input digunakan untuk menghitung preskripsi: foto latar belakang terkawal tanpa menggunakan lensa apa pun, dan gambar lain dengan latar yang sama tetapi melalui lensa pilihan. Program ini akan mengukur penyelewengan antara kedua-dua gambar ini. Dari sana, kita akan dapat mengira diopter lensa dan menghasilkan hasil yang dapat dilihat oleh pengguna.
Untuk Instructable ini, anda memerlukan:
- Corak papan hitam dan putih yang dicetak pada helaian kertas berukuran 11x8.5
- Kamera dengan keupayaan untuk mengunci fokusnya
- Tripod, atau sesuatu yang serupa untuk mengamankan kamera
- Pelbagai preskripsi cermin mata membaca
- MATLAB
Langkah 1: Ambil Foto
Untuk mengira pembesaran lensa, anda harus dapat membandingkannya dengan ukuran sebenar objek. Untuk projek ini, kami akan membandingkan gambar yang diperbesar dengan gambar kawalan.
Oleh itu, langkah pertama adalah mengambil dua gambar dengan gambar yang sama - yang pertama hanya melalui kamera, dan yang kedua melalui lensa cermin mata bacaan yang ingin anda uji.
Anda akan mengambil gambar papan hitam 8.5x11in dengan kotak 1in. Sediakan kamera anda 11in dari papan centang. Sebelum mengambil gambar, kunci fokus pada papan centang.
Ambil gambar papan tanda tanpa cermin mata membaca. Kemudian, tanpa menggerakkan apa-apa, letakkan cermin mata bacaan di hadapan kamera dan ambil gambar kedua.
Pastikan kedudukan kamera anda tidak bergerak di antara tangkapan. Satu-satunya perkara yang harus berubah antara kedua-dua foto tersebut ialah kehadiran lensa cermin mata di hadapan kamera.
Setelah selesai dengan foto, muat naik ke komputer anda.
Langkah 2: Muatkan Imej Ke MATLAB
Buka skrip baru.
Pertama, tentukan direktori di mana foto disimpan. Kemudian, gunakan fungsi dir untuk mengekstrak gambar-j.webp
Dir = 'C: / Users / kuras / Desktop / class / SQ2 / BME60b / Sandbox / testphotos'; GetDir = dir ('*. Jpg');
Untuk projek kami, kami ingin meminta pengguna program mana fail yang ingin mereka bandingkan. Bahagian pertama meminta pengguna untuk menentukan gambar kawalan, dan yang kedua meminta pengguna untuk menentukan gambar ujian.
- % Tanya pengguna fail mana yang merupakan gambar kawalan.
- Control = input ('# gambar kawalan. / N');
- ControlFile = [GetDir (Control).nama]
- % Tanya pengguna fail mana yang ingin mereka analisa.
- PilihFile = input ('\ n # gambar yang ingin anda analisis. / N');
- PrescripFile = [GetDir (SelectFile).name];
Langkah 3: Analisis Imej
Gambar berwarna dalam MATLAB berukuran MxNx3, sedangkan gambar skala kelabu adalah MxN. Ini bermaksud bahawa lebih cepat untuk meningkatkan / mengedit gambar skala kelabu kerana tidak banyak data yang harus dilacak. Gunakan rgb2gray untuk menukar gambar ke skala kelabu. (Fungsi imrotate digunakan kerana foto kami datang secara mendatar - garis kod ini mungkin atau mungkin tidak diperlukan dalam versi anda.)
- % tukar ke skala kelabu dan putar
- I = imread (ControlFile);
- I = rgb2gray (I);
- I = imrotate (I, 90);
Seterusnya, paparkan gambar. Fungsi subplot digunakan supaya gambar ujian dapat berada di sebelah kawalan pada langkah-langkah kemudian.
- % paparan
- Rajah 1);
- subplot (1, 2, 1)
- imshow (I);
- tajuk (ControlFile);
Gunakan imcrop untuk meminta pengguna memotong papan centang dari gambar penuh. Kod berikut juga menunjukkan kotak mesej untuk memberikan arahan kepada pengguna.
- % keluarkan papan kenyataan untuk analisis
- waitfor (msgbox ({'Gunakan rambut salib untuk memotong papan centang.', 'Kemudian kawasan klik dua kali menarik.'}));
- I_crop = imcrop (I);
Gunakan imbinarize untuk membinari gambar.
I_binary = imbinarize (I_crop);
Langkah 4: Hitung Lebar Kotak Putih di Papan Centang
Seterusnya, minta pengguna melukis garis melintasi gambar menggunakan imline. Garis ini harus bergerak secara melintang di papan papan. Ia mesti bermula dan berakhir di kotak hitam (tidak kira di mana) - ini kerana kita akan mengukur lebar kotak putih, bukan yang hitam.
- % garis garisan
- Rajah 1)
- subplot (1, 2, 1)
- imshow (I_binary);
- waitfor (msgbox ({'Klik dan seret untuk menarik garis yang merangkumi 9 kotak, dari ruang hitam ke ruang hitam.', 'Klik dua kali untuk mengesahkan.'}));
- garis = imline;
- kedudukan = tunggu (barisan);
- titik akhir = line.getPosition;
Ekstrak kodinat X dan Y untuk titik akhir garis yang dilukis.
- X = titik akhir (:, 1)
- Y = titik akhir (:, 2);
Gunakan profil untuk menghasilkan graf berdasarkan intensiti yang terdapat di sepanjang garis yang dilukis. Ini harus menyerupai gelombang persegi mulai dari 0 (hitam) hingga 1 (putih). Hitung puncak dan lokasi mereka juga.
- angka (2)
- subplot (1, 2, 1)
- tajuk ('Intensiti gambar melintasi garis tidak profil (Kawalan)')
- tidak profil (I_binary, X, Y); grid dihidupkan;
- [~, ~, c1, ~, ~] = improfile (I_binary, X, Y);
- [puncak, loc] = findpeaks (c1 (:,:, 1));
- tahan
- plot (loc, puncak, 'ro');
- menahan
Cari panjang setiap dataran tinggi pada graf profil menggunakan gelung untuk. Jalankan loop for untuk jumlah puncak yang sama dengan grafik tidak profil. Untuk mengira panjang setiap dataran tinggi, gunakan fungsi 'cari' untuk mencari semua lokasi di mana terdapat '1' dan bukannya nilai intensiti '0'. Kemudian, hitung panjang susunan itu untuk mendapatkan jumlah panjang dataran tinggi, yang harus sama dengan lebar kotak putih dalam piksel. ControlPlateauList = nol (1, panjang (loc));
untuk i = 1: panjang (loc)
jika i == panjang (loc)
dataran tinggi = cari (c1 (loc (i): akhir,:, 1));
yang lain
dataran tinggi = cari (c1 (loc (i): loc (i + 1) -1,:, 1));
akhir
ControlPlateauList (i) = panjang (dataran tinggi);
akhir
Langkah 5: Ulangi Langkah 3 dan 4 untuk Imej Ujian
* Catatan: ketika melukis garis tidak profil pada gambar uji, pastikan untuk melukisnya melintasi kotak yang sesuai dengan garis yang anda gambar pada gambar kawalan.
Langkah 6: Hitung Pembesaran Lensa
Pengukuran yang diperbesar dikira dengan membahagi rata-rata panjang dataran tinggi, yang dihitung pada langkah 5, dengan panjang panjang dataran tinggi kawalan, yang dihitung pada langkah 4. Ini dikira menjadi 1.0884.
pembesaran = min (plateauList) / min (ControlPlateauList);
Langkah 7: Mencari R-kuasa dua dan Preskripsi Pengguna Melalui Interpolasi
Menggunakan kod:
- md1 = fitlm (GivenPrescription, MagArray);
- Rsquared = md1. Rsquared. Biasa;
Kita dapat menjumpai nilai R-kuadrat dari grafik GivenPresciption (nilai lensa kita yang diberikan) berbanding MagArray (susunan nisbah ukuran pembesaran yang kita kira sebelumnya). Dengan mempunyai nilai R-kuadrat yang cukup tinggi, dapat disimpulkan bahawa ada korelasi yang cukup kuat untuk membenarkan penggunaan kaedah ini. Untuk kes ini, nilai R-kuadrat adalah 0.9912, yang menunjukkan korelasi yang kuat dan oleh itu dibenarkan menggunakan kaedah ini dalam analisis.
Menggunakan fungsi:
Preskripsi = interp1 (MagArray, GivenPrescription, pembesaran, 'linear');
Kita boleh menginterpolasi nilai preskripsi yang sesuai (pada paksi-x) nisbah pembesaran kita (nilai pada paksi-y) dan mencari apa preskripsi pengguna.
Data interpolasi penting untuk kaedah ini berfungsi kerana membolehkan kita membuat andaian mengenai maklumat yang tidak kita miliki, berdasarkan maklumat yang kita ada. Walaupun garis yang paling sesuai secara teknikal akan menjadi calon yang lebih kuat untuk anggapan ini, mewujudkan batasan untuk mengurangkan jumlah output memberikan kesan yang sama seperti kacamata preskripsi dengan nilai seragam tambahan pula. Ini dijelaskan dalam langkah-langkah kemudian.
Langkah 8: Menunjukkan Preskripsi Pengguna pada Graf
Menggunakan kod berikut:
- angka;
- plot (Diberi Preskripsi, MagArray, '-g')
- tahan
- plot (Preskripsi, pembesaran, 'bp')
- menahan
- grid
- legenda ('Data', 'Titik Interpolasi', 'Lokasi', 'NW')
Kami dapat memplot grafik yang menunjukkan Nisbah Pembesaran berbanding Preskripsi Diberikan dengan garis hijau dan data yang dijumpai pembesaran kami yang dikira berbanding dengan preskripsi interpolasi kami dengan bintang biru. Kemudian legenda melabel tajuk, paksi-x, dan paksi-y dan meletakkan legenda di sudut kiri atas.
Langkah 9: Ringkas Preskripsi Anda
Kod berikut digunakan untuk menghasilkan pembundaran untuk preskripsi:
-
jika Preskripsi <= 1.125
CalculatedPrescription = '1.0';
-
otherif Preskripsi <= 1.375
CalculatedPrescription = '1.25';
-
otherif Preskripsi <= 1.625
CalculatedPrescription = '1.5';
-
otherif Preskripsi <= 1.875
CalculatedPrescription = '1.75';
-
otherif Preskripsi <= 2.25
CalculatedPrescription = '2.0';
-
otherif Preskripsi <= 2.625
CalculatedPrescription = '2.5';
-
otherif Preskripsi <= 3
CalculatedPrescription = '2.75';
-
otherif Preskripsi <= 3.375
CalculatedPrescription = '3.25';
-
yang lain
CalculatedPrescription = 'tidak diketahui';
- akhir
Preskripsi yang dijumpai melalui interpolasi tidak semestinya mencerminkan preskripsi yang sebenarnya - ini kerana akan selalu ada sedikit variasi dalam menganalisis foto kerana kesalahan manusia. Oleh itu, kita memerlukan langkah ini untuk mengklasifikasikan preskripsi sebenar.
Preskripsi yang diberikan biasanya bermula dari 1,0 diopter dan meningkat sebanyak 0,25 dalam preskripsi mereka, jadi setelah mengira preskripsi, kami ingin menentukan preskripsi yang paling sesuai dengan apa yang mungkin diperlukan oleh pengguna. Setelah mengira preskripsi, kami menjalankannya melalui pernyataan If yang diberikan untuk memeriksa nilainya dan menentukan preskripsi mana yang diperlukan. Apa-apa yang kurang daripada atau sama dengan 1.125, maka preskripsi adalah 1.0. Yang kurang daripada atau sama dengan 1.375, preskripsi adalah 1.25. Yang kurang daripada atau sama dengan 1.625, preskripsi adalah 1.5. Yang kurang daripada atau sama dengan 1.845, preskripsi adalah 1.75. Dan sebagainya.
Kami mempunyai nilai yang meningkat sejak kami memeriksa apakah nilainya kurang dari. Sekiranya kita melakukan penurunan nilai maka pernyataan if pertama akan membaca pernyataan if pertama sepanjang masa. Sekiranya preskripsi adalah yang terkecil, kami ingin segera mengiktirafnya sebagai yang terkecil, jadi itulah sebabnya nilai terkecil adalah yang kami mulakan. Apa-apa yang lebih tinggi daripada nilai tertinggi bermaksud bahawa preskripsi tidak sesuai dengan data kami, jadi itu akan memberikan bacaan rentetan "Tidak diketahui".
Disyorkan:
Labu Halloween Dengan Mata Animatronik Bergerak - Labu Ini Dapat Melancarkan Mata !: 10 Langkah (dengan Gambar)
Labu Halloween Dengan Mata Animatronik Bergerak | Labu Ini Dapat Melancarkan Mata !: Dalam Instruksional ini, anda akan belajar bagaimana membuat labu Halloween yang menakutkan semua orang ketika matanya bergerak. Sesuaikan jarak pemicu sensor ultrasonik ke nilai yang tepat (langkah 9), dan labu anda akan membatu siapa sahaja yang berani mengambil cand
Hack Bateri 12 Volt! Anda tidak akan mempercayai mata anda !!!!! (dikemas kini): 7 Langkah
Hack Bateri 12 Volt! Anda tidak akan mempercayai mata anda !!!!! (dikemas kini): Diilhamkan oleh Kipkay yang diarahkan oleh saya, saya fikir saya akan mengambil beberapa bateri saya sendiri dari jenama yang berbeza … Dan, nak, adakah saya terkejut
Penjaga Mata: Perlindungan Mata yang Dipicu oleh Suara: 9 Langkah (dengan Gambar)
Penjaga Mata: Perlindungan Mata yang Dipicu oleh Suara: Eye Guardian adalah suara berterusan Arduino, High-Decibel yang memicu keausan pelindung mata. Ia mengesan bunyi alat berat dan menurunkan kacamata pelindung semasa peralatan sedang digunakan. Garis Besar Pada langkah pertama, saya akan menerangkan Inspirati
Robot Bola Sepak (atau Bola Sepak, Jika Anda Hidup di Sebelah Kolam): 9 Langkah (dengan Gambar)
Robot Bola Sepak (atau Bola Sepak, Sekiranya Anda Hidup di Sebelah Kolam): Saya mengajar robotik di tinker-robot-labs.tk Murid saya telah mencipta robot ini yang bermain bola sepak (atau bola sepak, jika anda tinggal di seberang kolam). Tujuan saya dengan projek ini adalah untuk mengajar anak-anak bagaimana berinteraksi dengan robot melalui Bluetooth. Kami
Menonton Cermin Mata Membaca Gerhana (dan Tidak Membakar Mata Saya): 4 Langkah (dengan Gambar)
Menonton Gelas Bacaan Eclipse Throught (dan Tidak Membakar Mata Saya): Hei, adakah saya tahu rasa ingin tahu anda dengan tajuk saya? Ayah saya juga melakukannya, semasa kami berjalan di Montr lama &alacute; al semalam, dia menarik cermin matanya dan menunjukkan kepada saya bagaimana untuk melihat bagaimana melihat gerhana yang berfikir kacamata pembacanya. Jadi semua yang