Daftar Isi:

Eyeballing Resep Bola Mata Anda: Proyek BME60B: 9 Langkah
Eyeballing Resep Bola Mata Anda: Proyek BME60B: 9 Langkah

Video: Eyeballing Resep Bola Mata Anda: Proyek BME60B: 9 Langkah

Video: Eyeballing Resep Bola Mata Anda: Proyek BME60B: 9 Langkah
Video: How to Build a Sparkleball 2024, Juli
Anonim
Eyeballing Resep Eyeball Anda: Proyek BME60B
Eyeballing Resep Eyeball Anda: Proyek BME60B

Oleh: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste

Pembesaran adalah salah satu fitur utama yang ada untuk kacamata baca, yang diklasifikasikan berdasarkan resep dioptrinya. Menurut Universitas Teknologi Michigan, diopter adalah panjang fokus lensa, biasanya diukur dalam mm, dalam satuan meter (Universitas Teknologi Michigan). Karena kacamata baca memiliki lensa cembung, panjang fokusnya akan positif, menyebabkan dioptri menjadi positif juga (HyperPhysics). Panjang fokus meningkat saat jarak antara objek semakin jauh dari lensa sebenarnya, dan ini menyebabkan dioptri berkurang karena berbanding terbalik. Oleh karena itu, memiliki kacamata baca dengan dioptri tambahan akan membantu lensa untuk memperbesar tampilan sehingga tampak seperti panjang fokus yang berkurang dengan meningkatkan nilai dioptri.

Kode yang disajikan akan digunakan untuk memprediksi dioptri lensa dengan resep yang tidak diketahui. Dua input digunakan untuk menghitung resep: foto dengan latar belakang terkontrol tanpa menggunakan lensa apa pun, dan foto lain dengan latar belakang yang sama tetapi melalui lensa pilihan. Program akan mengukur distorsi antara dua foto ini. Dari sana, kami akan dapat memperkirakan diopter lensa dan menghasilkan hasil yang dapat dilihat pengguna.

Untuk Instruksi ini, Anda akan membutuhkan:

  • Pola kotak-kotak hitam-putih yang dicetak pada selembar kertas berukuran 11x8,5
  • Kamera dengan kemampuan mengunci fokusnya
  • Tripod, atau sesuatu yang serupa untuk mengamankan kamera
  • Berbagai resep kacamata baca
  • MATLAB

Langkah 1: Ambil Foto

Ambil foto
Ambil foto
Ambil foto
Ambil foto
Ambil foto
Ambil foto

Untuk menghitung perbesaran lensa, Anda harus dapat membandingkannya dengan ukuran objek yang sebenarnya. Untuk proyek ini, kami akan membandingkan gambar yang diperbesar dengan gambar kontrol.

Jadi, langkah pertama adalah mengambil dua foto dari gambar yang sama - yang pertama hanya melalui kamera, dan yang kedua melalui lensa kacamata baca yang ingin Anda uji.

Anda akan mengambil gambar papan catur hitam putih berukuran 8,5x11 inci dengan kisi 1 inci. Siapkan kamera Anda 11in dari papan catur. Sebelum mengambil foto, kunci fokus pada kotak-kotak.

Ambil foto papan catur tanpa kacamata baca. Kemudian, tanpa menggerakkan apa pun, letakkan kacamata baca di depan kamera dan ambil foto kedua.

Pastikan posisi kamera Anda tidak bergerak di antara pemotretan. Satu-satunya hal yang harus diubah di antara kedua foto tersebut adalah keberadaan lensa kacamata di depan kamera.

Setelah selesai dengan foto, unggah ke komputer Anda.

Langkah 2: Muat Gambar Ke MATLAB

Muat Gambar Ke MATLAB
Muat Gambar Ke MATLAB

Buka skrip baru.

Pertama, tentukan direktori tempat foto disimpan. Kemudian, gunakan fungsi dir untuk mengekstrak gambar-j.webp

Dir = 'C:\Users\kuras\Desktop\classes\SQ2\BME60b\Sandbox\testphotos'; GetDir = dir('*.jpg');

Untuk proyek kami, kami ingin meminta pengguna program untuk file mana yang ingin mereka bandingkan. Bagian pertama meminta pengguna untuk menentukan gambar kontrol, dan yang kedua meminta pengguna untuk menentukan gambar uji.

  • %Tanyakan kepada pengguna file mana yang merupakan gambar kontrol.
  • Kontrol = input('# gambar kontrol.\n');
  • ControlFile = [GetDir(Kontrol).nama]
  • %Tanyakan kepada pengguna file mana yang merupakan gambar yang ingin mereka analisis.
  • ChooseFile = input('\n# gambar yang ingin Anda analisis.\n');
  • PrescripFile = [GetDir(ChooseFile).nama];

Langkah 3: Analisis Gambar

Analisis Gambar
Analisis Gambar
Analisis Gambar
Analisis Gambar

Gambar berwarna dalam MATLAB berukuran MxNx3, sedangkan gambar abu-abu berukuran MxN. Ini berarti lebih cepat untuk meningkatkan/mengedit gambar skala abu-abu karena lebih sedikit data yang harus dilacak. Gunakan rgb2gray untuk mengonversi gambar menjadi skala abu-abu. (Fungsi imrotate digunakan karena foto kami dibuat horizontal - baris kode ini mungkin diperlukan atau tidak diperlukan dalam versi Anda.)

  • %konversi ke skala abu-abu dan putar
  • I = imread(ControlFile);
  • I = rgb2abu-abu(I);
  • I = imrotate(I, 90);

Selanjutnya, tampilkan gambar. Fungsi subplot digunakan agar citra uji dapat berada di sebelah kontrol pada langkah selanjutnya.

  • %menampilkan
  • Gambar 1);
  • subplot(1, 2, 1)
  • imshow(saya);
  • judul(File Kontrol);

Gunakan imcrop untuk meminta pengguna memotong papan catur dari gambar penuh. Kode berikut juga menunjukkan kotak pesan untuk memberikan instruksi kepada pengguna.

  • %pangkas papan catur untuk analisis
  • waitfor(msgbox({'Gunakan tanda silang untuk memotong kotak-kotak.', 'Kemudian klik dua kali area yang diinginkan.'}));
  • I_crop = imcrop(I);

Gunakan imbinarize untuk binerisasi gambar.

I_binary = imbinarize(I_crop);

Langkah 4: Hitung Lebar Kotak Putih di Kotak-kotak

Hitung Lebar Kotak Putih di Checkerboard
Hitung Lebar Kotak Putih di Checkerboard
Hitung Lebar Kotak Putih di Kotak-kotak
Hitung Lebar Kotak Putih di Kotak-kotak
Hitung Lebar Kotak Putih di Kotak-kotak
Hitung Lebar Kotak Putih di Kotak-kotak

Selanjutnya, minta pengguna untuk menggambar garis melintasi gambar menggunakan imline. Garis ini harus berjalan secara horizontal melintasi papan catur. Itu harus dimulai dan diakhiri dengan kotak hitam (tidak masalah di mana)- ini karena kita akan mengukur lebar kotak putih, bukan yang hitam.

  • %tarik garis
  • Gambar 1)
  • subplot(1, 2, 1)
  • imshow(I_biner);
  • waitfor(msgbox({'Klik dan seret untuk menggambar garis yang membentang 9 kotak, dari ruang hitam ke ruang hitam.', 'Klik dua kali untuk mengonfirmasi.'}));
  • garis = imline;
  • posisi = tunggu(baris);
  • titik akhir = line.getPosition;

Ekstrak koordinat X dan Y untuk titik akhir dari garis yang ditarik.

  • X = titik akhir(:, 1)
  • Y = titik akhir(:, 2);

Gunakan improfile untuk menghasilkan grafik berdasarkan intensitas yang ditemukan di sepanjang garis yang ditarik. Ini harus menyerupai gelombang persegi mulai dari 0 (hitam) hingga 1 (putih). Hitung juga puncak dan lokasinya.

  • Gambar 2)
  • subplot(1, 2, 1)
  • title('Intensitas gambar melintasi garis improfile (Kontrol)')
  • improfile(I_biner, X, Y); jaringan pada;
  • [~, ~, c1, ~, ~] = improfile(I_biner, X, Y);
  • [puncak, loc] = findpeaks(c1(:,:, 1));
  • tunggu
  • plot(loc, puncak, 'ro');
  • bertahan

Cari panjang masing-masing dataran tinggi pada grafik improfile menggunakan for loop. Jalankan for loop untuk jumlah puncak yang sama dengan yang ada di grafik improfile. Untuk menghitung panjang setiap dataran tinggi, gunakan fungsi 'temukan' untuk menemukan semua lokasi di mana terdapat nilai intensitas '1' dan bukan '0'. Kemudian, hitung panjang larik tersebut untuk mendapatkan total panjang dataran tinggi, yang seharusnya sama dengan lebar kotak putih dalam piksel. ControlPlateauList = zeros(1, length(loc));

untuk i = 1:panjang(lokasi)

jika saya == panjang (lokasi)

dataran tinggi = temukan(c1(loc(i):end,:, 1));

lain

dataran tinggi = temukan(c1(loc(i):loc(i+1)-1,:, 1));

akhir

ControlPlateauList(i) = panjang(dataran tinggi);

akhir

Langkah 5: Ulangi Langkah 3 dan 4 untuk Gambar Uji

Ulangi Langkah 3 dan 4 untuk Gambar Uji
Ulangi Langkah 3 dan 4 untuk Gambar Uji

*Catatan: saat menggambar garis improfile pada gambar uji, pastikan untuk menggambarnya melintasi kotak yang sesuai dengan garis yang Anda gambar pada gambar kontrol.

Langkah 6: Hitung Perbesaran Lensa

Hitung Perbesaran Lensa
Hitung Perbesaran Lensa

Pengukuran yang diperbesar dihitung dengan membagi rata-rata panjang dataran, yang dihitung pada langkah 5, dengan rata-rata panjang dataran kontrol, yang dihitung pada langkah 4. Ini dihitung menjadi 1,0884.

perbesaran = mean(daftardataran)/berarti(ControlPlateauList);

Langkah 7: Menemukan R-kuadrat dan Resep Pengguna Melalui Interpolasi

Menemukan R-kuadrat dan Resep Pengguna Melalui Interpolasi
Menemukan R-kuadrat dan Resep Pengguna Melalui Interpolasi

Menggunakan kode:

  • md1 = fitlm(Diberikan Resep, MagArray);
  • Rkuadrat = md1. Rkuadrat. Biasa;

Kita dapat menemukan nilai R-kuadrat dari grafik GivenPresciption (nilai yang diberikan lensa kita) vs. MagArray (rangkaian rasio pengukuran perbesaran yang kita hitung sebelumnya). Dengan memiliki nilai R-squared yang cukup tinggi, dapat disimpulkan bahwa terdapat korelasi yang cukup kuat untuk membenarkan penggunaan metode ini. Untuk kasus khusus ini, nilai R-kuadrat adalah 0,9912, yang menunjukkan korelasi yang kuat dan oleh karena itu dibenarkan dalam menggunakan metode ini dalam analisis.

Menggunakan fungsi:

Resep = interp1(MagArray, GivenPrescription, magnification, 'linear');

Kami dapat menginterpolasi nilai resep yang sesuai (pada sumbu x) dari rasio perbesaran kami (nilai pada sumbu y) dan menemukan resep pengguna.

Interpolasi data penting agar metode ini berfungsi karena memungkinkan kita membuat asumsi tentang informasi yang tidak kita miliki, berdasarkan informasi yang kita miliki. Sementara garis yang paling cocok secara teknis akan menjadi kandidat yang lebih kuat untuk asumsi ini, menciptakan batasan untuk mengurangi jumlah output memiliki efek yang sama seperti kacamata resep datang dalam nilai seragam tambahan. Ini dijelaskan dalam langkah-langkah selanjutnya.

Langkah 8: Menampilkan Resep Pengguna pada Grafik

Menampilkan Resep Pengguna pada Grafik
Menampilkan Resep Pengguna pada Grafik

Menggunakan kode berikut:

  • angka;
  • plot(Diberikan Resep, MagArray, '-g')
  • tunggu
  • plot(Resep, pembesaran, 'bp')
  • bertahan
  • kisi-kisi
  • legend('Data', 'Poin Interpolasi', 'Lokasi', 'NW')

Kami dapat memplot grafik yang menunjukkan Rasio Pembesaran versus Resep yang Diberikan dengan garis hijau dan data yang ditemukan dari perbesaran yang dihitung versus resep interpolasi kami dengan bintang biru. Kemudian legenda memberi label judul, sumbu x, dan sumbu y dan menempatkan legenda di sudut kiri atas.

Langkah 9: Persempit Resep Anda

Persempit Resep Anda
Persempit Resep Anda

Kode berikut digunakan untuk menghasilkan pembulatan untuk resep:

  • jika Resep <= 1,125

    Hitung Resep = '1.0';

  • elseif Resep <= 1.375

    Hitung Resep = '1,25';

  • elseif Resep <= 1.625

    Hitung Resep = '1,5';

  • elseif Resep <= 1.875

    Hitung Resep = '1,75';

  • elseif Resep <= 2.25

    Hitung Resep = '2.0';

  • elseif Resep <= 2.625

    Hitung Resep = '2,5';

  • elseif Resep <= 3

    Hitung Resep = '2,75';

  • elseif Resep <= 3.375

    Hitung Resep = '3,25';

  • lain

    Hitung Resep = 'tidak diketahui';

  • akhir

Resep yang ditemukan melalui interpolasi belum tentu mencerminkan resep yang sebenarnya -- ini karena akan selalu ada sedikit variasi dalam menganalisis foto karena kesalahan manusia. Dengan demikian, kita membutuhkan langkah ini untuk mengklasifikasikan resep yang sebenarnya.

Resep yang diberikan biasanya dimulai dari 1,0 dioptri dan bertambah 0,25 dalam resepnya, jadi setelah menghitung resep kami ingin menentukan resep yang paling sesuai dengan kebutuhan pengguna. Setelah menghitung resep, kami menjalankannya melalui pernyataan If yang diberikan untuk memeriksa nilainya dan menentukan resep mana yang diperlukan. Apa pun yang kurang dari atau sama dengan 1,125, maka resepnya adalah 1,0. Apa pun yang kurang dari atau sama dengan 1,375, resepnya adalah 1,25. Apa pun yang kurang dari atau sama dengan 1,625, resepnya adalah 1,5. Apa pun yang kurang dari atau sama dengan 1,845, resepnya adalah 1,75. Dan seterusnya.

Kami memiliki nilai yang meningkat karena kami memeriksa apakah nilainya kurang dari. Jika kita melakukan penurunan nilai maka pernyataan if pertama akan membaca pernyataan if pertama sepanjang waktu. Jika resep adalah yang terkecil, kami ingin segera mengenalinya sebagai yang terkecil, jadi itulah mengapa nilai terkecil adalah apa yang kami mulai. Apa pun yang lebih tinggi dari nilai tertinggi berarti resep tidak sesuai dengan data kami, sehingga akan memberikan pembacaan string "Tidak Diketahui".

Direkomendasikan: