Turinys:

Akių obuolių receptas: BME60B projektas: 9 žingsniai
Akių obuolių receptas: BME60B projektas: 9 žingsniai

Video: Akių obuolių receptas: BME60B projektas: 9 žingsniai

Video: Akių obuolių receptas: BME60B projektas: 9 žingsniai
Video: MANE UŽPUOLĖ PIKTAS ŠUO |VLOG #3 2024, Liepa
Anonim
Akių obuolių receptas: BME60B projektas
Akių obuolių receptas: BME60B projektas

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

Padidinimas yra viena iš pagrindinių akinių, kurios klasifikuojamos pagal dioptrijų receptą, ypatybių. Pasak Mičigano technologijos universiteto, dioptrija yra objektyvo židinio nuotolis, paprastai matuojamas mm, metrais (Mičigano technologijos universitetas). Kadangi skaitymo akiniai turi išgaubtus lęšius, židinio nuotolis būtų teigiamas, todėl ir dioptrijos būtų teigiamos (HyperPhysics). Židinio nuotolis didėja, kai atstumas tarp objekto nutolsta nuo tikrojo objektyvo, todėl dioptrijos mažėja, nes jos yra atvirkščiai proporcingos. Todėl, turint skaitymo akinius su papildomomis dioptrijomis, objektyvas padidintų vaizdą taip, kad padidėjus dioptrijų vertei gali atrodyti, kad židinio nuotolis yra mažesnis.

Pateiktas kodas bus naudojamas prognozuojant lęšio, kurio receptas nežinomas, dioptriją. Receptui apskaičiuoti naudojami du įėjimai: valdomo fono nuotrauka nenaudojant jokių lęšių ir kita to paties fono nuotrauka, bet per pasirinktą objektyvą. Programa įvertins šių dviejų nuotraukų iškraipymus. Iš ten galėsime įvertinti objektyvo dioptriją ir pateikti rezultatą, kurį vartotojas galės peržiūrėti.

Šiam „Instructable“jums reikės:

  • Nespalvotas šaškių lentos raštas, atspausdintas ant 11x8,5 dydžio popieriaus lapo
  • Fotoaparatas su galimybe fiksuoti fokusavimą
  • Trikojis ar kažkas panašaus į fotoaparatą
  • Įvairūs skaitymo akinių receptai
  • MATLAB

1 žingsnis: fotografuokite

Fotografuoti
Fotografuoti
Fotografuoti
Fotografuoti
Fotografuoti
Fotografuoti

Norėdami apskaičiuoti objektyvo padidinimą, turite sugebėti jį palyginti su faktiniu objekto dydžiu. Šiame projekte mes palyginsime padidintą vaizdą su kontroliniu vaizdu.

Taigi, pirmas žingsnis yra nufotografuoti dvi to paties vaizdo nuotraukas - pirmą tik per fotoaparatą, o antrą - per skaitymo akinių, kuriuos norite išbandyti, objektyvą.

Fotografuosite 8,5 x 11 colių juodai baltą šaškių lentą su 1 colių tinkleliu. Nustatykite fotoaparatą 11 toli nuo šaškių lentos. Prieš fotografuodami užfiksuokite fokusą šaškių lentelėje.

Nufotografuokite šaškių lentą be skaitymo akinių. Tada nieko nejudindami padėkite skaitymo akinius prieš fotoaparatą ir padarykite antrą nuotrauką.

Įsitikinkite, kad fotoaparato padėtis nesikeičia tarp nuotraukų. Vienintelis dalykas, kuris turėtų pasikeisti tarp dviejų nuotraukų, yra akinių lęšio buvimas prieš kamerą.

Kai baigsite nuotraukas, įkelkite jas į savo kompiuterį.

2 veiksmas: įkelkite vaizdus į MATLAB

Įkelkite vaizdus į MATLAB
Įkelkite vaizdus į MATLAB

Atidarykite naują scenarijų.

Pirmiausia nurodykite katalogą, kuriame saugomos nuotraukos. Tada naudokite „dir“funkciją, kad išgautumėte-j.webp

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

Savo projekte norėjome paraginti programos vartotoją, kuriuos failus jie norėjo palyginti. Pirmasis skyrius prašo vartotojo nurodyti kontrolinį vaizdą, o antrasis - vartotojo bandomąjį vaizdą.

  • %Paklauskite vartotojo, kuris failas yra kontrolinis vaizdas.
  • Valdymas = įvestis („kontrolinio vaizdo#. / N“);
  • ControlFile = [GetDir (Control).name]
  • %Paklauskite vartotojo, kuris failas yra vaizdas, kurį jis nori analizuoti.
  • SelectFile = input ('\ n# paveikslėlio, kurį norite analizuoti. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

3 žingsnis: vaizdo analizė

Vaizdo analizė
Vaizdo analizė
Vaizdo analizė
Vaizdo analizė

Spalvotas vaizdas MATLAB yra MxNx3 dydžio, o pilkos spalvos vaizdas yra MxN. Tai reiškia, kad greičiau patobulinti/redaguoti pilkų atspalvių vaizdą, nes yra mažiau duomenų, kuriuos reikia sekti. Naudokite rgb2gray, jei norite konvertuoti vaizdą į pilkos spalvos skalę. (Imrotate funkcija buvo naudojama, nes mūsų nuotraukos buvo horizontaliai - ši kodo eilutė gali būti nereikalinga jūsų versijoje.)

  • %konvertuoti į pilkos spalvos ir pasukti
  • I = imread („ControlFile“);
  • I = rgb2 pilka (I);
  • I = imatuoti (I, 90);

Tada parodykite vaizdą. Pogrupio funkcija naudojama tam, kad vėliau bandomasis vaizdas galėtų būti šalia valdiklio.

  • %ekranas
  • figūra 1);
  • papildomas sklypas (1, 2, 1)
  • imshow (I);
  • pavadinimas („ControlFile“);

Naudokite „imcrop“, kad paragintumėte naudotoją apkarpyti šaškių lentą iš viso vaizdo. Šis kodas taip pat rodo pranešimų laukelį, kuriame pateikiamos instrukcijos vartotojui.

  • %apkarpyti šaškių lentą analizei
  • waitfor (msgbox ({'Naudokite kryželius, kad iškirptumėte šaškių lentą.', 'Tada dukart spustelėkite dominančią sritį.'}));
  • I_crop = imcrop (I);

Naudokite imbinarize, kad vaizdas būtų dvejetainis.

I_binary = imbinarize (I_crop);

4 žingsnis: Apskaičiuokite šaškių lentos baltų kvadratų plotį

Apskaičiuokite šaškių lentos baltų kvadratų plotį
Apskaičiuokite šaškių lentos baltų kvadratų plotį
Apskaičiuokite šaškių lentos baltų kvadratų plotį
Apskaičiuokite šaškių lentos baltų kvadratų plotį
Apskaičiuokite šaškių lentos baltų kvadratų plotį
Apskaičiuokite šaškių lentos baltų kvadratų plotį

Tada paraginkite vartotoją nubrėžti liniją per vaizdą naudodami „imline“. Ši linija turėtų eiti horizontaliai per šaškių lentą. Jis turėtų prasidėti ir baigtis juodame kvadrate (nesvarbu, kur)- taip yra todėl, kad matuojame ne juodų, o baltų kvadratų plotį.

  • %brėžti liniją
  • figūra 1)
  • papildomas sklypas (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Spustelėkite ir vilkite, kad nubrėžtumėte liniją, apimančią 9 langelius, iš juodos vietos į juodą erdvę.', 'Dukart spustelėkite, kad patvirtintumėte.'});
  • linija = imline;
  • pozicija = laukti (eilutė);
  • galiniai taškai = line.getPosition;

Ištraukite nubrėžtos linijos galinių taškų X ir Y koodinatus.

  • X = galiniai taškai (:, 1)
  • Y = galiniai taškai (:, 2);

Naudokite „improfile“, kad sukurtumėte grafiką pagal intensyvumą, nustatytą palei nubrėžtą liniją. Tai turėtų būti panaši į kvadratinę bangą nuo 0 (juoda) iki 1 (balta). Taip pat apskaičiuokite viršūnes ir jų vietas.

  • paveikslas (2)
  • papildomas sklypas (1, 2, 1)
  • pavadinimas („Vaizdo intensyvumas visoje įrašymo linijoje (valdymas)“)
  • improfile (I_binary, X, Y); tinklelis;
  • [~, ~, c1, ~, ~] = improfile (I_binary, X, Y);
  • [smailės, loc] = findpeaks (c1 (:,:, 1));
  • palauk
  • sklypas (loc, smailės, 'ro');
  • susilaikyti

Naudodami for ciklą, suraskite kiekvieno plokščiakalnio ilgį improfiliniame grafike. Vykdykite „for“ciklą tokiam pačiam smailių kiekiui, koks yra improvizuoto grafiko. Norėdami apskaičiuoti kiekvieno plokščiakalnio ilgį, naudokite funkciją „rasti“, kad surastumėte visas vietas, kuriose yra „1“, o ne „0“intensyvumo vertė. Tada apskaičiuokite to masyvo ilgį, kad gautumėte bendrą plokščiakalnio ilgį, kuris turėtų būti lygus balto kvadrato pločio pločiui. ControlPlateauList = nuliai (1, ilgis (loc));

i = 1: ilgis (lok)

jei i == ilgis (loc)

plokščiakalnis = radinys (c1 (loc (i): galas,:, 1));

Kitas

plokščiakalnis = radinys (c1 (loc (i): loc (i+1) -1,:, 1));

galas

ControlPlateauList (i) = ilgis (plokščiakalnis);

galas

5 veiksmas: pakartokite 3 ir 4 veiksmus bandomajam vaizdui

Pakartokite 3 ir 4 veiksmus bandomajam vaizdui
Pakartokite 3 ir 4 veiksmus bandomajam vaizdui

*Pastaba: nubrėždami bandomojo vaizdo improfilinę liniją, būtinai nubrėžkite ją per kvadratus, atitinkančius liniją, kurią nubrėžėte ant kontrolinio vaizdo.

6 žingsnis: apskaičiuokite objektyvo padidinimą

Apskaičiuokite objektyvo padidinimą
Apskaičiuokite objektyvo padidinimą

Padidinti matavimai apskaičiuojami padalijus plokščiakalnio ilgio vidurkį, kuris buvo apskaičiuotas 5 žingsnyje, iš kontrolinio plynaukštės ilgio vidurkio, kuris buvo apskaičiuotas 4 žingsnyje. Tai apskaičiuojama kaip 1,0884.

padidinimas = vidurkis (plokščiakalbis)/vidurkis (kontrolinis plokščiakalbis);

7 žingsnis: R kvadrato ir vartotojo recepto radimas naudojant interpoliaciją

R kvadrato ir vartotojo recepto radimas naudojant interpoliaciją
R kvadrato ir vartotojo recepto radimas naudojant interpoliaciją

Naudojant kodą:

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

Grafiko „R“kvadrato reikšmę galime rasti „GivenPresciption“(mūsų lęšių nurodytos vertės) ir „MagArray“(anksčiau apskaičiuotų padidinimo matavimų masyvo masyvas). Turint pakankamai didelę R kvadrato reikšmę, galima daryti išvadą, kad yra pakankamai stipri koreliacija, pateisinanti šio metodo naudojimą. Šiuo konkrečiu atveju R kvadrato vertė buvo 0,9912, o tai rodo stiprią koreliaciją, todėl yra pagrįsta naudoti šį metodą analizėje.

Naudojant funkciją:

Receptas = interp1 („MagArray“, „GivenPrescription“, padidinimas, „linijinis“);

Mes galime interpoliuoti padidinimo koeficiento (reikšmę y ašyje) atitinkančią recepto vertę (x ašyje) ir sužinoti, kas yra vartotojo nurodymas.

Duomenų interpoliavimas yra svarbus, kad šis metodas veiktų, nes leidžia mums daryti prielaidas apie informaciją, kurios neturime, remiantis turima informacija. Nors tinkamiausia linija būtų techniškai stipresnė kandidatė į šią prielaidą, ribų, skirtų išėjimų skaičiui sumažinti, sukūrimas yra toks pat, kaip ir receptinių akinių, kurių vienodos vertės padidėja. Tai paaiškinama vėlesniuose žingsniuose.

8 veiksmas: vartotojo recepto rodymas diagramoje

Grafike rodomas vartotojo nurodymas
Grafike rodomas vartotojo nurodymas

Naudojant šį kodą:

  • figūra;
  • sklypas („GivenPrescription“, „MagArray“, „-g“)
  • palauk
  • siužetas (Receptas, padidinimas, „bp“)
  • susilaikyti
  • tinklelis
  • užrašas („Duomenys“, „Interpoliuoti taškai“, „Vieta“, „NW“)

Galime nubraižyti grafiką, kuriame žalios linijos rodomi didinimo koeficientai, palyginti su nurodytu receptu, ir rasti apskaičiuoto padidinimo duomenys, palyginti su mūsų interpoliuotu mėlynos žvaigždės receptu. Tada legenda pažymi pavadinimą, x ašį ir y ašį ir pateikia legendą viršutiniame kairiajame kampe.

9 žingsnis: susiaurinkite receptą

Susiaurinkite receptą
Susiaurinkite receptą

Receptui suapvalinti naudojamas šis kodas:

  • jei Receptas <= 1,125

    CalculatedPrescription = '1.0';

  • elseif Receptas <= 1,375

    CalculatedPrescription = '1,25';

  • elseif Receptas <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Receptas <= 1.875

    CalculatedPrescription = '1.75';

  • elseif Receptas <= 2,25

    CalculatedPrescription = '2.0';

  • elseif Receptas <= 2.625

    CalculatedPrescription = '2.5';

  • elseif Receptas <= 3

    CalculatedPrescription = '2.75';

  • elseif Receptas <= 3.375

    CalculatedPrescription = '3.25';

  • Kitas

    CalculatedPrescription = 'nežinoma';

  • galas

Interpoliuotas receptas nebūtinai atspindi tikrąjį receptą - taip yra todėl, kad analizuojant nuotrauką dėl žmogaus klaidos visada bus nedidelių skirtumų. Taigi mums reikia šio žingsnio, kad būtų galima klasifikuoti tikrąjį receptą.

Skiriami receptai paprastai prasideda nuo 1,0 dioptrijos ir jų receptuose padidėja 0,25, todėl, apskaičiavę receptą, norime nustatyti receptą, kuris geriausiai atitiktų tai, ko vartotojui gali prireikti. Apskaičiavę receptą, paleidžiame jį per nurodytus If teiginius, norėdami patikrinti jo vertę ir nustatyti, kuris receptas yra būtinas. Jei viskas yra mažesnė arba lygi 1,125, tada receptas yra 1,0. Jei viskas yra mažesnė arba lygi 1,375, receptas yra 1,25. Jei viskas yra mažesnė arba lygi 1,625, receptas yra 1,5. Jei viskas yra mažesnė arba lygi 1,845, receptas yra 1,75. Ir taip toliau.

Vertės didėja, nes tikriname, ar vertės yra mažesnės nei. Jei reikšmės mažėtų, tada pirmasis teiginys visą laiką skaitytų pirmąjį, jei teiginys. Jei receptas yra mažiausias, mes norime, kad jis iš karto jį pripažintų mažiausiu, todėl mažiausia vertė yra tai, nuo ko pradėjome. Viskas, kas didesnė už didžiausią vertę, reiškia, kad receptas neatitinka mūsų duomenų, todėl „Nežinoma“eilutė bus rodoma.

Rekomenduojamas: