Cuprins:
- Pasul 1: Faceți fotografii
- Pasul 2: Încărcați imaginile în MATLAB
- Pasul 3: Analiza imaginii
- Pasul 4: Calculați lățimea pătratelor albe de pe tablă
- Pasul 5: Repetați pașii 3 și 4 pentru imaginea de testare
- Pasul 6: Calculați mărirea obiectivului
- Pasul 7: Găsirea R-pătrat și prescripția utilizatorului prin interpolare
- Pasul 8: Afișarea prescripției utilizatorului pe un grafic
- Pasul 9: restrângeți prescripția
Video: Globul ocular Prescripția globului ocular: un proiect BME60B: 9 pași
2024 Autor: John Day | [email protected]. Modificat ultima dată: 2024-01-30 11:41
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
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
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
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ă
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
* 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
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
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
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
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:
Electronic Magic 8 Ball și glob ocular: 11 pași (cu imagini)
Ball Magic 8 și glob ocular electronic: am vrut să creez o versiune digitală a Magic 8 Ball … Corpul acestuia este imprimat 3D și afișajul a fost schimbat dintr-un poliedru în vopsea albastră într-un OLED mic controlat de un număr aleatoriu generator programat într-un Arduino NANO. Apoi eu
Mecanism animatronic dublu ocular tipărit 3D simplificat: 4 pași (cu imagini)
Mecanism animatronic cu ochi dubli tipărit 3D simplificat: După ce am construit în trecut un mecanism simplu cu un singur ochi, am vrut să îmbunătățesc designul și să îl fac mai accesibil pentru comunitatea producătorilor. Ansamblul actualizat folosește piese care pot fi cumpărate cu ușurință online și aproape toate componentele pot
(POV) Persistența globului vizual: 8 pași (cu imagini)
(POV) Persistența Vision Globe:! Actualizare! Am adăugat un program Excel care face mult mai ușor să deseneze și să codeze imagini noi! O simplă persistență a globului vizual. PLAY VIDEO Acesta este un proiect pe care l-am avut în minte de ceva timp și „Make It Glow” concursul a fost doar
Ocular CCD pentru binoclu: 4 pași (cu imagini)
Ocular CCD pentru binoclu: v-ați uitat vreodată prin binoclu și v-ați gândit „aș vrea să pot obține asta pe bandă”? Ei bine, acum poți. În acest instructable vă voi arăta cum să construiți un ocular CCD ieftin care să se potrivească majorității binoclurilor. O puteți folosi cu orice cameră video care
Bec cu LED-uri pentru adaptarea globului ocular Halo 998: 8 pași
Reconstruirea becului LED pentru garnitura globului ocular Halo 998: Această instrucțiune descrie cum se modifică piesele garniturii globului ocular Halo 998 pentru a accepta becul regulabil LumiSelect PAR / R16 de la earthled.com. Becul LED este prea mare pentru a se potrivi prin deschiderea globului ocular al garniturii. piesă, dar cu un pic de ef