Tartalomjegyzék:

Szemgolyó A szemgolyó receptje: BME60B projekt: 9 lépés
Szemgolyó A szemgolyó receptje: BME60B projekt: 9 lépés

Videó: Szemgolyó A szemgolyó receptje: BME60B projekt: 9 lépés

Videó: Szemgolyó A szemgolyó receptje: BME60B projekt: 9 lépés
Videó: 9,5 ЧАСОВ в ТЫКВЕ, ГУСЬ ЗАПЕЧЁННЫЙ!! МЯСО в ОГРОМНОЙ ТЫКВЕ!! 2024, November
Anonim
Szemgolyó a szemgolyó receptje alapján: BME60B projekt
Szemgolyó a szemgolyó receptje alapján: BME60B projekt

Szerző: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste

A nagyítás az egyik legfontosabb jellemzője az olvasószemüvegnek, amelyet dioptriák alapján írnak fel. A Michigani Technológiai Egyetem szerint a dioptria a lencse fókusztávolsága, általában mm -ben mérve, mértékegységben (Michigan Technology University). Mivel az olvasószemüveg domború lencsékkel rendelkezik, a fókusztávolság pozitív lenne, és a dioptria is pozitív lenne (HyperPhysics). A gyújtótávolság növekszik, ahogy a tárgy közötti távolság egyre távolodik a tényleges lencsétől, és ez a dioptria csökkenéséhez vezet, mivel fordítottan arányos. Ezért, ha további dioptriás olvasószemüveggel rendelkezik, az lencse nagyíthatná a nézetet, és úgy tűnhet, hogy a dioptria értékének növelésével a gyújtótávolság kisebb lesz.

A bemutatott kód az ismeretlen recept alapján előállított lencse dioptriájának előrejelzésére szolgál. A recept kiszámításához két bemenetet használnak: egy fényképet a szabályozott háttérről, lencse használata nélkül, és egy másik fényképet ugyanarról a háttérről, de a választott lencsén keresztül. A program mérni fogja a két fénykép közötti torzítást. Innentől kezdve meg tudjuk becsülni a lencse dioptriáját, és eredményt készíthetünk a felhasználó számára.

Ehhez az utasításhoz szüksége lesz:

  • Fekete-fehér sakktábla-minta, 11x8,5 méretű papírlapra nyomtatva
  • Kamera, amely rögzíti a fókuszt
  • Állvány, vagy valami hasonló a kamera rögzítéséhez
  • Különféle olvasószemüveg -előírások
  • MATLAB

1. lépés: Készítsen fényképeket

Fotókat készíteni
Fotókat készíteni
Fotókat készíteni
Fotókat készíteni
Fotókat készíteni
Fotókat készíteni

Az objektív nagyításának kiszámításához képesnek kell lennie összehasonlítani azt az objektum tényleges méretével. Ehhez a projekthez egy nagyított képet fogunk összehasonlítani egy kontrollképpel.

Így az első lépés az, hogy két fényképet készít ugyanarról a képről - az elsőt csak a kamerán keresztül, a másodikat pedig a tesztelni kívánt olvasószemüveg lencséjén keresztül.

Képet készít egy 8,5x11 hüvelykes fekete -fehér kockás tábláról, 1 hüvelykes rácskal. Állítsa be fényképezőgépét 11 centiméterre a kockatáblától. A fényképek készítése előtt rögzítse a fókuszt a kockatáblán.

Készítsen fényképet a sakktábláról olvasószemüveg nélkül. Ezután anélkül, hogy bármit is mozgatna, tegye az olvasószemüveget a fényképezőgép elé, és készítse el a második fényképet.

Ügyeljen arra, hogy a fényképezőgép helyzete ne mozduljon el a felvételek között. Az egyetlen dolog, amin változtatni kell a két fénykép között, az a szemüveglencse jelenléte a kamera előtt.

Ha elkészült a fotókkal, töltse fel őket a számítógépére.

2. lépés: Töltse be a képeket a MATLAB -ba

Töltse be a képeket a MATLAB -ba
Töltse be a képeket a MATLAB -ba

Nyisson meg egy új szkriptet.

Először adja meg a könyvtárat, ahol a fényképek tárolódnak. Ezután használja a dir függvényt a-j.webp

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

Projektünk során meg akartuk kérni a program felhasználóját, hogy mely fájlokat szeretné összehasonlítani. Az első szakasz a vezérlőkép megadását kéri a felhasználótól, a második pedig a tesztkép megadását.

  • %Kérdezze meg a felhasználót, hogy melyik fájl a vezérlőkép.
  • Control = input ('vezérlőkép száma. / N');
  • ControlFile = [GetDir (Control).name]
  • %Kérdezze meg a felhasználót, hogy melyik fájl az a kép, amelyet elemezni szeretne.
  • SelectFile = input ('\ n# az elemezni kívánt kép. / N');
  • PrescripFile = [GetDir (SelectFile).name];

3. lépés: Képelemzés

Képelemzés
Képelemzés
Képelemzés
Képelemzés

A MATLAB színes képe MxNx3 méretű, míg a szürkeárnyalatos kép MxN. Ez azt jelenti, hogy gyorsabb a szürkeárnyalatos kép javítása/szerkesztése, mert kevesebb adat van a nyomon követéshez. Az rgb2gray használatával konvertálja a képet szürkeárnyalatosra. (Az imrotate funkciót azért használtuk, mert fotóink vízszintesen jelentek meg - ez a kódsor lehet, hogy nem szükséges az Ön verziójában.)

  • %szürkeárnyalatossá alakul és forog
  • I = imread (ControlFile);
  • I = rgb2szürke (I);
  • I = imrotátus (I, 90);

Ezután jelenítse meg a képet. Az alrészlet funkciót arra használják, hogy a tesztkép a későbbi lépésekben a vezérlő mellett lehessen.

  • %kijelző
  • 1.ábra);
  • részterület (1, 2, 1)
  • imshow (I);
  • cím (ControlFile);

Az imcrop segítségével kérje meg a felhasználót, hogy vágja ki a kockatáblát a teljes képből. A következő kód egy üzenetdobozt is tartalmaz, amely utasításokat ad a felhasználónak.

  • %kivágott checkerboard elemzéshez
  • waitfor (msgbox ({'Használja a keresztszőrt a kockatábla kivágásához.', 'Ezután kattintson duplán a kívánt területre.'}));
  • I_crop = imcrop (I);

A kép binarizálásához használja az imbinarize parancsot.

I_binary = imbinarize (I_crop);

4. lépés: Számítsa ki a kockás táblák fehér négyzeteinek szélességét

Számítsa ki a kockás táblán lévő fehér négyzetek szélességét
Számítsa ki a kockás táblán lévő fehér négyzetek szélességét
Számítsa ki a kockás táblán lévő fehér négyzetek szélességét
Számítsa ki a kockás táblán lévő fehér négyzetek szélességét
Számítsa ki a kockás táblán lévő fehér négyzetek szélességét
Számítsa ki a kockás táblán lévő fehér négyzetek szélességét

Ezután kérje meg a felhasználót, hogy húzzon egy vonalat a képen az imline segítségével. Ennek a vonalnak vízszintesen kell futnia a kockatáblán. Egy fekete négyzeten kell kezdődnie és végződnie (nem mindegy, hol)- ez azért van, mert a fehér négyzetek szélességét fogjuk mérni, nem pedig a feketéket.

  • %húzási vonal
  • 1.ábra)
  • részterület (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Kattintson és húzza a 9 mezőt áthúzó vonal megrajzolásához, a fekete mezőből a fekete mezőbe.', 'A megerősítéshez kattintson duplán.'});
  • sor = imline;
  • pozíció = várakozás (sor);
  • végpontok = line.getPosition;

Húzza ki a rajzolt vonal végpontjainak X és Y koinátját.

  • X = végpontok (:, 1)
  • Y = végpontok (:, 2);

Az improfile segítségével készíthet gráfot a húzott vonal mentén talált intenzitások alapján. Ennek egy négyzethullámhoz kell hasonlítania 0 (fekete) és 1 (fehér) között. Számítsa ki a csúcsokat és azok helyét is.

  • 2. ábra)
  • részterület (1, 2, 1)
  • title ('Kép intenzitása az improfile vonalon (Control)')
  • improfile (I_binary, X, Y); rács be;
  • [~, ~, c1, ~, ~] = improfile (I_binary, X, Y);
  • [csúcsok, loc] = findpeaks (c1 (:,:, 1));
  • kitartás
  • telek (loc, csúcsok, 'ro');
  • távol tartja magát

Keresse meg az egyes fennsíkok hosszát az improfile gráfon egy for ciklus segítségével. Futtassa a for ciklust ugyanannyi csúcsra, mint amennyi az improfile gráfban van. Az egyes fennsíkok hosszának kiszámításához használja a „Find” funkciót, hogy megtalálja az összes olyan helyet, ahol „1” van a „0” intenzitásérték helyett. Ezután számítsa ki a tömb hosszát, hogy megkapja a fennsík teljes hosszát, amelynek meg kell egyeznie egy fehér négyzet szélességével pixelben. ControlPlateauList = nullák (1, hossz (loc));

i = 1 esetén: hossz (loc)

ha i == hossz (loc)

fennsík = lelet (c1 (loc (i): vége,:, 1));

más

fennsík = lelet (c1 (loc (i): loc (i+1) -1,:, 1));

vége

ControlPlateauList (i) = hossz (fennsík);

vége

5. lépés: Ismételje meg a 3. és 4. lépést a tesztképhez

Ismételje meg a 3. és 4. lépést a tesztképhez
Ismételje meg a 3. és 4. lépést a tesztképhez

*Megjegyzés: amikor az improfile vonalat rajzolja a tesztképre, ügyeljen arra, hogy azt a négyzeteken keresztül húzza meg, amelyek megfelelnek a vezérlőképen rajzolt vonalnak.

6. lépés: Számítsa ki az objektív nagyítását

Számítsa ki az objektív nagyítását
Számítsa ki az objektív nagyítását

A felnagyított méréseket úgy kell kiszámítani, hogy a fennsík hosszának átlagát, amelyet az 5. lépésben számoltak ki, elosztjuk a kontrollplató hosszának átlagával, amelyet a 4. lépésben számoltunk ki. Ez 1,0884.

nagyítás = átlag (fennsík lista)/átlag (kontrollplató lista);

7. lépés: Az R-négyzet és a felhasználó receptjének megkeresése interpoláció útján

Az R-négyzet és a Felhasználói előírás megtalálása interpoláció útján
Az R-négyzet és a Felhasználói előírás megtalálása interpoláció útján

A kód használata:

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

Megtaláljuk a GivenPresciption (a lencséink által megadott értékek) grafikon R-négyzet értékét a MagArray-vel (a korábban kiszámított nagyítási arányok tömbje). Ha elég magas az R-négyzet értéke, akkor arra lehet következtetni, hogy elég erős korreláció áll fenn ennek a módszernek a használatához. Ebben a konkrét esetben az R-négyzet értéke 0,9912 volt, ami erős korrelációra utal, és ezért indokolt ennek a módszernek az elemzésben történő alkalmazása.

A funkció használata:

Előírás = interp1 (MagArray, GivenPrescription, nagyítás, 'lineáris');

Interpolálhatjuk a nagyítási arányunk megfelelő receptértékét (az x tengelyen) (érték az y tengelyen), és megtalálhatjuk, hogy mi a felhasználó receptje.

Az adatok interpolálása fontos ahhoz, hogy ez a módszer működjön, mivel lehetővé teszi számunkra, hogy a rendelkezésünkre álló információk alapján feltételezéseket tegyünk a rendelkezésünkre álló információkkal kapcsolatban. Míg a legjobban illeszkedő sor technikailag erősebb jelölt lenne erre a feltételezésre, a határok megteremtése a kimenetek számának csökkentése érdekében ugyanazt a hatást fejti ki, mint a vényköteles szemüvegek növekvő egységes értékei. Ezt a későbbi lépésekben magyarázzák.

8. lépés: A felhasználó receptjének megjelenítése grafikonon

A felhasználó receptjének megjelenítése grafikonon
A felhasználó receptjének megjelenítése grafikonon

A következő kód használatával:

  • ábra;
  • plot (GivenPrescription, MagArray, '-g')
  • kitartás
  • cselekmény (recept, nagyítás, "bp")
  • távol tartja magát
  • rács
  • jelmagyarázat („Adatok”, „Interpolált pontok”, „Hely”, „ÉNy”)

Ábrázolhatunk egy grafikont, amely zöld vonallal mutatja a nagyítási arányokat a megadott előírással szemben, és a számított nagyítás talált adatait, összehasonlítva a kék csillaggal interpolált receptünkkel. Ezután a felirat felcímkézi a címet, az x tengelyt és az y tengelyt, és elhelyezi a jelmagyarázatot a bal felső sarokban.

9. lépés: Szűkítse a receptjét

Szűkítse receptjét
Szűkítse receptjét

Az alábbi kódot használják a recept kerekítéséhez:

  • ha Vényköteles <= 1,125

    CalculatedPrescription = '1.0';

  • elseif Vényköteles <= 1,375

    CalculatedPrescription = '1,25';

  • elseif Vényköteles <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Vényköteles <= 1.875

    CalculatedPrescription = '1.75';

  • elseif Vényköteles <= 2,25

    CalculatedPrescription = '2.0';

  • elseif Vényköteles <= 2,625

    CalculatedPrescription = '2.5';

  • elseif Vényköteles <= 3

    CalculatedPrescription = '2.75';

  • elseif Vényköteles <= 3.375

    CalculatedPrescription = '3.25';

  • más

    CalculatedPrescription = 'ismeretlen';

  • vége

Az interpoláció során talált recept nem feltétlenül tükrözi a tényleges receptet - ez azért van, mert emberi hiba miatt a fotó elemzésében mindig lesznek kis eltérések. Így szükségünk van erre a lépésre, hogy minősítsük a tényleges receptet.

A megadott előírások általában 1,0 dioptriából indulnak ki, és a receptjeikben 0,25 -tel növekednek, így a recept kiszámítása után szeretnénk meghatározni azt a receptet, amely a legjobban megfelel a felhasználónak. A recept kiszámítása után végigfuttatjuk a megadott If utasításokon, hogy ellenőrizze annak értékét és meghatározzuk, melyik receptre van szükség. Ha 1,125 -nél kisebb vagy egyenlő, akkor az előírás 1,0. Ha 1,375 -nél kisebb vagy egyenlő, az előírás 1,25. Ha az 1.625 -nél kisebb vagy egyenlő, az előírás 1.5. Ha 1,845 -nél kisebb vagy egyenlő, az előírás 1,75. Stb.

Az értékek növekednek, mivel ellenőrizzük, hogy az értékek kisebbek -e. Ha a csökkenő értékeket csináljuk, akkor az első if utasítás mindig olvassa az első if utasítást. Ha a recept a legkisebb, azt akarjuk, hogy azonnal felismerje a legkisebbnek, ezért a legkisebb értékkel kezdtük. Bármi magasabb, mint a legmagasabb érték, azt jelenti, hogy a recept nem tartozik az adataink tartományába, így az „Ismeretlen” karakterláncot adja meg.

Ajánlott: