Përmbajtje:

Eyeballing Receta e syrit tuaj: një projekt BME60B: 9 hapa
Eyeballing Receta e syrit tuaj: një projekt BME60B: 9 hapa

Video: Eyeballing Receta e syrit tuaj: një projekt BME60B: 9 hapa

Video: Eyeballing Receta e syrit tuaj: një projekt BME60B: 9 hapa
Video: I Stopped Cooking Daily For My Family And Instead Do This 2024, Korrik
Anonim
Eyeballing Receta Eyeball juaj: një projekt BME60B
Eyeballing Receta Eyeball juaj: një projekt BME60B

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

Zmadhimi është një nga karakteristikat kryesore të pranishme për syzet e leximit, të cilat klasifikohen sipas recetës së tyre të dioptrave. Sipas Universitetit Teknologjik të Miçiganit, një dioptri është një gjatësi fokale e thjerrëzave, e matur zakonisht në mm, në njësinë e metrave (Universiteti i Teknologjisë Michigan). Për shkak se syzet e leximit kanë lente konveks, gjatësia fokale do të ishte pozitive, duke bërë që edhe dioptrat të jenë pozitive (HyperPhysics). Gjatësia fokale rritet ndërsa distanca midis objektit largohet më shumë nga lentet aktuale, dhe kjo i bën dioptrat të zvogëlohen pasi ato janë anasjelltas proporcionale. Prandaj, të kesh syze leximi me dioptra shtesë do të ndihmonte lenten të zmadhonte pamjen, në mënyrë që të duket se gjatësia fokale është më e vogël duke rritur vlerën e dioptrave.

Kodi i paraqitur do të përdoret për të parashikuar dioptrin e një lente me një recetë të panjohur. Dy hyrje përdoren për të llogaritur recetën: një fotografi e sfondit të kontrolluar pa përdorur asnjë lente, dhe një fotografi tjetër e të njëjtit sfond, por përmes lenteve të zgjedhura. Programi do të masë shtrembërimin midis këtyre dy fotografive. Nga atje, ne do të jemi në gjendje të vlerësojmë dioptrin e thjerrëzave dhe të prodhojmë një rezultat që përdoruesi ta shikojë.

Për këtë Udhëzues, do t'ju duhet:

  • Një model i bardhë dhe i bardhë i stampuar i shtypur në një fletë letre në një madhësi 11x8.5
  • Një aparat fotografik me aftësinë për të bllokuar fokusin e tij
  • Një trekëmbësh, ose diçka e ngjashme për të siguruar kamerën
  • Receta të ndryshme të syzeve të leximit
  • MATLAB

Hapi 1: Bëni Fotografi

Shkrep fotografi
Shkrep fotografi
Shkrep fotografi
Shkrep fotografi
Shkrep fotografi
Shkrep fotografi

Për të llogaritur zmadhimin e një lente, duhet të jeni në gjendje ta krahasoni atë me madhësinë aktuale të objektit. Për këtë projekt, ne do të krahasojmë një imazh të zmadhuar me një imazh kontrolli.

Kështu, hapi i parë është të bëni dy fotografi të të njëjtit imazh - e para përmes vetëm kamerës, dhe e dyta përmes lenteve të syzeve të leximit që dëshironi të provoni.

Ju do të bëni një fotografi të një tabele kontrolli bardh e zi 8.5x11in me një rrjet 1 inç. Vendosni kamerën tuaj 11in larg nga tabela e kontrollit. Para se të bëni fotografi, mbyllni fokusin në tabelën e kontrollit.

Bëni një fotografi të checkerboard pa syzet e leximit. Pastaj, pa lëvizur asgjë, vendosni syzet e leximit para kamerës dhe bëni foton e dytë.

Sigurohuni që pozicioni i kamerës tuaj të mos lëvizë midis shkrepjeve. E vetmja gjë që duhet të ndryshojë midis dy fotove është prania e lenteve të syzeve para kamerës.

Kur të keni mbaruar me fotot, ngarkoni ato në kompjuterin tuaj.

Hapi 2: Ngarkoni Imazhet në MATLAB

Ngarko imazhet në MATLAB
Ngarko imazhet në MATLAB

Hapni një skenar të ri.

Së pari, specifikoni drejtorinë ku ruhen fotografitë. Pastaj, përdorni funksionin dir për të nxjerrë imazhe-j.webp

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

Për projektin tonë, ne donim të nxisnim përdoruesin e programit për skedarët me të cilët donin të krahasonin. Seksioni i parë i kërkon përdoruesit të specifikojë imazhin e kontrollit, dhe i dyti i kërkon përdoruesit të specifikojë imazhin e provës.

  • %Pyetni përdoruesin se cili skedar është imazhi i kontrollit.
  • Kontrolli = hyrja ('# e imazhit të kontrollit. / N');
  • ControlFile = [GetDir (Kontrolli).emri]
  • %Pyetni përdoruesin se cili skedar është imazhi që ata duan të analizojnë.
  • ChooseFile = input ('\ n# imazhin që dëshironi të analizoni. / N');
  • PrescripFile = [GetDir (ChooseFile).emër];

Hapi 3: Analiza e imazhit

Analiza e Imazhit
Analiza e Imazhit
Analiza e Imazhit
Analiza e Imazhit

Një imazh me ngjyrë në MATLAB është i madhësisë MxNx3, ndërsa një imazh i shkallës gri është MxN. Kjo do të thotë që është më e shpejtë të përmirësosh/modifikosh një imazh të shkallës gri sepse ka më pak të dhëna për të mbajtur nën kontroll. Përdorni rgb2gray për ta kthyer imazhin në shkallë gri. (Funksioni imrotate u përdor sepse fotot tona dolën në horizontale - kjo linjë kodi mund të jetë ose jo e nevojshme në versionin tuaj.)

  • %konvertohet në shkallë gri dhe rrotullohet
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotate (I, 90);

Tjetra, shfaqni imazhin. Funksioni i nënplotit përdoret në mënyrë që imazhi i provës të jetë në gjendje të jetë pranë kontrollit në hapat e mëvonshëm.

  • %shfaqje
  • figura (1);
  • nënplot (1, 2, 1)
  • imshow (I);
  • titulli (ControlFile);

Përdorni imcrop për të nxitur përdoruesin të presë tabelën e kontrollit nga imazhi i plotë. Kodi i mëposhtëm gjithashtu tregon një kuti mesazhesh për t'i dhënë udhëzime përdoruesit.

  • %prerje checkerboard për analiza
  • waitfor (msgbox ({'Përdorni qimet e kryqëzuara për të nxjerrë tabelën e kontrollit.', 'Pastaj klikoni dy herë zonën e interesit.'}));
  • I_crop = imcrop (I);

Përdorni imbinarize për të binarizuar imazhin.

I_binar = imbinarizoj (I_crop);

Hapi 4: Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit

Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit
Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit
Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit
Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit
Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit
Llogaritni Gjerësinë e Katrorëve të Bardhë në Tabelën e Rendit

Tjetra, nxitni përdoruesin të tërheqë një vijë nëpër imazh duke përdorur imline. Kjo linjë duhet të kalojë horizontalisht në të gjithë tabelat e kontrollit. Duhet të fillojë dhe të përfundojë në një shesh të zi (nuk ka rëndësi se ku)- kjo ndodh sepse ne do të matim gjerësinë e shesheve të bardhë, jo ato të zeza.

  • %barazim linje
  • figura (1)
  • nënplot (1, 2, 1)
  • imshow (I_binar);
  • waitfor (msgbox ({'Kliko dhe tërhiq për të tërhequr vijën që përfshin 9 kuti, nga një hapësirë e zezë në një hapësirë të zezë.', 'Kliko dy herë për të konfirmuar.'}));
  • linjë = imline;
  • pozicioni = prit (rreshti);
  • pikat fundore = line.getPosition;

Nxirrni kodinatet X dhe Y për pikat përfundimtare të vijës së tërhequr.

  • X = pikat përfundimtare (:, 1)
  • Y = pikat përfundimtare (:, 2);

Përdorni profrofile për të prodhuar një grafik bazuar në intensitetet e gjetura përgjatë vijës së tërhequr. Kjo duhet të ngjajë me një valë katrore që varion nga 0 (e zezë) në 1 (e bardhë). Llogarit majat dhe vendndodhjet e tyre gjithashtu.

  • figura (2)
  • nënplot (1, 2, 1)
  • titulli ('Intensiteti i imazhit përgjatë vijës së paprofile (Kontrolli)')
  • çrregullim (I_binar, X, Y); rrjeti i ndezur;
  • [~, ~, c1,, ~] = profrofile (I_binar, X, Y);
  • [majat, loc] = majat e gjetjes (c1 (:,:, 1));
  • prit
  • komplot (loc, majat, 'ro');
  • mbaje mendjen

Gjeni gjatësinë e secilës rrafshnaltë në grafikun e profilizuar duke përdorur një lak for. Drejtoni ciklin for për të njëjtën sasi majash që gjenden në grafikun e pamjaftueshëm. Për të llogaritur gjatësinë e secilës pllajë, përdorni funksionin "gjeni" për të gjetur të gjitha vendet ku ka një "1" në vend të një vlere intensiteti "0". Pastaj, llogarisni gjatësinë e atij grupi për të marrë gjatësinë totale të rrafshnaltës, e cila duhet të jetë e barabartë me gjerësinë e një katrori të bardhë në pixel. ControlPlateauList = zero (1, gjatësia (loc));

për i = 1: gjatësi (lok)

nëse i == gjatësia (loc)

pllajë = gjej (c1 (loc (i): fund,,, 1));

tjeter

pllajë = gjej (c1 (loc (i): loc (i+1) -1,,, 1));

fund

ControlPlateauList (i) = gjatësia (pllajë);

fund

Hapi 5: Përsëritni Hapat 3 dhe 4 për Imazhin e Testit

Përsëritni hapat 3 dhe 4 për imazhin e provës
Përsëritni hapat 3 dhe 4 për imazhin e provës

*Shënim: kur vizatoni vijën e papërshtatshme në imazhin e provës, sigurohuni që ta vizatoni në sheshet që korrespondojnë me vijën që vizatuat në imazhin e kontrollit.

Hapi 6: Llogaritni Zmadhimin e Thjerrëzës

Llogaritni Zmadhimin e Thjerrëzës
Llogaritni Zmadhimin e Thjerrëzës

Matjet e zmadhuara llogariten duke pjesëtuar mesataren e gjatësisë së rrafshnaltës, e cila u llogarit në hapin 5, me mesataren e gjatësisë së pllajës së kontrollit, e cila u llogarit në hapin 4. Kjo llogaritet të jetë 1.0884.

zmadhim = mesatarja (lista e pllajës)/mesatarja (ControlPlateauList);

Hapi 7: Gjetja e katrorit R dhe receta e përdoruesit përmes interpolimit

Gjetja e katrorit R dhe receta e përdoruesit përmes interpolimit
Gjetja e katrorit R dhe receta e përdoruesit përmes interpolimit

Duke përdorur kodin:

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

Ne mund të gjejmë vlerën e katrorit R të grafikut GivenPresciption (vlerat e dhëna të lenteve tona) kundrejt MagArray (një grup i raporteve të matjeve të zmadhimit që kemi llogaritur më herët). Duke pasur një vlerë mjaft të lartë në katror R, mund të nxirret përfundimi se ekziston një korrelacion mjaft i fortë për të justifikuar përdorimin e kësaj metode. Për këtë rast të veçantë, vlera në katrorin R ishte 0.9912, që sugjeron një korrelacion të fortë dhe për këtë arsye janë të justifikuara në përdorimin e kësaj metode në analizë.

Duke përdorur funksionin:

Prescription = interp1 (MagArray, GivenPrescription, zmadhim, 'linear');

Ne mund të interpolojmë vlerën përkatëse të recetës (në boshtin x) të raportit tonë të zmadhimit (një vlerë në boshtin y) dhe të gjejmë se çfarë është receta e përdoruesit.

Ndërhyrja e të dhënave është e rëndësishme që kjo metodë të funksionojë pasi na lejon të bëjmë supozime për informacionin që nuk kemi, bazuar në informacionin që kemi. Ndërsa një linjë e përshtatshmërisë më të mirë do të ishte teknikisht një kandidat më i fortë për këtë supozim, krijimi i kufijve për të zvogëluar numrin e rezultateve shërbejnë të njëjtin efekt pasi syzet me recetë gjithsesi vijnë në vlera shtesë uniforme. Kjo shpjegohet në hapat e mëvonshëm.

Hapi 8: Paraqitja e recetës së përdoruesit në një grafik

Shfaqja e recetës së përdoruesit në një grafik
Shfaqja e recetës së përdoruesit në një grafik

Duke përdorur kodin e mëposhtëm:

  • figura;
  • komplot (GivenPrescription, MagArray, '-g')
  • prit
  • komplot (Recetë, zmadhim, 'bp')
  • mbaje mendjen
  • rrjetë
  • legjendë ("Të dhëna", "Pika të interpoluara", "Vendndodhja", "NW")

Ne mund të vizatojmë një grafik që tregon Raportet e Zmadhimit kundrejt Recetës së dhënë me një vijë të gjelbër dhe të dhënat e gjetura të zmadhimit tonë të llogaritur kundrejt recetës sonë të interpoluar me një yll blu. Pastaj legjenda etiketon titullin, boshtin x dhe boshtin y dhe e vendos legjendën në këndin e sipërm të majtë.

Hapi 9: Ngushtoni recetën tuaj

Ngushtoni recetën tuaj
Ngushtoni recetën tuaj

Kodi i mëposhtëm përdoret për të prodhuar rrumbullakimin për recetën:

  • nëse Parashkrimi <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Recetë <= 1.375

    Recetë e llogaritur = '1.25';

  • elseif Recetë <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Recetë <= 1.875

    Recetë e llogaritur = '1.75';

  • elseif Recetë <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Recetë <= 2.625

    CalculatedPrescription = '2.5';

  • elseif Recetë <= 3

    Recetë e llogaritur = '2.75';

  • elseif Recetë <= 3.375

    Recetë e llogaritur = '3.25';

  • tjeter

    CalculatedPrescription = 'e panjohur';

  • fund

Receta e gjetur përmes interpolimit nuk pasqyron domosdoshmërisht recetën aktuale - kjo ndodh sepse gjithmonë do të ketë ndryshime të vogla në analizimin e fotografisë për shkak të gabimit njerëzor. Kështu, ne kemi nevojë për këtë hap për të klasifikuar recetën aktuale.

Recetat që jepen zakonisht fillojnë nga 1.0 dioptra dhe rriten me.25 në recetat e tyre, kështu që pas llogaritjes së recetës ne duam të përcaktojmë recetën që i përshtatet më së miri asaj që përdoruesit mund t'i nevojiten. Pas llogaritjes së recetës, ne e kalojmë atë përmes deklaratave të dhëna If për të kontrolluar vlerën e tij dhe për të përcaktuar se cila recetë është e nevojshme. Çdo gjë më pak ose e barabartë me 1.125, atëherë receta është 1.0. Çdo gjë më pak ose e barabartë me 1.375, receta është 1.25. Çdo gjë më pak ose e barabartë me 1.625, receta është 1.5. Çdo gjë më pak ose e barabartë me 1.845, receta është 1.75. Dhe kështu me radhë.

Ne kemi vlerat në rritje pasi po kontrollojmë nëse vlerat janë më pak se. Nëse bëjmë që vlerat të zvogëlohen, atëherë deklarata e parë if do të lexonte deklaratën e parë if gjatë gjithë kohës. Nëse receta është më e vogla, ne duam që ajo ta njohë atë si më të voglin menjëherë, kështu që kjo është arsyeja pse vlera më e vogël është ajo me të cilën kemi filluar. Çdo gjë më e lartë se vlera më e lartë do të thotë që receta nuk është në varg të të dhënave tona, kështu që do të japë leximin e vargut "E panjohur".

Recommended: