Talaan ng mga Nilalaman:

Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyekto ng BME60B: 9 Mga Hakbang
Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyekto ng BME60B: 9 Mga Hakbang

Video: Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyekto ng BME60B: 9 Mga Hakbang

Video: Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyekto ng BME60B: 9 Mga Hakbang
Video: Top 5 Dapat Gawin Pag May Sore Eyes! #kilimanguru 2024, Disyembre
Anonim
Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyektong BME60B
Pag-eyeball ng Reseta ng iyong Eyeball: isang Proyektong BME60B

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

Ang pagpapalaki ay isa sa mga pangunahing tampok na naroroon para sa baso ng pagbabasa, na nauri sa pamamagitan ng kanilang reseta ng diopters. Ayon sa Michigan Technology University, ang isang diopter ay isang focal haba ng lens, karaniwang sinusukat sa mm, sa unit ng metro (Michigan Technology University). Dahil ang baso ng baso ay may mga lente ng matambok, ang haba ng pokus ay magiging positibo, na magiging sanhi ng mga diopters na maging positibo rin (HyperPhysics). Ang haba ng focal ay tumataas habang ang distansya sa pagitan ng bagay ay nakakakuha ng mas malayo mula sa aktwal na lens, at humahantong ito sa pagbaba ng mga diopters dahil magkabaligtad ang proporsyonal. Samakatuwid, ang pagkakaroon ng baso sa pagbabasa na may karagdagang mga diopters ay makakatulong sa lens na mag-zoom sa view upang maaaring mukhang mas mababa ang focal haba sa pamamagitan ng pagtaas ng halaga ng diopters.

Ang ipinakita na code ay gagamitin upang hulaan ang diopter ng isang lens na may hindi kilalang reseta. Ginagamit ang dalawang mga input upang makalkula ang reseta: isang larawan ng kinokontrol na background nang hindi gumagamit ng anumang mga lente, at isa pang litrato ng parehong background ngunit sa pamamagitan ng lens na pinili. Susukat ng programa ang pagbaluktot sa pagitan ng dalawang litratong ito. Mula doon, magagawa naming tantyahin ang diopter ng lens at makagawa ng isang resulta upang matingnan ng gumagamit.

Para sa Maituturo na ito, kakailanganin mo ang:

  • Isang pattern na black-and-white checkerboard na nakalimbag sa isang 11x8.5 sa isang sheet ng papel
  • Isang kamera na may kakayahang i-lock ang pokus nito
  • Isang tripod, o katulad na bagay upang ma-secure ang camera
  • Iba't ibang mga reseta ng baso ng baso
  • MATLAB

Hakbang 1: Kumuha ng mga Larawan

Kumuha ng litrato
Kumuha ng litrato
Kumuha ng litrato
Kumuha ng litrato
Kumuha ng litrato
Kumuha ng litrato

Upang makalkula ang pagpapalaki ng isang lens, kailangan mong ihambing ito sa aktwal na laki ng bagay. Para sa proyektong ito, ihinahambing namin ang isang pinalaki na imahe sa isang kontrol na imahe.

Kaya, ang unang hakbang ay kumuha ng dalawang larawan ng parehong imahe - ang una sa pamamagitan lamang ng kamera, at ang pangalawa sa pamamagitan ng lens ng mga baso na binabasa na nais mong subukan.

Kukuha ka ng larawan ng isang 8.5x11in na itim at puting checkerboard na may isang grid na 1in. I-set up ang iyong camera 11in ang layo mula sa checkerboard. Bago kumuha ng mga larawan, i-lock ang focus sa checkerboard.

Kumuha ng larawan ng checkerboard nang walang baso sa pagbabasa. Pagkatapos, nang walang paggalaw, ilagay ang baso sa harap ng camera at kunan ang pangalawang larawan.

Tiyaking ang posisyon ng iyong camera ay hindi gumagalaw sa pagitan ng mga pag-shot. Ang tanging bagay na dapat baguhin sa pagitan ng dalawang larawan ay ang pagkakaroon ng baso ng lente sa harap ng camera.

Kapag tapos ka na sa mga larawan, i-upload ang mga ito sa iyong computer.

Hakbang 2: I-load ang Mga Larawan Sa MATLAB

I-load ang Mga Imahe sa MATLAB
I-load ang Mga Imahe sa MATLAB

Magbukas ng bagong script.

Una, tukuyin ang direktoryo kung saan nakaimbak ang mga larawan. Pagkatapos, gamitin ang dir function upang kumuha ng mga imahe ng-j.webp

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

Para sa aming proyekto, nais naming himukin ang gumagamit ng programa kung aling mga file ang nais nilang ihambing. Hinihiling ng unang seksyon sa gumagamit na tukuyin ang imahe ng kontrol, at ang pangalawa ay nagtanong sa gumagamit na tukuyin ang imahe ng pagsubok.

  • % Tanungin ang gumagamit kung aling file ang control image.
  • Control = input ('# ng control image. / N');
  • ControlFile = [GetDir (Control).name]
  • % Tanungin ang gumagamit kung aling file ang imaheng nais nilang pag-aralan.
  • ChooseFile = input ('\ n # ng imahe na nais mong pag-aralan. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

Hakbang 3: Pagsusuri sa Imahe

Pagsusuri sa Imahe
Pagsusuri sa Imahe
Pagsusuri sa Imahe
Pagsusuri sa Imahe

Ang isang may kulay na imahe sa MATLAB ay may sukat na MxNx3, samantalang ang isang grayscale na imahe ay MxN. Nangangahulugan ito na ito ay mas mabilis upang mapahusay / mag-edit ng isang grayscale na imahe dahil mayroong mas kaunting data upang subaybayan. Gumamit ng rgb2gray upang i-convert ang imahe sa grayscale. (Ginamit ang pagpapaandar na imrotate dahil ang aming mga larawan ay dumating sa pahalang - ang linya ng code na ito ay maaaring o hindi kinakailangan sa iyong bersyon.)

  • % convert sa grayscale at paikutin
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = gumagaya (I, 90);

Susunod, ipakita ang imahe. Ginamit ang pagpapaandar ng subplot upang ang imahe ng pagsubok ay maaaring maging susunod sa kontrol sa mga susunod na hakbang.

  • % display
  • pigura (1);
  • subplot (1, 2, 1)
  • imshow (I);
  • pamagat (ControlFile);

Gumamit ng imcrop upang i-prompt ang gumagamit na i-crop ang checkerboard mula sa buong imahe. Nagpapakita rin ang sumusunod na code ng isang kahon ng mensahe upang magbigay ng mga tagubilin sa gumagamit.

  • % i-cut ang checkerboard para sa pagtatasa
  • waitfor (msgbox ({'Gumamit ng mga cross hair upang mag-crop ng checkerboard.', 'Pagkatapos ay i-double click ang lugar ng interes.'}));
  • I_crop = imcrop (I);

Gumamit ng imbinarize upang ma-binary ang imahe.

I_binary = imbinarize (I_crop);

Hakbang 4: Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard

Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard
Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard
Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard
Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard
Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard
Kalkulahin ang Lapad ng Mga Puting Kwadro sa Checkerboard

Susunod, i-prompt ang gumagamit na gumuhit ng isang linya sa buong imahe gamit ang imline. Ang linya na ito ay dapat na tumakbo nang pahalang sa buong checkerboard. Dapat itong magsimula at magtapos sa isang itim na parisukat (hindi mahalaga kung saan) - ito ay dahil sinusukat namin ang lapad ng mga puting parisukat, hindi ang mga itim.

  • % gumuhit ng linya
  • pigura (1)
  • subplot (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'I-click at i-drag upang gumuhit ng linya na sumasaklaw sa 9 na kahon, mula sa isang itim na puwang hanggang sa isang itim na puwang.', 'I-double click upang kumpirmahin.'}));
  • linya = imline;
  • posisyon = maghintay (linya);
  • mga endpoint = line.getPosition;

I-extract ang X at Y coodinates para sa mga endpoint ng iginuhit na linya.

  • X = mga endpoint (:, 1)
  • Y = mga endpoint (:, 2);

Gumamit ng hindi maayos upang makabuo ng isang grap batay sa mga intensidad na matatagpuan sa linya ng iginuhit. Ito ay dapat maging katulad ng isang parisukat na alon mula sa 0 (itim) hanggang 1 (puti). Kalkulahin ang mga taluktok at ang kanilang mga lokasyon pati na rin.

  • Figure 2)
  • subplot (1, 2, 1)
  • pamagat ('Intindi ng imahe sa kabuuan ng linya ng hindi pagkakatugma (Control)')
  • hindi maayos (I_binary, X, Y); grid sa;
  • [~, ~, c1, ~, ~] = hindi maayos (I_binary, X, Y);
  • [peaks, loc] = findpeaks (c1 (:,:, 1));
  • hawakan mo
  • balangkas (loc, peaks, 'ro');
  • pigilan

Hanapin ang haba ng bawat talampas sa improfile graph gamit ang isang para sa loop. Patakbuhin ang para sa loop para sa parehong halaga ng mga taluktok doon sa hindi mabuting graph. Upang makalkula ang haba ng bawat talampas, gamitin ang pagpapaandar na 'hanapin' upang hanapin ang lahat ng mga lokasyon kung saan mayroong isang '1' sa halip na isang '0' na halaga ng kasidhian. Pagkatapos, kalkulahin ang haba ng array na iyon upang makuha ang kabuuang haba ng talampas, na dapat katumbas ng lapad ng isang puting parisukat sa mga pixel. ControlPlateauList = zero (1, haba (loc));

para sa i = 1: haba (loc)

kung ako == haba (loc)

talampas = hanapin (c1 (loc (i): pagtatapos,:, 1));

iba pa

talampas = hanapin (c1 (loc (i): loc (i + 1) -1,:, 1));

magtapos

ControlPlateauList (i) = haba (talampas);

magtapos

Hakbang 5: Ulitin ang Mga Hakbang 3 at 4 para sa Larawan ng Pagsubok

Ulitin ang Hakbang 3 at 4 para sa Larawan ng Pagsubok
Ulitin ang Hakbang 3 at 4 para sa Larawan ng Pagsubok

* Tandaan: kapag iginuhit ang hindi maayos na linya sa imahe ng pagsubok, siguraduhing iguhit ito sa mga parisukat na tumutugma sa linya na iginuhit mo sa control image.

Hakbang 6: Kalkulahin ang Laki ng Lens

Kalkulahin ang Laki ng Lens
Kalkulahin ang Laki ng Lens

Ang pinalaki na mga sukat ay kinakalkula sa pamamagitan ng paghahati ng ibig sabihin ng haba ng talampas, na kinakalkula sa hakbang 5, sa pamamagitan ng ibig sabihin ng haba ng control plateau, na kinakalkula sa hakbang 4. Kinakalkula ito sa 1.0884.

pag-magnify = mean (plateauList) / mean (ControlPlateauList);

Hakbang 7: Paghanap ng R-square at Reseta ng Gumagamit Sa Pamamagitan ng Pag-iisa

Paghanap ng R-square at Reseta ng Gumagamit Sa Pamamagitan ng Pag-iisa
Paghanap ng R-square at Reseta ng Gumagamit Sa Pamamagitan ng Pag-iisa

Gamit ang code:

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

Mahahanap natin ang R-square na halaga ng grap na GivenPrescipas (ang aming ibinigay na mga lente na halaga) kumpara sa MagArray (isang hanay ng mga ratios sa pagsukat ng pagpapalaki na kinakalkula namin nang mas maaga). Sa pamamagitan ng pagkakaroon ng sapat na mataas na R-square na halaga, mahihinuha na mayroong isang malakas na sapat na ugnayan upang bigyang-katwiran ang paggamit ng pamamaraang ito. Para sa partikular na kasong ito, ang R-square na halaga ay 0.9912, na nagpapahiwatig ng isang malakas na ugnayan at samakatuwid ay makatuwiran sa paggamit ng pamamaraang ito sa pagtatasa.

Gamit ang pagpapaandar:

Reseta = interp1 (MagArray, GivenPrescription, paglaki, 'linear');

Maaari naming interpolate ang kaukulang halaga ng reseta (sa x-axis) ng aming ratio ng pagpapalaki (isang halaga sa y-axis) at hanapin kung ano ang reseta ng gumagamit.

Ang interpolating data ay mahalaga upang gumana ang pamamaraang ito dahil pinapayagan kaming gumawa ng mga pagpapalagay tungkol sa impormasyong wala sa amin, batay sa impormasyong mayroon kami. Habang ang isang linya ng pinakamahusay na magkasya ay magiging mas malakas na kandidato para sa palagay na ito, ang paglikha ng mga hangganan upang mabawasan ang bilang ng mga output ay nagsisilbi ng parehong epekto habang ang mga de-resetang baso ay dumating sa mga karagdagang pagtaas ng pare-parehong halaga. Ipinaliwanag ito sa susunod na mga hakbang.

Hakbang 8: Ipinapakita ang Reseta ng Gumagamit sa isang Grap

Ipinapakita ang Reseta ng Gumagamit sa isang Grap
Ipinapakita ang Reseta ng Gumagamit sa isang Grap

Gamit ang sumusunod na code:

  • pigura;
  • balangkas (GivenPrescription, MagArray, '-g')
  • hawakan mo
  • balangkas (Reseta, pagpapalaki, 'bp')
  • pigilan
  • parilya
  • alamat ('Data', 'Interpolated Points', 'Lokasyon', 'NW')

Maaari kaming magbalangkas ng isang grap na nagpapakita ng Mga Ratio ng Paglaki kumpara sa Naibigay na Reseta na may berdeng linya at ang nahanap na data ng aming kinakalkula na paglaki kumpara sa aming interpolated na reseta na may asul na bituin. Pagkatapos ang label ay lagda ng pamagat, x-axis, at y-axis at inilalagay ang alamat sa kaliwang sulok sa itaas.

Hakbang 9: Paliitin ang Iyong Reseta

Paliitin ang Iyong Reseta
Paliitin ang Iyong Reseta

Ang sumusunod na code ay ginagamit upang makagawa ng pag-ikot para sa reseta:

  • kung Reseta <= 1.125

    CalculatedPrescription = '1.0';

  • kung hindi man Reseta <= 1.375

    CalculatedPrescription = '1.25';

  • kung hindi man Reseta <= 1.625

    CalculatedPrescription = '1.5';

  • kung hindi man Reseta <= 1.875

    CalculatedPrescription = '1.75';

  • kung hindi man Reseta <= 2.25

    CalculatedPrescription = '2.0';

  • kung hindi man Reseta <= 2.625

    CalculatedPrescription = '2.5';

  • kung hindi man Reseta <= 3

    CalculatedPrescription = '2.75';

  • kung hindi man Reseta <= 3.375

    CalculatedPrescription = '3.25';

  • iba pa

    CalculatedPrescription = 'hindi alam';

  • magtapos

Ang reseta na natagpuan sa pamamagitan ng interpolation ay hindi kinakailangang sumasalamin sa aktwal na reseta - ito ay dahil palaging may bahagyang pagkakaiba-iba sa pag-aaral ng larawan dahil sa error ng tao. Sa gayon, kailangan namin ang hakbang na ito upang maiuri ang aktwal na reseta.

Ang mga reseta na ibinibigay ay karaniwang nagsisimula mula sa 1.0 diopters at tataas ng.25 sa kanilang mga reseta, kaya pagkatapos kalkulahin ang reseta nais naming matukoy ang reseta na pinakaangkop sa maaaring kailanganin ng gumagamit. Matapos makalkula ang reseta, pinapatakbo namin ito sa ibinigay Kung mga pahayag upang suriin ang halaga nito at matukoy kung aling reseta ang kinakailangan. Anumang mas mababa sa o katumbas ng 1.125, pagkatapos ang reseta ay 1.0. Anumang mas mababa sa o katumbas ng 1.375, ang reseta ay 1.25. Anumang mas mababa sa o katumbas ng 1.625, ang reseta ay 1.5. Anumang mas mababa sa o katumbas ng 1.845, ang reseta ay 1.75. At iba pa.

Mayroon kaming mga pagpapataas ng halaga mula nang sinusuri namin kung ang mga halaga ay mas mababa sa. Kung ginawa namin ang mga halagang bumababa kung gayon ang una kung pahayag ay basahin ang una kung pahayag sa lahat ng oras. Kung ang reseta ang pinakamaliit, nais naming kilalanin ito bilang pinakamaliit kaagad, kaya't bakit ang pinakamaliit na halaga ay kung ano ang nagsimula kami. Anumang mas mataas kaysa sa pinakamataas na halaga ay nangangahulugang ang reseta ay hindi nasa saklaw ng aming data, kaya bibigyan nito ang "Hindi kilalang" pagbasa ng string.

Inirerekumendang: