Sisällysluettelo:

Silmämunan määrääminen: BME60B -projekti: 9 vaihetta
Silmämunan määrääminen: BME60B -projekti: 9 vaihetta

Video: Silmämunan määrääminen: BME60B -projekti: 9 vaihetta

Video: Silmämunan määrääminen: BME60B -projekti: 9 vaihetta
Video: Apulanta - Silmämuna 2024, Marraskuu
Anonim
Silmämallin luominen: BME60B -projekti
Silmämallin luominen: BME60B -projekti

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

Ota valokuvia
Ota valokuvia
Ota valokuvia
Ota valokuvia
Ota valokuvia
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

Lataa kuvat MATLABiin
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

Kuva -analyysi
Kuva -analyysi
Kuva -analyysi
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

Laske ruudukon valkoisten neliöiden leveys
Laske ruudukon valkoisten neliöiden leveys
Laske ruudukon valkoisten neliöiden leveys
Laske ruudukon valkoisten neliöiden leveys
Laske ruudukon valkoisten neliöiden leveys
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

Toista vaiheet 3 ja 4 testikuvalle
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

Laske linssin suurennos
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

R-neliön löytäminen ja käyttäjän resepti interpoloinnin kautta
R-neliön löytäminen ja käyttäjän resepti interpoloinnin kautta

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

Näytetään käyttäjän resepti kaaviossa
Näytetään käyttäjän resepti 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

Rajoita reseptiäsi
Rajoita 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: