Sadržaj:

Praćenje očne jabučice na recept: BME60B projekat: 9 koraka
Praćenje očne jabučice na recept: BME60B projekat: 9 koraka

Video: Praćenje očne jabučice na recept: BME60B projekat: 9 koraka

Video: Praćenje očne jabučice na recept: BME60B projekat: 9 koraka
Video: PRVA PASTRMAJLIJA U BEOGRADU! Prave i Prodaju Tradicionalno Makedonsko Jelo Po Starom Receptu 2024, Juli
Anonim
Pregledavanje recepta vaše očne jabučice: projekat BME60B
Pregledavanje recepta vaše očne jabučice: projekat BME60B

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

Uvećanje je jedna od ključnih značajki prisutnih naočala za čitanje, koje su klasificirane prema recepturi dioptrije. Prema Tehničkom sveučilištu Michigan, dioptrija je žižna daljina leće, obično mjerena u mm, u jedinicama metara (Michigan Technology University). Budući da naočale za čitanje imaju konveksne leće, žižna daljina bi bila pozitivna, uzrokujući i pozitivnu dioptriju (HyperPhysics). Žižna daljina se povećava kako se udaljenost između objekta sve više udaljava od stvarnog sočiva, što dovodi do smanjenja dioptrije jer su obrnuto proporcionalne. Stoga bi naočale za čitanje s dodatnom dioptrijom pomogle objektivu da zumira prikaz tako da se može činiti da je žižna daljina manja povećanjem vrijednosti dioptrije.

Predstavljeni kôd će se koristiti za predviđanje dioptrije sočiva nepoznatog recepta. Za unos recepta koriste se dva ulaza: fotografija kontrolirane pozadine bez upotrebe objektiva i još jedna fotografija iste pozadine, ali kroz objektiv po izboru. Program će mjeriti izobličenje između ove dvije fotografije. Odatle ćemo moći procijeniti dioptriju objektiva i proizvesti rezultat koji će korisnik moći vidjeti.

Za ovaj Instructable trebat će vam:

  • Crno-bijeli uzorak šahovske ploče odštampan na listu papira dimenzija 11x8,5
  • Kamera sa mogućnošću zaključavanja fokusa
  • Stativ ili nešto slično za pričvršćivanje fotoaparata
  • Razni recepti za naočare za čitanje
  • MATLAB

Korak 1: Snimite fotografije

Snimite fotografije
Snimite fotografije
Snimite fotografije
Snimite fotografije
Snimite fotografije
Snimite fotografije

Da biste izračunali povećanje objektiva, morate ga moći usporediti sa stvarnom veličinom objekta. Za ovaj projekat ćemo upoređivati uvećanu sliku sa kontrolnom slikom.

Stoga je prvi korak snimiti dvije fotografije iste slike - prvu samo kamerom, a drugu kroz sočivo naočara za čitanje koje želite testirati.

Snimit ćete crno -bijelu šahovnicu dimenzija 8,5 x 11 inča s rešetkom od 1 inča. Postavite kameru 11 inča od šahovnice. Prije snimanja fotografija, fokus fokusirajte na šahovnicu.

Fotografirajte šahovnicu bez naočala za čitanje. Zatim, ne pomerajući ništa, stavite naočare za čitanje ispred kamere i snimite drugu fotografiju.

Pazite da se položaj vaše kamere ne pomjera između snimaka. Jedina stvar koja bi se trebala promijeniti između dvije fotografije je prisutnost naočara naočara ispred kamere.

Kada završite sa fotografijama, prenesite ih na računar.

Korak 2: Umetnite slike u MATLAB

Učitajte slike u MATLAB
Učitajte slike u MATLAB

Otvorite novu skriptu.

Prvo navedite direktorij u kojem su fotografije pohranjene. Zatim upotrijebite funkciju dir za izdvajanje-j.webp

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

Za naš projekt, željeli smo uputiti korisnika programa koje datoteke žele uporediti. Prvi odjeljak traži od korisnika da navede kontrolnu sliku, a drugi traži od korisnika da navede testnu sliku.

  • %Pitajte korisnika koja je datoteka kontrolna slika.
  • Control = input ('# kontrolne slike. / N');
  • ControlFile = [GetDir (Control).name]
  • %Pitajte korisnika koja datoteka je slika koju želi analizirati.
  • ChooseFile = input ('\ n# slike koju želite analizirati. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

Korak 3: Analiza slike

Analiza slike
Analiza slike
Analiza slike
Analiza slike

Obojena slika u MATLAB -u je veličine MxNx3, dok je slika u sivim tonovima MxN. To znači da je brže poboljšati/urediti sliku u sivim tonovima jer ima manje podataka za praćenje. Koristite rgb2gray za pretvaranje slike u nijanse sive. (Funkcija imrotate je korištena jer su naše fotografije bile vodoravne - ova linija koda može, ali i ne mora biti potrebna u vašoj verziji.)

  • %pretvori u sive i rotira
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotirati (I, 90);

Zatim prikažite sliku. Funkcija podcrtavanja se koristi tako da testna slika može biti pored kontrole u kasnijim koracima.

  • %prikaz
  • slika (1);
  • podcrt (1, 2, 1)
  • imshow (I);
  • naslov (ControlFile);

Upotrijebite imcrop da biste zatražili od korisnika da izreže šahovnicu sa cijele slike. Sljedeći kôd također prikazuje okvir s porukom koji daje upute korisniku.

  • %izrezati šahovnicu za analizu
  • waitfor (msgbox ({'Upotrijebite ukrštene dlačice za izrezivanje šahovske ploče.', 'Zatim dvaput kliknite područje interesa.'}));
  • I_crop = imcrop (I);

Za binarnu sliku upotrijebite imbinarize.

I_binary = imbinarize (I_crop);

Korak 4: Izračunajte širinu bijelih kvadrata na šahovnici

Izračunajte širinu bijelih kvadrata na šahovnici
Izračunajte širinu bijelih kvadrata na šahovnici
Izračunajte širinu bijelih kvadrata na šahovnici
Izračunajte širinu bijelih kvadrata na šahovnici
Izračunajte širinu bijelih kvadrata na šahovnici
Izračunajte širinu bijelih kvadrata na šahovnici

Zatim zatražite od korisnika da nacrta liniju preko slike pomoću imline. Ova linija bi trebala ići vodoravno preko šahovnice. Trebalo bi početi i završiti na crnom kvadratu (nije važno gdje)- to je zato što ćemo mjeriti širinu bijelih kvadrata, a ne crnih.

  • %linija izvlačenja
  • slika (1)
  • podcrt (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Kliknite i prevucite da biste nacrtali liniju koja se proteže kroz 9 okvira, od razmaka do razmaka.', 'Dvaput kliknite za potvrdu.'}));
  • linija = imline;
  • položaj = čekanje (red);
  • endpoints = line.getPosition;

Izdvojite X i Y koordinate za krajnje tačke povučene linije.

  • X = krajnje tačke (:, 1)
  • Y = krajnje tačke (:, 2);

Upotrijebite improfile za izradu grafikona na temelju intenziteta koji se nalaze duž nacrtane linije. Ovo bi trebalo podsjećati na kvadratni val u rasponu od 0 (crno) do 1 (bijelo). Izračunajte vrhove i njihovu lokaciju.

  • slika (2)
  • podcrt (1, 2, 1)
  • title ('Intenzitet slike preko improvizirane linije (kontrola)')
  • improfile (I_binary, X, Y); grid on;
  • [~, ~, c1, ~, ~] = neprovjerena datoteka (I_binarno, X, Y);
  • [piaks, loc] = findpeaks (c1 (:,:, 1));
  • Čekaj
  • zemljište (loc, vrhovi, 'ro');
  • izdrži

Pronađite dužinu svakog platoa na grafikonu neprovjerene forme pomoću for petlje. Pokrenite for petlju za istu količinu vrhova koliko postoji u grafikonu neprovjerene datoteke. Da biste izračunali duljinu svakog platoa, upotrijebite funkciju "pronađi" da pronađete sve lokacije na kojima postoji vrijednost "1" umjesto vrijednosti "0" intenziteta. Zatim izračunajte dužinu tog niza da biste dobili ukupnu dužinu platoa, koja bi trebala biti jednaka širini bijelog kvadrata u pikselima. ControlPlateauList = nule (1, dužina (loc));

za i = 1: dužina (loc)

ako je i == dužina (loc)

plato = pronaći (c1 (loc (i): kraj,:, 1));

else

plato = pronaći (c1 (loc (i): loc (i+1) -1,:, 1));

kraj

ControlPlateauList (i) = dužina (plato);

kraj

Korak 5: Ponovite korake 3 i 4 za probnu sliku

Ponovite korake 3 i 4 za probnu sliku
Ponovite korake 3 i 4 za probnu sliku

*Napomena: kada crtate improvizovanu liniju na probnoj slici, obavezno je nacrtajte preko kvadrata koji odgovaraju liniji koju ste nacrtali na kontrolnoj slici.

Korak 6: Izračunajte uvećanje objektiva

Izračunajte uvećanje objektiva
Izračunajte uvećanje objektiva

Uvećana mjerenja izračunavaju se dijeljenjem srednje dužine platoa, koja je izračunata u koraku 5, sa srednjom dužinom kontrolnog platoa, koja je izračunata u koraku 4. To se računa na 1,0884.

uvećanje = srednja vrednost (platoList)/srednja vrednost (ControlPlateauList);

Korak 7: Pronalaženje R-kvadrata i korisničkog recepta putem interpolacije

Pronalaženje R-kvadrata i korisnički recept putem interpolacije
Pronalaženje R-kvadrata i korisnički recept putem interpolacije

Koristeći kod:

  • md1 = fitlm (S obzirom na recept, MagArray);
  • Rsquared = md1. Rsquared. Ordinary;

Možemo pronaći vrijednost R-kvadrata grafikona GivenPresciption (naše leće daju vrijednosti) vs. MagArray (niz omjera mjerenja uvećanja koje smo izračunali ranije). Imajući dovoljno visoku vrijednost R-kvadrata, može se zaključiti da postoji dovoljno jaka korelacija koja opravdava upotrebu ove metode. U ovom konkretnom slučaju, vrijednost R-kvadrata bila je 0,9912, što ukazuje na jaku korelaciju i stoga je opravdano koristiti ovu metodu u analizi.

Koristeći funkciju:

Prescription = interp1 (MagArray, GivenPrescription, uvećanje, 'linearno');

Možemo interpolirati odgovarajuću propisanu vrijednost (na osi x) našeg omjera uvećanja (vrijednost na osi y) i pronaći koji je korisnički recept.

Interpoliranje podataka važno je za funkcioniranje ove metode jer nam omogućuje da na temelju informacija koje imamo donosimo pretpostavke o informacijama koje nemamo. Iako bi linija koja najbolje pristaje tehnički bila jači kandidat za ovu pretpostavku, stvaranje granica za smanjenje broja izlaza služi istom učinku kao što dioptrijske naočare u svakom slučaju dolaze u postupno ujednačenim vrijednostima. To se objašnjava u kasnijim koracima.

Korak 8: Prikaz korisničkog recepta na grafikonu

Prikaz korisničkog recepta na grafikonu
Prikaz korisničkog recepta na grafikonu

Koristeći sljedeći kod:

  • figura;
  • zaplet (S obzirom na recept, MagArray, '-g')
  • Čekaj
  • zaplet (recept, povećanje, 'bp')
  • izdrži
  • grid
  • legenda ('Podaci', 'Interpolirane točke', 'Lokacija', 'SZ')

Možemo nacrtati grafikon koji prikazuje omjere uvećanja prema danom receptu sa zelenom linijom i pronađene podatke našeg izračunatog povećanja u odnosu na naš interpolirani recept sa plavom zvijezdom. Zatim legenda označava naslov, x-os i y-os i postavlja legendu u gornji lijevi kut.

Korak 9: Suzite recept

Suzite recept
Suzite recept

Sljedeći kôd koristi se za zaokruživanje recepta:

  • ako je recept <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Recept <= 1.375

    CalculatedPrescription = '1.25';

  • elseif Recept <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Recept <= 1.875

    CalculatedPrescription = '1.75';

  • elseif Recept <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Recept <= 2.625

    CalculatedPrescription = '2.5';

  • elseif recept <= 3

    CalculatedPrescription = '2.75';

  • elseif Recept <= 3.375

    CalculatedPrescription = '3.25';

  • else

    CalculatedPrescription = 'nepoznato';

  • kraj

Recept koji je pronađen interpolacijom ne odražava nužno stvarni recept - to je zato što će uvijek doći do malih razlika u analizi fotografije zbog ljudske greške. Stoga nam je ovaj korak potreban za klasifikaciju stvarnog recepta.

Recepti koji se daju obično počinju od 1,0 dioptrije i povećavaju se za 0,25 u svojim receptima, pa nakon izračunavanja recepta želimo odrediti recept koji najbolje odgovara onome što bi korisniku moglo zatrebati. Nakon izračunavanja recepta, vodimo ga kroz date naredbe If da provjerimo njegovu vrijednost i odredimo koji je recept potreban. Sve što je manje ili jednako 1,125, tada je recept 1,0. Sve što je manje ili jednako 1,375, recept je 1,25. Sve što je manje ili jednako 1,625, recept je 1,5. Sve što je manje ili jednako 1,845, recept je 1,75. I tako dalje.

Vrijednosti se povećavaju jer provjeravamo jesu li vrijednosti manje od. Ako bismo smanjili vrijednosti, tada bi prva naredba if čitala prvu if naredbu cijelo vrijeme. Ako je recept najmanji, želimo da ga odmah prepozna kao najmanji, pa je zato najmanja vrijednost ono s čime smo počeli. Sve što je veće od najveće vrijednosti znači da recept nije u rasponu s našim podacima, pa će dati "Nepoznato" čitanje niza.

Preporučuje se: