Sisällysluettelo:
- Vaihe 1: Ota valokuvia
- Vaihe 2: Lataa kuvat MATLABiin
- Vaihe 3: Kuva -analyysi
- Vaihe 4: Laske ruudukon valkoisten neliöiden leveys
- Vaihe 5: Toista vaiheet 3 ja 4 testikuvalle
- Vaihe 6: Laske linssin suurennos
- Vaihe 7: R-neliön ja käyttäjän reseptin löytäminen interpoloinnin avulla
- Vaihe 8: Käyttäjän reseptin näyttäminen kaaviossa
- Vaihe 9: Supista reseptiäsi
Video: Silmämunan määrääminen: BME60B -projekti: 9 vaihetta
2024 Kirjoittaja: John Day | [email protected]. Viimeksi muokattu: 2024-01-30 08:59
Kirjailija: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste
Suurennus on yksi tärkeimmistä ominaisuuksista, jotka ovat läsnä lukulaseissa, jotka luokitellaan diopterien määräämisen mukaan. Michiganin teknillisen yliopiston mukaan diopteri on linssin polttoväli, yleensä mitattuna millimetreinä (Michiganin teknillinen yliopisto). Koska lukulaseissa on kupera linssi, polttoväli olisi positiivinen, jolloin myös diopterit olisivat positiivisia (HyperPhysics). Polttoväli kasvaa, kun kohteen välinen etäisyys on kauempana todellisesta linssistä, ja tämä johtaa diopterien pienenemiseen, koska ne ovat kääntäen verrannollisia. Siksi lukulaseilla, joissa on lisää diopteria, autettaisiin linssiä lähentämään näkymää niin, että saattaa näyttää siltä, että polttoväli on pienempi lisäämällä diopterien arvoa.
Esitettyä koodia käytetään ennustamaan linssin diopteria, jonka resepti on tuntematon. Reseptin laskemiseen käytetään kahta sisääntuloa: valokuva hallitusta taustasta ilman linssien käyttöä ja toinen valokuva samasta taustasta, mutta valitun linssin läpi. Ohjelma mittaa näiden kahden valokuvan välisen vääristymän. Sieltä voimme arvioida linssin diopterin ja tuottaa tuloksen, jota käyttäjä voi katsella.
Tätä Instructable -ohjelmaa varten tarvitset:
- Mustavalkoinen ruudullinen kuvio, joka on painettu 11 x 8,5 paperiarkkiin
- Kamera, jolla on mahdollisuus lukita tarkennus
- Jalusta tai jotain vastaavaa kameran kiinnittämiseksi
- Erilaisia lukulaseja
- MATLAB
Vaihe 1: Ota valokuvia
Jotta voit laskea linssin suurennuksen, sinun on voitava verrata sitä kohteen todelliseen kokoon. Tässä projektissa vertaamme suurennettua kuvaa kontrollikuvaan.
Näin ollen ensimmäinen askel on ottaa kaksi kuvaa samasta kuvasta - ensimmäinen vain kameran läpi ja toinen testattavien lukulasejen linssin läpi.
Otat kuvan 8,5 x 11 tuuman mustavalkoisesta ruudusta, jossa on 1 tuuman ruudukko. Aseta kamera 11 asteen etäisyydelle tarkistuspöydältä. Lukitse tarkennus ruudulle ennen valokuvien ottamista.
Ota valokuva ruudusta ilman lukulaseja. Aseta sitten lukulaseja kameran eteen siirtämättä mitään ja ota toinen valokuva.
Varmista, että kameran sijainti ei liiku kuvien välillä. Ainoa asia, jonka pitäisi muuttua kahden kuvan välillä, on lasilinssi kameran edessä.
Kun olet valmis valokuvien kanssa, lataa ne tietokoneellesi.
Vaihe 2: Lataa kuvat MATLABiin
Avaa uusi skripti.
Määritä ensin hakemisto, johon valokuvat on tallennettu. Pura sitten-j.webp
Dir = 'C: / Users / kuras / Desktop / class / SQ2 / BME60b / Sandbox / testphotos'; GetDir = dir ('*. Jpg');
Projektissamme halusimme pyytää ohjelman käyttäjää, mitä tiedostoja he halusivat vertailla. Ensimmäinen osa pyytää käyttäjää määrittämään kontrollikuvan ja toinen pyytää käyttäjää määrittämään testikuvan.
- %Kysy käyttäjältä, mikä tiedosto on ohjauskuva.
- Control = tulo ('ohjauskuvan#. / N');
- ControlFile = [GetDir (Control).name]
- %Kysy käyttäjältä, mikä tiedosto on kuva, jonka hän haluaa analysoida.
- ChooseFile = input ('\ n# kuva, jonka haluat analysoida. / N');
- PrescripFile = [GetDir (Valitse tiedosto).nimi];
Vaihe 3: Kuva -analyysi
MATLABin värillinen kuva on kooltaan MxNx3, kun taas harmaasävyinen kuva on MxN. Tämä tarkoittaa, että harmaasävykuvan parantaminen/muokkaaminen on nopeampaa, koska seurattavia tietoja on vähemmän. Käytä rgb2gray -muotoa muuntaaksesi kuvan harmaasävyiseksi. (Imrotate -toimintoa käytettiin, koska valokuvamme tulivat vaakasuoraan - tämä koodirivi saattaa olla välttämätön versiossa.)
- %muuntaa harmaasävyiksi ja kiertää
- I = imread (ControlFile);
- I = rgb2harmaa (I);
- I = imrotate (I, 90);
Näytä seuraavaksi kuva. Alakuvaustoimintoa käytetään niin, että testikuva voi olla ohjausobjektin vieressä myöhemmissä vaiheissa.
- %näyttö
- Kuvio 1);
- osakaavio (1, 2, 1)
- imshow (I);
- otsikko (ControlFile);
Käytä imcropia kehottamaan käyttäjää rajaamaan tarkistuslauta koko kuvasta. Seuraava koodi näyttää myös viestiruudun, jossa annetaan ohjeita käyttäjälle.
- %rajaus ruudukko analyysiä varten
- waitfor (msgbox ({Rajaa ristikkäitä ruutulautaa. ',' Sitten kaksoisnapsauta kiinnostavaa aluetta. '}));
- I_crop = imcrop (I);
Käytä imbinarize -asetusta kuvan binarisoimiseksi.
I_binary = imbinarize (I_crop);
Vaihe 4: Laske ruudukon valkoisten neliöiden leveys
Pyydä seuraavaksi käyttäjää piirtämään viiva kuvan päälle imline -ohjelmalla. Tämän viivan tulisi kulkea vaakasuoraan ruudukon poikki. Sen pitäisi alkaa ja päättyä mustalle neliölle (ei ole väliä missä)- tämä johtuu siitä, että mittaamme valkoisten neliöiden leveyden, ei mustien neliöiden.
- %piirustusviiva
- Kuvio 1)
- osakaavio (1, 2, 1)
- imshow (I_binary);
- waitfor (msgbox ({'Napsauta ja vedä vetääksesi viiva, joka ulottuu yhdeksästä ruudusta mustasta tilasta mustaan tilaan.', 'Vahvista kaksoisnapsauttamalla.'});
- rivi = imline;
- asema = odota (rivi);
- päätepisteet = line.getPosition;
Pura X- ja Y -koodinaatit piirretyn viivan päätepisteille.
- X = päätepisteet (:, 1)
- Y = päätepisteet (:, 2);
Käytä improfileä kaavion luomiseen vedetyn viivan pitkin löydettyjen intensiteettien perusteella. Tämän pitäisi muistuttaa neliöaaltoa, joka vaihtelee välillä 0 (musta) - 1 (valkoinen). Laske myös huiput ja niiden sijainnit.
- kuva (2)
- osakaavio (1, 2, 1)
- title ('Kuvan voimakkuus koko improfiililinjan yli (Control)')
- improfile (I_binary, X, Y); ruudukko päällä;
- [~, ~, c1, ~, ~] = improfile (I_binary, X, Y);
- [piikit, paikannus] = löytöhuiput (c1 (:,:, 1));
- pidä kiinni
- juoni (loc, huiput, 'ro');
- pitää loitolla
Etsi jokaisen tasangon pituus improfile -kaaviosta käyttämällä for -silmukkaa. Suorita for -silmukka samaan määrään huippuja, jotka ovat improfile -kaaviossa. Voit laskea kunkin tasangon pituuden etsimistoiminnon avulla löytääksesi kaikki paikat, joissa on 1 -intensiteettiarvon sijasta 1. Laske sitten taulukon pituus saadaksesi tasangon kokonaispituuden, jonka pitäisi olla yhtä suuri kuin valkoisen neliön leveys pikseleinä. ControlPlateauList = nollia (1, pituus (loc));
i = 1: pituus (loc)
jos i == pituus (loc)
tasangolla = löytö (c1 (loc (i): loppu,:, 1));
muu
tasangolla = löytö (c1 (loc (i): loc (i+1) -1,:, 1));
loppuun
ControlPlateauList (i) = pituus (tasangolla);
loppuun
Vaihe 5: Toista vaiheet 3 ja 4 testikuvalle
*Huomautus: kun piirrät improfile -viivan testikuvaan, muista piirtää se niiden neliöiden yli, jotka vastaavat kontrollikuvaan piirtämääsi viivaa.
Vaihe 6: Laske linssin suurennos
Suurennetut mittaukset lasketaan jakamalla tasangon pituuden keskiarvo, joka laskettiin vaiheessa 5, vaiheessa 4 lasketun kontrollitasangon pituuden keskiarvolla. Tämän lasketaan olevan 1,0884.
suurennus = keskiarvo (tasangolista)/keskiarvo (vertailutasolista);
Vaihe 7: R-neliön ja käyttäjän reseptin löytäminen interpoloinnin avulla
Käyttämällä koodia:
- md1 = fitlm (GivenPrescription, MagArray);
- Rsquared = md1. Rsquared. Ordinary;
Löydämme kaavion R-neliöarvon GivenPresciption (linssillemme annetut arvot) vs. MagArray (taulukko aiemmin laskemistamme suurennussuhteista). Kun R-neliöarvo on riittävän korkea, voidaan päätellä, että on olemassa riittävän vahva korrelaatio, joka oikeuttaa tämän menetelmän käytön. Tässä tapauksessa R-neliöarvo oli 0,9912, mikä viittaa vahvaan korrelaatioon ja on siksi perusteltua käyttää tätä menetelmää analyysissä.
Toiminnon käyttäminen:
Prescription = interp1 (MagArray, GivenPrescription, suurennos, 'lineaarinen');
Voimme interpoloida suurennussuhteemme vastaavan reseptiarvon (x-akselilla) (arvo y-akselilla) ja selvittää, mikä on käyttäjän resepti.
Tietojen interpolointi on tärkeää tämän menetelmän toimimiseksi, koska sen avulla voimme tehdä oletuksia tiedoista, joita meillä ei ole, niiden tietojen perusteella, joita meillä on. Vaikka parhaiten sopiva linja olisi teknisesti vahvempi ehdokas tälle olettamukselle, rajojen luominen tulosten määrän vähentämiseksi palvelee samaa vaikutusta kuin reseptilasit tulevat joka tapauksessa tasaisin arvoin. Tämä selitetään myöhemmissä vaiheissa.
Vaihe 8: Käyttäjän reseptin näyttäminen kaaviossa
Käyttämällä seuraavaa koodia:
- kuva;
- juoni (GivenPrescription, MagArray, '-g')
- pidä kiinni
- juoni (resepti, suurennus, 'bp')
- pitää loitolla
- ruudukko
- selite ('Data', 'Interpoloidut pisteet', 'Sijainti', 'NW')
Voimme piirtää kaavion, joka näyttää suurennussuhteet annetun reseptin suhteen vihreällä viivalla ja lasketun suurennuksen löydetyt tiedot verrattuna sinisellä tähdellä interpoloituun reseptiimme. Sitten selite merkitsee otsikon, x-akselin ja y-akselin ja sijoittaa selitteen vasempaan yläkulmaan.
Vaihe 9: Supista reseptiäsi
Seuraavaa koodia käytetään reseptin pyöristämiseen:
-
jos resepti <= 1,125
CalculatedPrescription = '1.0';
-
elseif Resepti <= 1,375
CalculatedPrescription = '1,25';
-
elseif Resepti <= 1.625
CalculatedPrescription = '1.5';
-
elseif Resepti <= 1.875
CalculatedPrescription = '1,75';
-
elseif Resepti <= 2,25
CalculatedPrescription = '2.0';
-
elseif Resepti <= 2.625
CalculatedPrescription = '2.5';
-
elseif Resepti <= 3
CalculatedPrescription = '2.75';
-
elseif Resepti <= 3.375
CalculatedPrescription = '3.25';
-
muu
CalculatedPrescription = 'tuntematon';
- loppuun
Interpoloinnin avulla löydetty resepti ei välttämättä vastaa todellista reseptiä - tämä johtuu siitä, että valokuvan analysoinnissa on aina pieniä vaihteluita inhimillisen erehdyksen vuoksi. Siksi tarvitsemme tämän vaiheen luokitellakseen todellisen reseptin.
Annetut reseptit alkavat yleensä 1,0 diopterista ja lisääntyvät niiden määräyksissä 0,25: llä, joten reseptin laskemisen jälkeen haluamme määrittää reseptin, joka parhaiten sopii käyttäjälle. Reseptin laskemisen jälkeen käymme sen läpi annetuissa If -lausunnoissa sen arvon tarkistamiseksi ja tarvittavan reseptin määrittämiseksi. Kaikki alle tai yhtä suuri kuin 1.125, niin resepti on 1.0. Kaikki alle 1,375, resepti on 1,25. Kaikki mikä on pienempi tai yhtä suuri kuin 1,625, resepti on 1,5. Kaikki alle tai yhtä suuri kuin 1,845, resepti on 1,75. Ja niin edelleen.
Arvot kasvavat, koska tarkistamme, ovatko arvot pienempiä kuin. Jos teemme arvot pienenevät, ensimmäinen if -lause lukee ensimmäisen if -lauseen koko ajan. Jos resepti on pienin, haluamme sen tunnistavan sen pienimmäksi heti, joten pienin arvo on se, mistä aloitimme. Kaikki mitä korkeampi arvo tarkoittaa, että resepti ei ole tietojemme alueella, joten se antaa "Tuntematon" -merkkijonon.
Suositeltava:
DIY Raspberry Pi Downloadbox: 4 vaihetta
DIY Raspberry Pi Downloadbox: Löydätkö usein itsesi lataamasta suuria tiedostoja, kuten elokuvia, torrentteja, kursseja, TV -sarjoja jne., Niin tulet oikeaan paikkaan. Tässä Instructable -ohjelmassa muuttaisimme Raspberry Pi zero -laitteemme latauskoneeksi. Joka voi ladata minkä tahansa
Akustinen levitaatio Arduino Unon kanssa Askel askeleelta (8 vaihetta): 8 vaihetta
Akustinen levitaatio Arduino Unon kanssa Askel askeleelta (8 vaihetta): ultraäänikaiuttimet L298N DC-naarasadapterin virtalähde urospuolisella dc-nastalla ja analogiset portit koodin muuntamiseksi (C ++)
4G/5G HD -videon suoratoisto DJI Dronesta alhaisella latenssilla [3 vaihetta]: 3 vaihetta
4G/5G HD -videon suoratoisto DJI Dronesta alhaisella latenssilla [3 vaihetta]: Seuraava opas auttaa sinua saamaan live-HD-videovirtoja lähes mistä tahansa DJI-dronesta. FlytOS -mobiilisovelluksen ja FlytNow -verkkosovelluksen avulla voit aloittaa videon suoratoiston droonilta
Pultti - DIY -langaton latauskello (6 vaihetta): 6 vaihetta (kuvilla)
Pultti - DIY -langaton latausyökello (6 vaihetta): Induktiiviset lataukset (tunnetaan myös nimellä langaton lataus tai langaton lataus) on langattoman voimansiirron tyyppi. Se käyttää sähkömagneettista induktiota sähkön tuottamiseen kannettaville laitteille. Yleisin sovellus on langaton Qi -latauslaite
4 vaihetta akun sisäisen vastuksen mittaamiseksi: 4 vaihetta
4 vaihetta akun sisäisen vastuksen mittaamiseksi: Tässä on 4 yksinkertaista vaihetta, joiden avulla voit mitata taikinan sisäisen vastuksen