Mundarija:

Ko'z qorachig'ining retsepti: BME60B loyihasi: 9 qadam
Ko'z qorachig'ining retsepti: BME60B loyihasi: 9 qadam

Video: Ko'z qorachig'ining retsepti: BME60B loyihasi: 9 qadam

Video: Ko'z qorachig'ining retsepti: BME60B loyihasi: 9 qadam
Video: Ko’zlar Uchun 5 Ta Super Mahsulot! (Zudlik Bilan Taomnomangizga Kiriting!) 2024, Noyabr
Anonim
Ko'zoynakning retsepti: BME60B loyihasi
Ko'zoynakning retsepti: BME60B loyihasi

Muallif: Xanna Silos, Sang Xi Kim, Tomas Vaskes, Patrik Viste

Kattalashtirish - ko'zoynak o'qish uchun mavjud bo'lgan asosiy xususiyatlardan biri bo'lib, ular diopterlarning retseptiga ko'ra tasniflanadi. Michigan Texnologiya Universitetining ma'lumotlariga ko'ra, diopter - bu linzalarning fokus uzunligi, odatda mm bilan o'lchanadi, metr birligida (Michigan Texnologiya Universiteti). O'qish ko'zoynaklarining konveks linzalari bo'lgani uchun, fokus uzunligi ijobiy bo'ladi, bu esa diopterlarning ham ijobiy bo'lishiga olib keladi (HyperPhysics). Ob'ekt orasidagi masofa haqiqiy linzadan uzoqlashganda fokus uzunligi oshadi va bu diopterlarni teskari proportsional bo'lgani uchun kamayishiga olib keladi. Shuning uchun, qo'shimcha diopterli o'qish ko'zoynaklari bo'lsa, diopterlar qiymatini oshirib, fokus masofasi qisqaroq bo'lib tuyulishi uchun linzalarning ko'rinishini yaqinlashtirishga yordam beradi.

Taqdim etilgan kod noma'lum retsepti bo'lgan linzalarning diopteriyasini taxmin qilish uchun ishlatiladi. Retseptni hisoblash uchun ikkita kirish ishlatiladi: hech qanday linzalarni ishlatmasdan boshqariladigan fonning fotosurati va bir xil fonda, lekin tanlangan ob'ektiv orqali. Dastur ushbu ikkita fotosurat orasidagi buzilishlarni o'lchaydi. U erdan biz linzalarning diopterini baholay olamiz va foydalanuvchi ko'rishi uchun natija beradi.

Ushbu ko'rsatma uchun sizga kerak bo'ladi:

  • 11x8,5 o'lchamdagi qog'ozga bosilgan qora-oq shashka
  • Fokusni qulflash qobiliyatiga ega kamera
  • Tripod yoki kamerani himoya qilish uchun shunga o'xshash narsa
  • O'qish ko'zoynaklarining turli retseptlari
  • MATLAB

1 -qadam: Rasmga oling

Suratga olmoq
Suratga olmoq
Suratga olmoq
Suratga olmoq
Suratga olmoq
Suratga olmoq

Ob'ektivning kattalashishini hisoblash uchun siz uni ob'ektning haqiqiy o'lchamiga solishtirishingiz kerak. Ushbu loyiha uchun biz kattalashtirilgan tasvirni nazorat tasviri bilan taqqoslaymiz.

Shunday qilib, birinchi qadam bir xil tasvirning ikkita fotosuratini olishdir - birinchisi - faqat kamera orqali, ikkinchisi - o'qishni xohlagan ko'zoynak linzalari orqali.

Siz 1 dyuymli 8,5x11 dyuymli qora va oq shashka rasmini olasiz. Kamerani shaxmat taxtasidan 11 dyuym masofada joylashtiring. Rasmga tushirishdan oldin, diqqatni shaxmat taxtasiga qulflang.

O'qish ko'zoynagisiz shaxmat taxtasini suratga oling. Keyin, hech narsani qimirlatmasdan, o'qish ko'zoynagini kamera oldiga qo'ying va ikkinchi rasmni oling.

Kameraning joylashuvi tortishish orasida harakat qilmasligiga ishonch hosil qiling. Ikkita fotosurat orasida o'zgarishi kerak bo'lgan yagona narsa - bu kamera oldida ko'zoynak linzalari bo'lishi.

Rasmlar tugagach, ularni kompyuteringizga yuklang.

2 -qadam: Rasmlarni MATLAB -ga yuklang

Rasmlarni MATLAB -ga yuklang
Rasmlarni MATLAB -ga yuklang

Yangi skriptni oching.

Birinchidan, fotosuratlar saqlanadigan katalogni ko'rsating. Keyin,-j.webp

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

Loyihamiz uchun biz faylni solishtirmoqchi bo'lgan dastur foydalanuvchisiga taklif qilmoqchi edik. Birinchi bo'lim foydalanuvchidan nazorat tasvirini, ikkinchisi esa foydalanuvchidan test tasvirini ko'rsatishni so'raydi.

  • %Foydalanuvchidan qaysi rasm boshqaruvchi rasm ekanligini so'rang.
  • Control = input ('nazorat tasvirining soni. / N');
  • ControlFile = [GetDir (Control).name]
  • %Foydalanuvchidan qaysi faylni tahlil qilmoqchi ekanligini so'rang.
  • SelectFile = kiritish ('\ n# tahlil qilmoqchi bo'lgan rasm. / N');
  • PrescripFile = [GetDir (SelectFile). Nomi];

3 -qadam: tasvirni tahlil qilish

Rasm tahlili
Rasm tahlili
Rasm tahlili
Rasm tahlili

MATLAB -dagi rangli tasvir MxNx3 o'lchamli, kulrang tasvir MxN. Bu shuni anglatadiki, kulrang o'lchovli tasvirni kuchaytirish/tahrir qilish tezroq, chunki uni kuzatib boradigan ma'lumotlar kamroq. Rasmni kul rangga o'tkazish uchun rgb2gray -dan foydalaning. (Imrotate funktsiyasi bizning rasmlarimiz gorizontal holatda bo'lgani uchun ishlatilgan - bu kod satri sizning versiyangizda kerak bo'lishi mumkin yoki bo'lmasligi mumkin.)

  • %kul rangga aylanadi va aylanadi
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotat (I, 90);

Keyin rasmni ko'rsating. Subplot funktsiyasi test tasviri keyingi bosqichlarda boshqaruvning yonida bo'lishi uchun ishlatiladi.

  • %ko'rsatish
  • rasm (1);
  • kichik reja (1, 2, 1)
  • imshow (I);
  • sarlavha (ControlFile);

Imcrop -dan foydalanib, foydalanuvchidan shaxmat taxtasini to'liq tasvirdan olib tashlashni so'rang. Quyidagi kod shuningdek, foydalanuvchiga ko'rsatmalar berish uchun xabar qutisini ko'rsatadi.

  • %tahlil qilish uchun shaxmat taxtasini kesib tashlang
  • waitfor (msgbox ({'Shaxmat taxtasini kesish uchun kesishgan sochlardan foydalaning.', 'Keyin qiziqish maydonini ikki marta bosing.')));
  • I_crop = imcrop (I);

Rasmni binarizatsiya qilish uchun imbinarize -dan foydalaning.

I_binary = imbinarize (I_crop);

4 -qadam: shaxmat taxtasidagi oq kvadratlarning kengligini hisoblang

Shashka taxtasidagi oq kvadratlarning kengligini hisoblang
Shashka taxtasidagi oq kvadratlarning kengligini hisoblang
Shashka taxtasidagi oq kvadratlarning kengligini hisoblang
Shashka taxtasidagi oq kvadratlarning kengligini hisoblang
Shashka taxtasidagi oq kvadratlarning kengligini hisoblang
Shashka taxtasidagi oq kvadratlarning kengligini hisoblang

Keyin, foydalanuvchidan imline yordamida tasvir bo'ylab chiziq chizishni so'rang. Bu chiziq shaxmat taxtasi bo'ylab gorizontal ravishda o'tishi kerak. U qora kvadratdan boshlanishi va tugashi kerak (qaerda bo'lishining ahamiyati yo'q)- chunki biz qora maydonlarni emas, balki oq kvadratlarning kengligini o'lchaymiz.

  • %chiziq chizish
  • raqam (1)
  • kichik reja (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Qora bo'shliqdan qora bo'shliqgacha 9 qutini qamrab olgan chiziq chizish uchun bosing va torting.', 'Tasdiqlash uchun ikki marta bosing.')));
  • chiziq = imline;
  • pozitsiya = kutish (chiziq);
  • so'nggi nuqtalar = line.getPosition;

Chizilgan chiziqning oxirgi nuqtalari uchun X va Y koordinatalarini ajratib oling.

  • X = oxirgi nuqtalar (:, 1)
  • Y = oxirgi nuqtalar (:, 2);

Chizilgan chiziq bo'ylab aniqlangan intensivlikka asoslangan grafikni ishlab chiqarish uchun "noto'g'ri" dan foydalaning. Bu 0 (qora) dan 1 (oq) gacha bo'lgan to'rtburchaklar to'lqinga o'xshash bo'lishi kerak. Cho'qqilar va ularning joylarini ham hisoblang.

  • raqam (2)
  • kichik reja (1, 2, 1)
  • sarlavha ('Tasvirning noto'g'ri chizig'i bo'ylab intensivligi (Boshqarish)')
  • nomaqbul (I_binary, X, Y); tarmoq yoqilgan;
  • [~, ~, c1, ~, ~] = mos kelmaydigan (I_binary, X, Y);
  • [Peaks, loc] = findpeaks (c1 (:,,: 1));
  • to'xtab tur
  • uchastka (lok, tepaliklar, 'ro');
  • ushlab turing

For loop yordamida har bir platoning uzunligini mos bo'lmagan grafikdan toping. Grafikda mavjud bo'lgan bir xil cho'qqilar uchun for loopini ishga tushiring. Har bir platoning uzunligini hisoblash uchun "topish" funktsiyasidan foydalanib, "0" intensivlik o'rniga "1" bo'lgan hamma joylarni toping. So'ngra, oq kvadratning kengligi pikselga teng bo'lishi kerak bo'lgan platoning umumiy uzunligini olish uchun bu qatorning uzunligini hisoblang. ControlPlateauList = nol (1, length (loc));

i = 1 uchun: uzunlik (loc)

agar men == uzunlik (joy)

plato = topish (c1 (loc (i): oxiri,:, 1));

boshqa

plato = topish (c1 (loc (i): loc (i+1) -1,:, 1)));

oxiri

ControlPlateauList (i) = uzunlik (plato);

oxiri

5 -qadam: Sinov tasviri uchun 3 va 4 -qadamlarni takrorlang

Sinov tasviri uchun 3 va 4 -qadamlarni takrorlang
Sinov tasviri uchun 3 va 4 -qadamlarni takrorlang

*Eslatma: test tasviriga mos bo'lmagan chiziqni chizayotganda, uni nazorat tasviriga chizilgan chiziqqa mos keladigan kvadratlar bo'ylab chizganingizga ishonch hosil qiling.

6 -qadam: Ob'ektivning kattalashishini hisoblang

Ob'ektivning kattalashishini hisoblang
Ob'ektivning kattalashishini hisoblang

Kattalashtirilgan o'lchovlar 5 -qadamda hisoblangan platoning uzunligini 4 -bosqichda hisoblangan nazorat platosining uzunligiga bo'linish yo'li bilan hisoblanadi. Bu 1,0884 ga teng.

kattalashtirish = o'rtacha (platoList)/o'rtacha (ControlPlateauList);

7-qadam: Interpolatsiya orqali R-kvadrat va foydalanuvchi retseptini topish

Interpolatsiya orqali R-kvadrat va foydalanuvchining retseptini topish
Interpolatsiya orqali R-kvadrat va foydalanuvchining retseptini topish

Kodni ishlatish:

  • md1 = fitlm (GivenPrescription, MagArray);
  • Rsquared = md1. Rsquared. Ordinal;

Biz GivenPresciption (bizning linzalarimiz berilgan qiymatlar) va MagArray (biz ilgari hisoblagan kattalashtirish o'lchovlari nisbatlarining massivi) grafigining R-kvadrat qiymatini topa olamiz. R-kvadratning etarlicha yuqori qiymatiga ega bo'lgan holda, bu usuldan foydalanishni asoslash uchun etarlicha kuchli korrelyatsiya mavjud degan xulosaga kelish mumkin. Bu alohida holat uchun R-kvadrat qiymati 0,9912 edi, bu kuchli korrelyatsiyani ko'rsatadi va shuning uchun tahlilda bu usuldan foydalanishga asos bo'ladi.

Funktsiyadan foydalanish:

Prescription = interp1 (MagArray, GivenPrescription, kattalashtirish, 'chiziqli');

Biz kattalashtirish koeffitsientining mos keladigan retsept qiymatini (x o'qida) interpolatsiya qilishimiz mumkin (y o'qidagi qiymat) va foydalanuvchining retsepti nima ekanligini bilib olamiz.

Bu usulning ishlashi uchun interpolyatsiya ma'lumotlari muhim ahamiyatga ega, chunki bizda mavjud bo'lmagan ma'lumotlarga asoslanib, bizda mavjud bo'lmagan ma'lumotlar haqida taxmin qilish mumkin. Texnik jihatdan bu taxminga eng mos keladigan chiziq texnik jihatdan kuchliroq nomzod bo'lardi, lekin chiqish sonini kamaytirish uchun chegaralar yaratish xuddi shunday ta'sir ko'rsatadi, chunki ko'zoynak bir xil qiymatga ega. Bu keyingi bosqichlarda tushuntiriladi.

8 -qadam: Foydalanuvchining retseptini grafikda ko'rsatish

Foydalanuvchining retseptini grafikda ko'rsatish
Foydalanuvchining retseptini grafikda ko'rsatish

Quyidagi kod yordamida:

  • raqam;
  • syujet (GivenPrescription, MagArray, '-g')
  • to'xtab tur
  • syujet (retsept, kattalashtirish, "bp")
  • ushlab turing
  • panjara
  • afsona ("Ma'lumotlar", "Interpolatsiyalangan nuqtalar", "Manzil", "NW")

Biz kattalashtirish nisbatlarini berilgan retsept bo'yicha yashil chiziq bilan ko'rsatadigan grafikni va ko'k yulduzli interpolatsiyalangan retseptimizga nisbatan hisoblangan kattalashtirish ma'lumotlarini chizishimiz mumkin. Keyin afsona sarlavha, x o'qi va y o'qini belgilaydi va afsonani chap yuqori burchakka qo'yadi.

9 -qadam: retseptingizni toraytiring

Retseptni toraytiring
Retseptni toraytiring

Retseptni yaxlitlash uchun quyidagi kod ishlatiladi:

  • agar retsept <= 1.125 bo'lsa

    CalculatedPrescription = '1.0';

  • elseif retsept <= 1.375

    CalculatedPrescription = '1.25';

  • elseif retsept <= 1.625

    CalculatedPrescription = '1.5';

  • elseif retsept <= 1.875

    CalculatedPrescription = '1,75';

  • elseif retsept <= 2.25

    CalculatedPrescription = '2.0';

  • elseif retsept <= 2.625

    CalculatedPrescription = '2.5';

  • elseif retsept <= 3

    CalculatedPrescription = '2.75';

  • elseif retsept <= 3.375

    CalculatedPrescription = '3.25';

  • boshqa

    CalculatedPrescription = 'noma'lum';

  • oxiri

Interpolatsiya orqali topilgan retsept, albatta, haqiqiy retseptni aks ettirmaydi - buning sababi shundaki, inson xatosi tufayli fotosuratni tahlil qilishda har doim ozgina farqlar bo'ladi. Shunday qilib, haqiqiy retseptni tasniflash uchun bizga bu qadam kerak.

Beriladigan retseptlar odatda 1,0 diopterdan boshlanadi va retsept bo'yicha.25 ga ko'payadi, shuning uchun retseptni hisoblagandan so'ng biz foydalanuvchiga kerak bo'lishi mumkin bo'lgan retseptni aniqlamoqchimiz. Retseptni hisoblab chiqqandan so'ng, biz uning qiymatini tekshirish va qaysi retsept zarurligini aniqlash uchun berilgan If iboralaridan o'tamiz. Hamma narsa 1.125 dan kichik yoki unga teng bo'lsa, retsept 1,0 ga teng. 1.375 dan kam yoki teng bo'lgan narsa, retsept 1.25. 1.625 dan kam yoki teng bo'lgan narsa, retsept 1,5 ga teng. Har qanday narsa 1,845 dan kam yoki teng bo'lsa, retsept 1,75 ni tashkil qiladi. Va hokazo.

Bizda qiymatlar o'sib bormoqda, chunki biz qiymatlar kichikroqligini tekshiramiz. Agar biz qiymatlarni kamaytirgan bo'lsak, birinchi if iborasi har doim birinchi if ifodasini o'qiydi. Agar retsept eng kichik bo'lsa, biz uni darhol eng kichigi deb tan olishni xohlaymiz, shuning uchun eng kichik qiymat biz boshlagan narsadir. Eng yuqori qiymatdan yuqori bo'lgan narsa, retsept bizning ma'lumotlarga mos kelmasligini anglatadi, shuning uchun u "Noma'lum" satr o'qilishini beradi.

Tavsiya: