Isi kandungan:

Preskripsi Bola Mata Anda: Projek BME60B: 9 Langkah
Preskripsi Bola Mata Anda: Projek BME60B: 9 Langkah

Video: Preskripsi Bola Mata Anda: Projek BME60B: 9 Langkah

Video: Preskripsi Bola Mata Anda: Projek BME60B: 9 Langkah
Video: Моя работа наблюдать за лесом и здесь происходит что-то странное 2024, November
Anonim
Preskripsi Bola Mata Anda: Projek BME60B
Preskripsi Bola Mata Anda: Projek BME60B

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

Ambil Foto
Ambil Foto
Ambil Foto
Ambil Foto
Ambil Foto
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

Muatkan Imej Ke MATLAB
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

Analisis Imej
Analisis Imej
Analisis Imej
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

Hitung Lebar Kotak Putih di Papan Centang
Hitung Lebar Kotak Putih di Papan Centang
Hitung Lebar Kotak Putih di Papan Centang
Hitung Lebar Kotak Putih di Papan Centang
Hitung Lebar Kotak Putih di Papan Centang
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

Ulangi Langkah 3 dan 4 untuk Imej Ujian
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

Hitung Pembesaran Lensa
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

Mencari R-kuasa dua dan Preskripsi Pengguna Melalui Interpolasi
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

Menunjukkan Preskripsi Pengguna pada Graf
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

Ringkas Preskripsi Anda
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: