Daftar Isi:
- Langkah 1: Ambil Foto
- Langkah 2: Muat Gambar Ke MATLAB
- Langkah 3: Analisis Gambar
- Langkah 4: Hitung Lebar Kotak Putih di Kotak-kotak
- Langkah 5: Ulangi Langkah 3 dan 4 untuk Gambar Uji
- Langkah 6: Hitung Perbesaran Lensa
- Langkah 7: Menemukan R-kuadrat dan Resep Pengguna Melalui Interpolasi
- Langkah 8: Menampilkan Resep Pengguna pada Grafik
- Langkah 9: Persempit Resep Anda
Video: Eyeballing Resep Bola Mata Anda: Proyek BME60B: 9 Langkah
2024 Pengarang: John Day | [email protected]. Terakhir diubah: 2024-01-30 09:53
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
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
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
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
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
*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
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
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
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
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:
Resep Kotak Pendamping (Hardware Remix / Circuit Bending): 11 Langkah (dengan Gambar)
Resep Kotak Pendamping (Remix Perangkat Keras / Pembengkokan Sirkuit): Remix perangkat keras adalah cara untuk memeriksa kembali keterjangkauan teknologi musik. Kotak Pendamping adalah alat musik elektronik DIY bengkok sirkuit. Suara yang mereka buat tergantung pada sirkuit yang digunakan. Perangkat yang saya buat berbasis multi-eff
Buat Bug Mata-mata Anda Sendiri (Perekam Suara Arduino): 5 Langkah (dengan Gambar)
Make Your Own Spy Bug (Arduino Voice Recorder): Dalam proyek ini saya akan menunjukkan kepada Anda bagaimana saya menggabungkan Arduino Pro Mini dengan beberapa komponen pelengkap untuk membuat perekam suara yang juga dapat disalahgunakan sebagai bug mata-mata. Ini memiliki waktu berjalan sekitar 9 jam, kecil dan sangat mudah
Retas Baterai 12 Volt! Anda Tidak Akan Percaya Mata Anda!!!!! (diperbarui): 7 Langkah
Retas Baterai 12 Volt! Anda Tidak Akan Percaya Mata Anda!!!!! (diperbarui): Terinspirasi oleh instruksi oleh Kipkay, saya pikir saya akan mengambil beberapa baterai saya sendiri dari merek yang berbeda…Dan, nak, saya terkejut
Robot Sepak Bola (atau Sepak Bola, Jika Anda Tinggal di Sisi Lain Kolam): 9 Langkah (dengan Gambar)
Robot Sepak Bola (atau Sepak Bola, Jika Anda Tinggal di Sisi Lain Kolam): Saya mengajar robotika di tinker-robot-labs.tk Murid-murid saya telah menciptakan robot-robot yang bermain sepak bola (atau sepak bola, jika Anda tinggal di sisi lain kolam). Tujuan saya dengan proyek ini adalah untuk mengajari anak-anak cara berinteraksi dengan robot melalui Bluetooth. Kami
My Tiny Whoop: Resep Whoop + Beberapa Tips dan Trik: 8 Langkah
My Tiny Whoop: a Whoop Recipe + Sedikit Tips dan Trik: PERINGATAN: Anda sekarang memasuki Instructable pertama saya, dan Anda mungkin menemukan banyak kebodohan dan kurangnya perencanaan dan/atau keterampilan. Sadarilah. Ini adalah pengaturan Tiny Whoop pribadi saya yang saya gunakan setiap hari, jadi saya pikir saya akan membagikannya. Ini ramah perjalanan (tidak