Cuprins:

Globul ocular Prescripția globului ocular: un proiect BME60B: 9 pași
Globul ocular Prescripția globului ocular: un proiect BME60B: 9 pași

Video: Globul ocular Prescripția globului ocular: un proiect BME60B: 9 pași

Video: Globul ocular Prescripția globului ocular: un proiect BME60B: 9 pași
Video: OCHIUL ORGAN AL VEDERII 2024, Noiembrie
Anonim
Globul ocular Prescripția globului ocular: un proiect BME60B
Globul ocular Prescripția globului ocular: un proiect BME60B

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

Mărirea este una dintre caracteristicile cheie prezente pentru ochelarii de lectură, care se clasifică după prescripția lor de dioptrii. Potrivit Universității Tehnologice din Michigan, o dioptrie este o distanță focală a obiectivului, de obicei măsurată în mm, în unitatea de metri (Michigan Technology University). Deoarece ochelarii de lectură au lentile convexe, distanța focală ar fi pozitivă, determinând și dioptriile să fie pozitive (HyperPhysics). Distanța focală crește pe măsură ce distanța dintre obiect se îndepărtează de obiectivul propriu-zis și acest lucru duce dioptriile să scadă, deoarece acestea sunt invers proporționale. Prin urmare, dacă aveți ochelari de lectură cu dioptrii suplimentare, ar ajuta obiectivul să măriți vederea, astfel încât să pară că distanța focală este mai mică prin creșterea valorii dioptriilor.

Codul prezentat va fi utilizat pentru a prezice dioptria unui obiectiv cu o rețetă necunoscută. Două intrări sunt utilizate pentru a calcula rețeta: o fotografie a fundalului controlat fără a utiliza lentile și o altă fotografie cu același fundal, dar prin obiectivul ales. Programul va măsura distorsiunea dintre aceste două fotografii. De acolo, vom putea estima dioptria obiectivului și vom produce un rezultat pentru vizualizare de către utilizator.

Pentru acest instructabil, veți avea nevoie de:

  • Un model de tablă alb-negru imprimat pe o coală de hârtie de 11x8,5 in
  • O cameră cu capacitatea de a-și bloca focalizarea
  • Un trepied sau ceva similar pentru a fixa camera
  • Diverse rețete de ochelari de lectură
  • MATLAB

Pasul 1: Faceți fotografii

A face poze
A face poze
A face poze
A face poze
A face poze
A face poze

Pentru a calcula mărirea unui obiectiv, trebuie să îl puteți compara cu dimensiunea reală a obiectului. Pentru acest proiect, vom compara o imagine mărită cu o imagine de control.

Astfel, primul pas este de a face două fotografii ale aceleiași imagini - prima doar prin intermediul camerei și a doua prin obiectivul ochelarilor de lectură pe care doriți să le testați.

Veți face o fotografie a unui tablă de damă alb-negru de 8,5x11in cu o grilă de 1in. Configurați camera foto la 11in distanță de tablă de damă. Înainte de a face fotografiile, blocați focalizarea pe tablă de damă.

Faceți o fotografie a șahului fără ochelarii de lectură. Apoi, fără a mișca nimic, așezați ochelarii de lectură în fața camerei și faceți a doua fotografie.

Asigurați-vă că poziția camerei dvs. nu se mișcă între fotografii. Singurul lucru care ar trebui să se schimbe între cele două fotografii este prezența obiectivului ochelarilor în fața camerei.

Când ați terminat cu fotografiile, încărcați-le pe computer.

Pasul 2: Încărcați imaginile în MATLAB

Încărcați imaginile în MATLAB
Încărcați imaginile în MATLAB

Deschideți un nou script.

Mai întâi, specificați directorul în care sunt stocate fotografiile. Apoi, utilizați funcția dir pentru a extrage imagini-j.webp

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

Pentru proiectul nostru, am dorit să solicităm utilizatorului programului fișierele pe care doreau să le compare. Prima secțiune cere utilizatorului să specifice imaginea de control, iar a doua cere utilizatorului să specifice imaginea de testare.

  • % Întrebați utilizatorul care fișier este imaginea de control.
  • Control = input ('# de imagine de control. / N');
  • ControlFile = [GetDir (Control).name]
  • % Întrebați utilizatorul care fișier este imaginea pe care dorește să o analizeze.
  • Alegeți fișier = input ('\ n # de imagine pe care doriți să o analizați. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

Pasul 3: Analiza imaginii

Analiza imaginii
Analiza imaginii
Analiza imaginii
Analiza imaginii

O imagine colorată în MATLAB are dimensiunea MxNx3, în timp ce o imagine în tonuri de gri este MxN. Aceasta înseamnă că este mai rapid să îmbunătățiți / editați o imagine în tonuri de gri, deoarece există mai puține date de care să urmăriți. Utilizați rgb2gray pentru a converti imaginea în tonuri de gri. (Funcția de imrotare a fost utilizată deoarece fotografiile noastre au fost orizontale - această linie de cod poate fi sau nu necesară în versiunea dvs.)

  • % convertiți în tonuri de gri și rotiți
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotează (I, 90);

Apoi, afișați imaginea. Funcția de subplot este utilizată astfel încât imaginea de testare să poată fi lângă control în pașii ulteriori.

  • %afişa
  • figura 1);
  • subtrama (1, 2, 1)
  • imshow (I);
  • titlu (ControlFile);

Utilizați imcrop pentru a solicita utilizatorului să decupeze șahul din imaginea completă. Următorul cod arată, de asemenea, o casetă de mesaj pentru a oferi instrucțiuni utilizatorului.

  • % decupați tablă de șah pentru analiză
  • waitfor (msgbox ({'Utilizați firele încrucișate pentru a decupa tabloul de șah.', 'Apoi faceți dublu clic pe zona de interes.'}));
  • I_crop = imcrop (I);

Utilizați imbinarizați pentru a binariza imaginea.

I_binary = imbinarize (I_crop);

Pasul 4: Calculați lățimea pătratelor albe de pe tablă

Calculați lățimea pătratelor albe de pe tablă
Calculați lățimea pătratelor albe de pe tablă
Calculați lățimea pătratelor albe de pe tablă
Calculați lățimea pătratelor albe de pe tablă
Calculați lățimea pătratelor albe de pe tablă
Calculați lățimea pătratelor albe de pe tablă

Apoi, solicitați utilizatorului să deseneze o linie peste imagine folosind imline. Această linie ar trebui să ruleze orizontal pe tablă. Ar trebui să înceapă și să se termine pe un pătrat negru (nu contează unde) - asta pentru că vom măsura lățimea pătratelor albe, nu a celor negre.

  • % trasează linia
  • figura 1)
  • subtrama (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Faceți clic și trageți pentru a trasa linia care acoperă 9 casete, de la un spațiu negru la un spațiu negru.', 'Faceți dublu clic pentru a confirma.'}));
  • line = imline;
  • poziție = wait (line);
  • puncte finale = line.getPosition;

Extrageți codurile X și Y pentru punctele finale ale liniei trasate.

  • X = puncte finale (:, 1)
  • Y = puncte finale (:, 2);

Folosiți improfil pentru a produce un grafic bazat pe intensitățile găsite de-a lungul liniei trasate. Aceasta ar trebui să semene cu o undă pătrată variind de la 0 (negru) la 1 (alb). Calculați și vârfurile și locațiile lor.

  • figura (2)
  • subtrama (1, 2, 1)
  • title („Intensitatea imaginii peste linia de neprofil (Control)”)
  • improfil (I_binar, X, Y); grilă pe;
  • [~, ~, c1, ~, ~] = improfil (I_binar, X, Y);
  • [peaks, loc] = findpeaks (c1 (:,:, 1));
  • stai asa
  • complot (loc, vârfuri, 'ro');
  • stai departe

Găsiți lungimea fiecărui platou pe graficul neprofilat folosind o buclă for. Rulați bucla for pentru aceeași cantitate de vârfuri care există în graficul de neprofil. Pentru a calcula lungimea fiecărui platou, utilizați funcția „găsiți” pentru a găsi toate locațiile în care există un „1” în loc de o valoare a intensității „0”. Apoi, calculați lungimea matricei pentru a obține lungimea totală a platoului, care ar trebui să fie egală cu lățimea unui pătrat alb în pixeli. ControlPlateauList = zerouri (1, lungime (loc));

pentru i = 1: lungime (loc)

dacă i == lungime (loc)

platou = find (c1 (loc (i): end,:, 1));

altceva

platou = find (c1 (loc (i): loc (i + 1) -1,:, 1));

Sfârșit

ControlPlateauList (i) = lungime (platou);

Sfârșit

Pasul 5: Repetați pașii 3 și 4 pentru imaginea de testare

Repetați pașii 3 și 4 pentru imaginea de testare
Repetați pașii 3 și 4 pentru imaginea de testare

* Notă: atunci când trageți linia de improfil pe imaginea de test, asigurați-vă că o trasați pe pătratele care corespund liniei pe care ați tras-o pe imaginea de control.

Pasul 6: Calculați mărirea obiectivului

Calculați mărirea obiectivului
Calculați mărirea obiectivului

Măsurătorile mărite sunt calculate prin împărțirea mediei lungimii platoului, care a fost calculată la pasul 5, la media lungimii platoului martor, care a fost calculată la pasul 4. Aceasta este calculată la 1,0884.

mărire = medie (plateauList) / medie (ControlPlateauList);

Pasul 7: Găsirea R-pătrat și prescripția utilizatorului prin interpolare

Găsirea R-pătrat și prescripția utilizatorului prin interpolare
Găsirea R-pătrat și prescripția utilizatorului prin interpolare

Folosind codul:

  • md1 = fitlm (DatePrescription, MagArray);
  • Rsquared = md1. Rsquared. Ordinary;

Putem găsi valoarea pătrată R a graficului Prescripție dată (valorile date ale obiectivelor noastre) față de MagArray (o serie de rapoarte de măsurare a măririi pe care le-am calculat mai devreme). Având o valoare R-pătrat suficient de mare, se poate deduce că există o corelație suficient de puternică pentru a justifica utilizarea acestei metode. Pentru acest caz particular, valoarea R-pătrat a fost 0,9912, ceea ce sugerează o corelație puternică și, prin urmare, sunt justificate în utilizarea acestei metode în analiză.

Folosind funcția:

Prescripție = interp1 (MagArray, Prescripție dată, mărire, „liniară”);

Putem interpola valoarea prescripției corespunzătoare (pe axa x) a raportului nostru de mărire (o valoare pe axa y) și să găsim care este prescripția utilizatorului.

Interpolarea datelor este importantă pentru ca această metodă să funcționeze, deoarece ne permite să facem presupuneri despre informații pe care nu le avem, pe baza informațiilor pe care le avem. În timp ce o linie de potrivire optimă ar fi din punct de vedere tehnic un candidat mai puternic pentru această ipoteză, crearea de limite pentru a reduce numărul de ieșiri are același efect ca ochelarii de prescripție să vină în valori uniforme incrementale oricum. Acest lucru este explicat în etape ulterioare.

Pasul 8: Afișarea prescripției utilizatorului pe un grafic

Se afișează prescripția utilizatorului pe un grafic
Se afișează prescripția utilizatorului pe un grafic

Folosind următorul cod:

  • figura;
  • complot (DatePrescription, MagArray, '-g')
  • stai asa
  • complot (Prescripție, mărire, „bp”)
  • stai departe
  • grilă
  • legendă („Date”, „Puncte interpolate”, „Locație”, „NW”)

Putem trasa un grafic care prezintă ratele de mărire față de prescripția dată cu o linie verde și datele găsite ale măririi noastre calculate față de prescripția noastră interpolată cu o stea albastră. Apoi legenda etichetează titlul, axa x și axa y și plasează legenda în colțul din stânga sus.

Pasul 9: restrângeți prescripția

Restrângeți prescripția
Restrângeți prescripția

Următorul cod este utilizat pentru a produce rotunjirea prescripției:

  • dacă Prescripție <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Prescripție <= 1.375

    CalculatedPrescription = '1,25';

  • elseif Prescripție <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Prescripție <= 1.875

    CalculatedPrescription = '1.75';

  • elseif Prescripție <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Prescripție <= 2.625

    CalculatedPrescription = '2.5';

  • elseif Prescripție <= 3

    CalculatedPrescription = '2.75';

  • elseif Prescripție <= 3.375

    CalculatedPrescription = '3.25';

  • altceva

    CalculatedPrescription = 'necunoscut';

  • Sfârșit

Prescripția găsită prin interpolare nu reflectă neapărat prescripția efectivă - acest lucru se datorează faptului că vor exista întotdeauna ușoare variații în analiza fotografiei din cauza unei erori umane. Astfel, avem nevoie de acest pas pentru a clasifica rețeta efectivă.

Rețetele care se dau încep de obicei de la 1,0 dioptrii și cresc cu 0,25 în prescripțiile lor, astfel încât, după calcularea rețetei, dorim să determinăm rețeta care se potrivește cel mai bine cu ceea ce ar putea avea nevoie utilizatorul. După calcularea prescripției, o rulăm prin instrucțiunile If date pentru a verifica valoarea acesteia și pentru a determina care prescripție este necesară. Orice mai mic sau egal cu 1.125, atunci prescripția este 1.0. Orice mai mic sau egal cu 1,375, prescripția este de 1,25. Orice mai mic sau egal cu 1.625, prescripția este de 1.5. Orice mai mic sau egal cu 1,845, prescripția este de 1,75. Si asa mai departe.

Valorile cresc, deoarece verificăm dacă valorile sunt mai mici de. Dacă am face valorile descrescătoare, atunci prima instrucțiune if ar citi prima instrucțiune if tot timpul. Dacă prescripția este cea mai mică, dorim ca aceasta să o recunoască drept cea mai mică imediat, deci de aceea am început cu cea mai mică valoare. Orice valoare mai mare decât cea mai mare valoare înseamnă că rețeta nu este în raza de date cu datele noastre, așa că va da citirea șirului „Necunoscut”.

Recomandat: