Mündəricat:

Göz kürənizin resepti: BME60B Layihəsi: 9 addım
Göz kürənizin resepti: BME60B Layihəsi: 9 addım

Video: Göz kürənizin resepti: BME60B Layihəsi: 9 addım

Video: Göz kürənizin resepti: BME60B Layihəsi: 9 addım
Video: 【フェイシャルエステ】日本一のエステティシャンが伝授!エステ王子が教える軽擦法4つの癒しのフェイシャルエステテクニック(facial massage) 2024, Iyul
Anonim
Göz kürənizin resepti: BME60B Layihəsi
Göz kürənizin resepti: BME60B Layihəsi

Müəllif: Hannah Silos, Sang Hee Kim, Thomas Vazquez, Patrick Viste

Büyütmə, diopterlərin təyin edilməsi ilə təsnif edilən eynəkləri oxumaq üçün mövcud olan əsas xüsusiyyətlərdən biridir. Miçiqan Texnologiya Universitetinə görə, bir diopter lensin fokus uzunluğudur və ümumiyyətlə mm ilə ölçülür (Michigan Texnologiya Universiteti). Oxuyan eynəklərin qabarıq linzaları olduğundan, fokus uzunluğu pozitiv olardı və bu da diopterlərin müsbət olmasına səbəb olardı (HyperPhysics). Fokus məsafəsi obyekt arasındakı məsafə həqiqi lensdən uzaqlaşdıqca artır və bu, diopterlərin tərs mütənasib olması səbəbindən azalmasına səbəb olur. Buna görə də, əlavə diopterləri olan oxuyan eynəklərin olması, lensin görünüşünü böyütməsinə kömək edərdi ki, bu da diopterlərin dəyərini artıraraq fokus uzunluğunun daha az olduğu görünə bilər.

Təqdim olunan kod, naməlum reseptli bir lensin diopteriyasını proqnozlaşdırmaq üçün istifadə ediləcək. Resepti hesablamaq üçün iki giriş istifadə olunur: heç bir linzadan istifadə edilmədən idarə olunan fonun fotoşəkili və eyni fonda, lakin seçilmiş obyektivdən başqa bir fotoşəkil. Proqram bu iki fotoşəkil arasındakı təhrifi ölçəcək. Oradan, lensin dioptrisini təxmin edə və istifadəçinin görməsi üçün bir nəticə çıxara biləcəyik.

Bu Təlimat üçün sizə lazım olacaq:

  • 11x8.5 ölçüdə kağız üzərində çap olunmuş ağ-qara dama taxtası nümunəsi
  • Diqqətini kilidləmək qabiliyyətinə malik bir kamera
  • Bir tripod və ya kameranı qorumaq üçün bənzər bir şey
  • Oxuma eynəklərinin müxtəlif reseptləri
  • MATLAB

Addım 1: Foto çəkin

Şəkillər çək
Şəkillər çək
Şəkillər çək
Şəkillər çək
Şəkillər çək
Şəkillər çək

Bir lensin böyüdülməsini hesablamaq üçün onu obyektin həqiqi ölçüsü ilə müqayisə etməlisiniz. Bu layihə üçün böyüdülmüş bir görüntünü bir nəzarət görüntüsü ilə müqayisə edəcəyik.

Beləliklə, ilk addım eyni şəkildəki iki fotoşəkil çəkməkdir - birincisi yalnız kamera vasitəsilə, ikincisi isə test etmək istədiyiniz oxu eynəyinin obyektivindən.

1 düymlük ızgaralı 8.5x11in ölçülü qara və ağ dama taxtasının şəklini çəkəcəksiniz. Kameranızı dama taxtasından 11 düym uzaqda qurun. Fotoşəkillər çəkməzdən əvvəl diqqəti dama taxtasına bağlayın.

Oxuma eynəyi olmadan dama taxtasının şəklini çəkin. Sonra heç bir şeyi tərpətmədən oxu eynəyini kameranın qarşısına qoyun və ikinci fotoşəkili çəkin.

Kameranızın mövqeyinin çəkilişlər arasında hərəkət etmədiyinə əmin olun. İki fotoşəkil arasında dəyişməli olan tək şey, kamera qarşısında eynək lensinin olmasıdır.

Şəkilləri bitirdikdən sonra onları kompüterinizə yükləyin.

Addım 2: Şəkilləri MATLAB -a yükləyin

Şəkilləri MATLAB -a yükləyin
Şəkilləri MATLAB -a yükləyin

Yeni bir skript açın.

Əvvəlcə fotoşəkillərin saxlandığı qovluğu göstərin. Sonra-j.webp

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

Layihəmiz üçün faylları müqayisə etmək istədikləri proqramın istifadəçisini xəbərdar etmək istədik. Birinci hissə istifadəçidən nəzarət şəklini, ikinci hissə isə istifadəçidən test şəklini göstərməsini xahiş edir.

  • İstifadəçidən hansı faylın nəzarət görüntüsü olduğunu soruşun.
  • Control = giriş ('nəzarət görüntüsünün#. / N');
  • ControlFile = [GetDir (Control).adı]
  • İstifadəçidən hansı faylın təhlil etmək istədiklərini soruşun.
  • SelectFile = giriş ('\ n# analiz etmək istədiyiniz şəkil. / N');
  • PrescripFile = [GetDir (SelectFile).adı];

Addım 3: Şəkil təhlili

Şəkil təhlili
Şəkil təhlili
Şəkil təhlili
Şəkil təhlili

MATLAB -da rəngli bir şəkil MxNx3 ölçüsündədir, boz rəngli görüntü isə MxN -dir. Bu o deməkdir ki, boz rəngli görüntünü artırmaq/redaktə etmək daha sürətlidir, çünki onu izləmək üçün daha az məlumat var. (İmrotate funksiyası, fotoşəkillərimiz üfüqi vəziyyətdə olduğu üçün istifadə edildi - bu kod xətti versiyanızda lazım ola bilər və ya olmaya bilər.)

  • %boz rəngə çevirin və döndərin
  • I = oxuyun (ControlFile);
  • I = rgb2gray (I);
  • I = imrotat (I, 90);

Sonra, görüntünü göstərin. Subplot funksiyası, test görüntüsünün sonrakı addımlarda nəzarətin yanında ola bilməsi üçün istifadə olunur.

  • %ekran
  • rəqəm (1);
  • alt plan (1, 2, 1)
  • imshow (I);
  • başlıq (ControlFile);

İstifadəçidən dama lövhəsini tam görüntüdən çıxarmasını istəmək üçün imcrop istifadə edin. Aşağıdakı kod da istifadəçiyə təlimat vermək üçün bir mesaj qutusu göstərir.

  • təhlili üçün dama çıxarmaq
  • waitfor (msgbox ({'Dama taxtasını kəsmək üçün çarpaz tüklərdən istifadə edin.', 'Sonra maraq dairəsinə iki dəfə klikləyin.'})));
  • I_crop = imcrop (I);

Görüntünü ikiqatlaşdırmaq üçün imbinarize istifadə edin.

I_binary = imbinarize (I_crop);

Addım 4: Dama lövhəsindəki Ağ Kvadratların Genişliyini hesablayın

Dama lövhəsindəki Ağ Meydanların Genişliyini hesablayın
Dama lövhəsindəki Ağ Meydanların Genişliyini hesablayın
Dama lövhəsindəki Ağ Meydanların Genişliyini hesablayın
Dama lövhəsindəki Ağ Meydanların Genişliyini hesablayın
Dama lövhəsindəki ağ kvadratların enini hesablayın
Dama lövhəsindəki ağ kvadratların enini hesablayın

Sonra, istifadəçini imline istifadə edərək görüntünün üzərində bir xətt çəkməsini istəyin. Bu xətt dama taxtası boyunca üfüqi şəkildə uzanmalıdır. Qara meydanda başlamalı və bitməlidir (harada olmasının əhəmiyyəti yoxdur)- bunun səbəbi qara kvadratların deyil, ağ kvadratların enini ölçəcəyik.

  • %xətt çək
  • rəqəm (1)
  • alt plan (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'Qara boşluqdan qara boşluğa 9 qutunu əhatə edən xətt çəkmək üçün klikləyin və sürükləyin.', 'Təsdiq etmək üçün iki dəfə basın.')));
  • xətt = imline;
  • mövqe = gözləyin (xətt);
  • son nöqtələr = line.getPosition;

Çizilmiş xəttin son nöqtələri üçün X və Y koordinatlarını çıxarın.

  • X = son nöqtələr (:, 1)
  • Y = son nöqtələr (:, 2);

Çizilmiş xətt boyunca tapılan intensivliklərə əsaslanaraq bir qrafik yaratmaq üçün qeyri -adi istifadə edin. Bu 0 (qara) ilə 1 (ağ) arasında dəyişən bir kvadrat dalğaya bənzəməlidir. Zirvələri və onların yerlərini də hesablayın.

  • rəqəm (2)
  • alt plan (1, 2, 1)
  • başlıq ('Yaratılmayan xətt boyunca görüntü intensivliyi (Nəzarət)')
  • uyğun olmayan (I_binary, X, Y); ızgara;
  • [~, ~, c1, ~, ~] = uyğunsuz (I_binary, X, Y);
  • [zirvələr, loc] = findpeaks (c1 (:,,, 1));
  • gözlə
  • süjet (lok, zirvələr, 'ro');
  • dayanmaq

For loop istifadə edərək, hər bir yaylağın uzunluğunu uyğun olmayan qrafikdə tapın. Qeyri -adi qrafikdəki eyni sayda zirvələr üçün for loopunu işlədin. Hər yaylağın uzunluğunu hesablamaq üçün '0' intensivlik dəyəri yerinə '1' olduğu bütün yerləri tapmaq üçün 'tap' funksiyasından istifadə edin. Ardından, ağ kvadratın eni ilə bərabər olan platonun ümumi uzunluğunu əldə etmək üçün o cərgənin uzunluğunu hesablayın. ControlPlateauList = sıfır (1, length (loc));

i = 1 üçün: uzunluq (loc)

əgər mən == uzunluq (yer)

yayla = tap (c1 (loc (i): son,:, 1));

başqa

yayla = tap (c1 (loc (i): loc (i+1) -1,:, 1));

bitmək

ControlPlateauList (i) = uzunluq (yayla);

bitmək

Addım 5: Test Şəkili üçün 3 və 4 -cü addımları təkrarlayın

Test Şəkli üçün 3 və 4 -cü addımları təkrarlayın
Test Şəkli üçün 3 və 4 -cü addımları təkrarlayın

*Qeyd: test şəklinə uyğun olmayan xətt çəkərkən, onu nəzarət görüntüsündə çəkdiyiniz xəttə uyğun olan meydanların üzərinə çəkdiyinizə əmin olun.

Addım 6: Lensin böyüdülməsini hesablayın

Lensin böyüdülməsini hesablayın
Lensin böyüdülməsini hesablayın

Böyüdülmüş ölçülər, 5 -ci addımda hesablanan yaylağın uzunluğunun ortalamasının 4 -cü addımda hesablanan nəzarət yaylasının uzunluğunun ortasına bölünməsi ilə hesablanır. Bunun 1.0884 olduğu hesablanır.

böyütmə = ortalama (platoList)/orta (ControlPlateauList);

Addım 7: R-kvadratını və İstifadəçinin İnterpolasiya yolu ilə reseptini tapın

R-kvadratını və İstifadəçinin İnterpolasiya yolu ilə reseptini tapmaq
R-kvadratını və İstifadəçinin İnterpolasiya yolu ilə reseptini tapmaq

Kodu istifadə edərək:

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

GiveNPresciption (linzalarımız verilən dəyərlər) və MagArray (əvvəllər hesabladığımız böyütmə ölçü nisbətlərinin bir sıra) qrafikinin R-kvadrat dəyərini tapa bilərik. Kifayət qədər yüksək R-kvadrat dəyərinə malik olmaqla, bu metodun istifadəsini əsaslandıracaq qədər güclü bir əlaqənin olduğu qənaətinə gəlmək olar. Bu xüsusi hal üçün, R-kare dəyəri 0.9912 idi, bu da güclü bir əlaqəni göstərir və buna görə də bu metodun analizdə istifadə edilməsində əsaslandırılır.

Funksiyadan istifadə edərək:

Resept = interp1 (MagArray, GivenPrescription, böyütmə, 'xətti');

Böyütmə nisbətimizin (x oxunda) uyğun resept dəyərini (y oxunda bir dəyər) interpolasiya edə və istifadəçinin reseptinin nə olduğunu tapa bilərik.

Əldə etdiyimiz məlumatlara əsaslanaraq əlimizdə olmayan məlumatlar haqqında fərziyyələr aparmağımıza imkan verdiyindən bu metodun işləməsi üçün interpolasiya məlumatları vacibdir. Ən yaxşı uyğunluq xətti bu fərziyyəyə texniki cəhətdən daha güclü bir namizəd olsa da, çıxış sayını azaltmaq üçün sərhədlər yaratmaq, resept eynəklərinin artan vahid dəyərlərə sahib olması ilə eyni təsiri təmin edir. Bu sonrakı mərhələlərdə izah ediləcəkdir.

Addım 8: İstifadəçinin reseptini qrafiklə göstərmək

İstifadəçinin reseptini qrafiklə göstərmək
İstifadəçinin reseptini qrafiklə göstərmək

Aşağıdakı kodu istifadə edərək:

  • rəqəm;
  • süjet (GivenPrescription, MagArray, '-g')
  • gözlə
  • süjet (resept, böyütmə, 'bp')
  • dayanmaq
  • ızgara
  • əfsanə ('Data', 'Interpolated Points', 'Location', 'NW')

Yaşıl bir xətt ilə böyüdülmüş nisbətləri və verilən reseptə və mavi ulduzlu interpolasiya edilmiş reseptimizə görə hesablanmış böyütmə məlumatlarımızı göstərən bir qrafik qura bilərik. Sonra əfsanə başlığı, x oxunu və y oxunu etiketləyir və əfsanəni sol üst küncdə yerləşdirir.

Addım 9: Reseptinizi Daraltın

Reseptinizi Daraltın
Reseptinizi Daraltın

Reseptin yuvarlaqlaşdırılması üçün aşağıdakı kod istifadə olunur:

  • əgər resept <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Resept <= 1.375

    CalculatedPrescription = '1.25';

  • elseif Resept <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Resept <= 1.875

    CalculatedPrescription = '1.75';

  • elseif Resept <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Resept <= 2.625

    CalculatedPrescription = '2.5';

  • elseif Resept <= 3

    CalculatedPrescription = '2.75';

  • elseif Resept <= 3.375

    CalculatedPrescription = '3.25';

  • başqa

    CalculatedPrescription = 'naməlum';

  • bitmək

İnterpolasiya yolu ilə tapılan resept mütləq həqiqi resepti əks etdirmir - bunun səbəbi, insan səhvi səbəbindən fotoşəkilin təhlilində həmişə kiçik dəyişikliklər olacaq. Beləliklə, həqiqi resepti təsnif etmək üçün bu addıma ehtiyacımız var.

Verilən reseptlər adətən 1.0 diopterdən başlayır və reseptlərində.25 artar, buna görə də resepti hesabladıqdan sonra istifadəçiyə lazım ola biləcək resepti ən uyğun şəkildə təyin etmək istəyirik. Resepti hesabladıqdan sonra, dəyərini yoxlamaq və hansı reseptin lazım olduğunu müəyyən etmək üçün verilən If ifadələrində keçiririk. 1.125 -dən az və ya bərabər bir şey varsa, resept 1.0 -dir. 1.375 -dən az və ya bərabər bir şey, resept 1.25 -dir. 1.625 -dən az və ya bərabər bir şey, resept 1.5 -dir. 1.845 -dən az və ya bərabər bir şey, resept 1.75 -dir. Və s.

Dəyərlərin daha az olub olmadığını yoxladığımız üçün dəyərlərimiz artır. Azalan dəyərləri etsək, ilk if ifadəsi ilk if ifadəsini hər zaman oxuyacaq. Əgər resept ən kiçikdirsə, dərhal ən kiçiyi kimi tanımasını istəyirik, buna görə də ən kiçik dəyərlə başladığımız şeydir. Ən yüksək dəyərdən yüksək bir şey, reseptin məlumatlarımıza uyğun olmadığını bildirir, buna görə də "Naməlum" sətir oxunuşunu verəcəkdir.

Tövsiyə: