Sisukord:
- Samm: pildistage
- Samm: laadige pildid MATLAB -i
- 3. samm: kujutise analüüs
- Samm: arvutage ruudustiku valgete ruutude laius
- Samm: korrake testpildi jaoks samme 3 ja 4
- 6. samm: arvutage objektiivi suurendus
- 7. samm: R-ruudu leidmine ja kasutaja ettekirjutus interpoleerimise teel
- 8. samm: kasutaja ettekirjutuse kuvamine graafikul
- Samm: kitsendage retsepti
Video: Silmamunade ettekirjutus: BME60B projekt: 9 sammu
2024 Autor: John Day | [email protected]. Viimati modifitseeritud: 2024-01-30 08:46
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
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
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
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
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
*Märkus: kui proovipildile joonistate improfile -joone, joonistage see kindlasti ruutudele, mis vastavad joonisele, mille joonistasite kontrollpildile.
6. samm: 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
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
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
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:
Gimbal stabilisaatori projekt: 9 sammu (piltidega)
Gimbal Stabilizer Project: Kuidas teha Gimbal Õpi, kuidas teha oma tegevuskaamerale 2-teljelist kardaani. Tänapäeva kultuuris armastame me kõik videoid ja jäädvustame hetki, eriti kui olete minusugune sisulooja, olete kindlasti silmitsi seisnud järgmise probleemiga: nii värisev video
Automatiseeritud lemmikloomatoidu kausi projekt: 13 sammu
Automatiseeritud lemmikloomatoidu kausiprojekt: see juhend juhendab ja selgitab, kuidas ehitada automatiseeritud, programmeeritav lemmikloomade söötja koos kinnitatud toidunõudega. Lisasin siia video, mis kirjeldab toodete toimimist ja väljanägemist
(IOT projekt) Ilmateabe hankimine ESP8266 ja Openweather API abil: 5 sammu
(IOT -projekt) Hankige ilmaandmeid, kasutades ESP8266 ja Openweatheri API -d: Selles juhendis koostame lihtsa IOT -projekti, mille abil saate meie linna ilmaandmed saidilt openweather.com/api ja kuvame selle töötlemistarkvara abil
Dopamiinikarp - Mike Boydiga sarnane projekt - mitte olla Mike Boyd: 9 sammu
Dopamiinikarp | Mike Boydiga sarnane projekt - mitte Mike Boydi oma: ma tahan seda! Ma vajan ühte! Ma olen viivitaja! Ma tahan dopamiini kasti … ilma programmeerimiseta. Ei mingeid helisid, vaid puhas tahe
USB -toitega põleti! See projekt võib põleda läbi plasti / puidu / paberi (lõbus projekt peab olema ka väga peen puit): 3 sammu
USB -toitega põleti! See projekt võib põleda läbi plasti / puidu / paberi (lõbus projekt peab olema ka väga peen puit): ÄRGE TEE SEDA USB -KASUTAMISEGA !!!! avastasin kõikidest kommentaaridest, et see võib teie arvutit kahjustada. mu arvutiga on kõik korras. Kasutage 600m 5v telefonilaadijat. Ma kasutasin seda ja see töötab hästi ning midagi ei saa kahjustada, kui kasutate toite peatamiseks turvakork