Sisukord:

Silmamunade ettekirjutus: BME60B projekt: 9 sammu
Silmamunade ettekirjutus: BME60B projekt: 9 sammu

Video: Silmamunade ettekirjutus: BME60B projekt: 9 sammu

Video: Silmamunade ettekirjutus: BME60B projekt: 9 sammu
Video: Part 3 - The Age of Innocence Audiobook by Edith Wharton (Chs 17-22) 2024, November
Anonim
Silmamunade ettekirjutus: projekt BME60B
Silmamunade ettekirjutus: projekt BME60B

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

Suurendus on üks lugemisprillide põhifunktsioone, mis on klassifitseeritud dioptrite määramise järgi. Michigani tehnoloogiaülikooli andmetel on dioptri läätse fookuskaugus, tavaliselt mõõdetuna millimeetrites, meetrite ühikus (Michigani Tehnikaülikool). Kuna lugemisprillidel on kumerad läätsed, oleks fookuskaugus positiivne, mistõttu ka dioptrid oleksid positiivsed (HyperPhysics). Fookuskaugus suureneb, kui objekti vaheline kaugus läheb tegelikust läätsest kaugemale ja see viib dioptrite vähenemiseni, kuna need on pöördvõrdelised. Seetõttu aitaks täiendavate dioptriatega lugemisprillide kasutamine objektiivil vaadet suumida nii, et dioptrite väärtuse suurendamisega võib tunduda, et fookuskaugus on väiksem.

Esitatud koodi kasutatakse teadmata retseptiga läätse dioptri ennustamiseks. Retsepti arvutamiseks kasutatakse kahte sisendit: foto kontrollitud taustast ilma objektiivide kasutamiseta ja teine foto samast taustast, kuid valitud objektiivi kaudu. Programm mõõdab moonutusi nende kahe foto vahel. Sealt saame hinnata läätse dioptrit ja anda kasutajale tulemuse.

Selle juhendi jaoks vajate:

  • Mustvalge malelaua muster, mis on trükitud paberilehele 11x8,5
  • Kaamera, millel on võimalus oma teravust lukustada
  • Statiiv või midagi sarnast kaamera kinnitamiseks
  • Lugemisprillide erinevad ettekirjutused
  • MATLAB

Samm: pildistage

Pilte tegema
Pilte tegema
Pilte tegema
Pilte tegema
Pilte tegema
Pilte tegema

Objektiivi suurenduse arvutamiseks peate suutma seda võrrelda objekti tegeliku suurusega. Selle projekti puhul võrdleme suurendatud pilti kontrollpildiga.

Seega on esimene samm teha kaks pilti samast pildist - esimene ainult läbi kaamera ja teine läbi lugemisprillide läätse, mida soovite testida.

Teete pilti 8,5x11 tolli mustvalgest ruudustikust koos 1 -tollise ruudustikuga. Seadistage oma kaamera ruudustikust 11 tolli kaugusele. Enne fotode tegemist lukustage fookus malelauale.

Tehke malelauast foto ilma lugemisprillideta. Seejärel asetage lugemisprillid ilma midagi liigutamata kaamera ette ja tehke teine foto.

Veenduge, et kaamera asukoht ei liigu võtete vahel. Ainuke asi, mis kahe foto vahel muutuma peaks, on prilliläätse olemasolu kaamera ees.

Kui olete fotodega valmis, laadige need oma arvutisse üles.

Samm: laadige pildid MATLAB -i

Laadige pildid MATLAB -i
Laadige pildid MATLAB -i

Avage uus skript.

Esiteks määrake kataloog, kuhu fotod salvestatakse. Seejärel kasutage-j.webp

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

Oma projekti puhul tahtsime programmi kasutajat küsida, milliste failidega ta soovis võrrelda. Esimene osa palub kasutajal täpsustada kontrollpilti ja teine palub kasutajal testpilti.

  • %Küsige kasutajalt, milline fail on juhtpilt.
  • Control = sisend ('kontrollpildi#. / N');
  • ControlFile = [GetDir (Control).name]
  • %Küsige kasutajalt, millist faili see pilt soovib analüüsida.
  • SelectFile = input ('\ n# pilt, mida soovite analüüsida. / N');
  • PrescripFile = [GetDir (ChooseFile).nimi];

3. samm: kujutise analüüs

Kujutise analüüs
Kujutise analüüs
Kujutise analüüs
Kujutise analüüs

Värviline pilt MATLABis on suurusega MxNx3, halltoonides aga MxN. See tähendab, et halltoonides kujutise täiustamine/muutmine on kiirem, kuna andmete jälgimiseks on vähem andmeid. Kasutage rgb2gray, et teisendada pilt halltoonideks. (Imrotate funktsiooni kasutati, kuna meie fotod tulid horisontaalselt - see koodirida võib teie versioonis vajalik olla või mitte.)

  • %teisendatakse halltoonideks ja pööratakse
  • I = imread (kontrollfail);
  • I = rgb2hall (I);
  • I = imrotate (I, 90);

Järgmisena kuvage pilt. Alamjoonistamisfunktsiooni kasutatakse selleks, et testkujutis oleks hilisemates etappides kontrolli kõrval.

  • %kuva
  • Joonis 1);
  • alamplaan (1, 2, 1)
  • imshow (I);
  • pealkiri (ControlFile);

Kasutage imcropi, et paluda kasutajal malelaua täispildist välja lõigata. Järgmisel koodil kuvatakse ka sõnumikast, mis annab kasutajale juhiseid.

  • %kärpida ruudustikku analüüsimiseks
  • waitfor (msgbox ({'Kasuta risttahvlit, et kärpida ruudustikku.', 'Seejärel topeltklõpsake huvipakkuvat ala.'}));
  • I_crop = imcrop (I);

Kasutage pildi binariseerimiseks imbinarize.

I_binary = imbinarize (I_crop);

Samm: arvutage ruudustiku valgete ruutude laius

Arvutage ruudustiku valgete ruutude laius
Arvutage ruudustiku valgete ruutude laius
Arvutage ruudustiku valgete ruutude laius
Arvutage ruudustiku valgete ruutude laius
Arvutage ruudustiku valgete ruutude laius
Arvutage ruudustiku valgete ruutude laius

Seejärel paluge kasutajal imline abil joonisele joon joonistada. See joon peaks jooksma horisontaalselt üle malelaua. See peaks algama ja lõppema mustal ruudul (pole vahet, kus)- seda seetõttu, et mõõdame valgete, mitte mustade ruutude laiust.

  • %joonistusjoon
  • Joonis 1)
  • alamplaan (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Klõpsa ja lohista, et tõmmata joon, mis hõlmab 9 kasti, mustast ruumist musta ruumi.', 'Topeltklõps kinnitamiseks.'});
  • rida = imline;
  • positsioon = oota (rida);
  • lõpp -punktid = line.getPosition;

Tõmmake tõmmatud joone lõpp -punktide X ja Y koodinaadid.

  • X = lõpp -punktid (:, 1)
  • Y = lõpp -punktid (:, 2);

Kasutage improfile'i, et koostada graafik, mis põhineb tõmmatud joonel leitud intensiivsustel. See peaks sarnanema ruudulainega vahemikus 0 (must) kuni 1 (valge). Arvutage ka piigid ja nende asukohad.

  • joonis (2)
  • alamplaan (1, 2, 1)
  • title ('Kujutise intensiivsus üleprofiililiini (kontroll)')
  • improfile (I_binary, X, Y); võrk sisse;
  • [~, ~, c1, ~, ~] = improfile (I_binary, X, Y);
  • [piigid, asukoht] = leidmine (c1 (:,:, 1));
  • oota
  • maatükk (loc, tipud, 'ro');
  • pea kinni

Leidke iga platoo pikkus improfile graafikult, kasutades silmust for. Käivitage for -tsükkel sama hulga tippude jaoks, mis on improfile -graafikus. Iga platoo pikkuse arvutamiseks kasutage funktsiooni "leida", et leida kõik kohad, kus intensiivsuse väärtuse "0" asemel on "1". Seejärel arvutage selle massiivi pikkus, et saada platoo kogupikkus, mis peaks võrduma valge ruudu laiusega pikslites. ControlPlateauList = nullid (1, pikkus (loc));

i = 1: pikkus (loc)

kui i == pikkus (loc)

platoo = leid (c1 (loc (i): lõpp,:, 1));

muidu

platoo = leid (c1 (loc (i): loc (i+1) -1,:, 1));

lõpp

ControlPlateauList (i) = pikkus (platoo);

lõpp

Samm: korrake testpildi jaoks samme 3 ja 4

Korrake testpildi jaoks samme 3 ja 4
Korrake testpildi jaoks samme 3 ja 4

*Märkus: kui proovipildile joonistate improfile -joone, joonistage see kindlasti ruutudele, mis vastavad joonisele, mille joonistasite kontrollpildile.

6. samm: arvutage objektiivi suurendus

Arvutage objektiivi suurendus
Arvutage objektiivi suurendus

Suurendatud mõõtmised arvutatakse, jagades platoo pikkuse keskmise, mis arvutati 5. etapis, kontrollplatoo pikkuse keskmisega, mis arvutati 4. etapis. See on arvutatud 1.0884.

suurendus = keskmine (platooList)/keskmine (ControlPlateauList);

7. samm: R-ruudu leidmine ja kasutaja ettekirjutus interpoleerimise teel

R-ruudu leidmine ja kasutaja ettekirjutus interpoleerimise teel
R-ruudu leidmine ja kasutaja ettekirjutus interpoleerimise teel

Koodi kasutamine:

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

Leiame graafiku GivenPresciption (meie läätsedel antud väärtused) R-ruudu väärtuse vs MagArray (varem arvutatud suurendussuhete massiiv). Kui R-ruudu väärtus on piisavalt kõrge, võib järeldada, et selle meetodi kasutamise õigustamiseks on piisavalt tugev korrelatsioon. Sel konkreetsel juhul oli R-ruudu väärtus 0,9912, mis viitab tugevale korrelatsioonile ja on seetõttu selle meetodi kasutamisel analüüsis õigustatud.

Funktsiooni kasutamine:

Retsept = interp1 (MagArray, GivenPrescription, suurendus, 'lineaarne');

Saame oma suurendusastme (väärtus y-teljel) vastava retsepti väärtuse (x-teljel) interpoleerida ja leida, milline on kasutaja retsept.

Andmete interpoleerimine on selle meetodi toimimiseks oluline, kuna see võimaldab meil olemasoleva teabe põhjal teha eeldusi teabe kohta, mida meil pole. Kuigi kõige sobivam rida oleks selle eelduse jaoks tehniliselt tugevam kandidaat, annab piiride loomine väljundite arvu vähendamiseks sama efekti, kui retseptiprillidel on niikuinii järkjärgulised ühtlased väärtused. Seda selgitatakse hilisemates etappides.

8. samm: kasutaja ettekirjutuse kuvamine graafikul

Graafikul kuvatakse kasutaja ettekirjutus
Graafikul kuvatakse kasutaja ettekirjutus

Kasutades järgmist koodi:

  • joonis;
  • graafik (GivenPrescription, MagArray, '-g')
  • oota
  • graafik (ettekirjutus, suurendus, bp)
  • pea kinni
  • ruudustik
  • legend ('Andmed', 'Interpoleeritud punktid', 'Asukoht', 'NW')

Saame joonistada graafiku, mis näitab suurendusnäitajaid ja etteantud ettekirjutust rohelise joonega ning leitud andmeid meie arvutatud suurenduse ja meie sinise tähega interpoleeritud retsepti kohta. Seejärel tähistab legend pealkirja, x-telje ja y-telje ning paigutab legendi vasakusse ülanurka.

Samm: kitsendage retsepti

Ahendage retsepti
Ahendage retsepti

Retsepti ümardamiseks kasutatakse järgmist koodi:

  • kui Retsept <= 1,125

    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';

  • muidu

    CalculatedPrescription = 'teadmata';

  • lõpp

Interpoleerimise teel leitud retsept ei pruugi tingimata kajastada tegelikku retsepti - seda seetõttu, et foto analüüsimisel on inimlike eksimuste tõttu alati kergeid erinevusi. Seega vajame seda sammu tegeliku retsepti klassifitseerimiseks.

Retseptid algavad tavaliselt 1,0 dioptrist ja suurenevad nende retseptides 0,25 võrra, nii et pärast retsepti arvutamist tahame määrata retsepti, mis sobib kõige paremini kasutajale. Pärast retsepti arvutamist läbime selle antud If -avaldustes, et kontrollida selle väärtust ja määrata, milline retsept on vajalik. Kui midagi on väiksem või võrdne 1.125 -ga, siis on retsept 1.0. Kõik, mis on väiksem või võrdne 1,375, on retsept 1,25. Kui midagi on väiksem või võrdne 1,625 -ga, on retsept ette nähtud 1,5. Kõik, mis on väiksem või võrdne 1,845, on retsept 1,75. Ja nii edasi.

Meil on väärtused tõusmas, kuna kontrollime, kas väärtused on väiksemad kui. Kui me teeme väärtuste vähenemist, siis esimene if -lause loeb kogu aeg esimest if -lauset. Kui ettekirjutus on väikseim, tahame, et see tunnistaks selle kohe väikseimaks, seetõttu alustasime väikseima väärtusega. Kõrgeimast väärtusest kõrgem tähendab, et retsept ei ole meie andmetega vahemikus, seega annab see string „Tundmatu”.

Soovitan: