תוכן עניינים:

עיטוף מרשם גלגל העין שלך: פרויקט BME60B: 9 שלבים
עיטוף מרשם גלגל העין שלך: פרויקט BME60B: 9 שלבים

וִידֵאוֹ: עיטוף מרשם גלגל העין שלך: פרויקט BME60B: 9 שלבים

וִידֵאוֹ: עיטוף מרשם גלגל העין שלך: פרויקט BME60B: 9 שלבים
וִידֵאוֹ: העוגות של אור - מתכון לגלסאז' Or's Cakes - Glacage 2024, יולי
Anonim
עיטוף מרשם גלגל העין שלך: פרויקט BME60B
עיטוף מרשם גלגל העין שלך: פרויקט BME60B

מאת: האנה סיילוס, סאנג הי קים, תומאס וזקז, פטריק ויסטה

הגדלה היא אחד המאפיינים המרכזיים הקיימים במשקפי קריאה, המסווגים לפי מרשם דיופטרים. על פי אוניברסיטת הטכנולוגיה של מישיגן, דיופטר הוא אורך המוקד של העדשה, הנמדד בדרך כלל במ מ, ביחידת המטרים (אוניברסיטת הטכנולוגיה של מישיגן). מכיוון שמשקפי קריאה כוללים עדשות קמורות, אורך המוקד יהיה חיובי, דבר שיגרום גם לדיופטים להיות חיוביים (HyperPhysics). אורך המוקד גדל ככל שהמרחק בין האובייקט מתרחק מהעדשה בפועל, וזה מוביל לדיופטים לרדת מכיוון שהם פרופורציונליים הפוכים. לכן, משקפי קריאה עם דיופטרים נוספים יעזרו לעדשה להגדיל את התצוגה כך שייראה שאורך המוקד יהיה פחות על ידי העלאת ערך הדיופטרים.

הקוד המוצג ישמש לחיזוי דיופטר של עדשה ללא מרשם לא ידוע. שתי תשומות משמשות לחישוב המרשם: תצלום של הרקע המבוקר ללא שימוש בעדשות, ותצלום נוסף של אותו רקע אך באמצעות עדשת הבחירה. התוכנית תמדוד את העיוות בין שני התצלומים הללו. משם נוכל לאמוד את דיופטר העדשה ולהפיק תוצאה לצפייה של המשתמש.

לצורך הוראה זו תזדקק ל:

  • תבנית לוח שחמט בשחור-לבן המודפסת על נייר בגודל 11x8.5
  • מצלמה עם יכולת לנעול את המיקוד שלה
  • חצובה, או משהו דומה לאבטחת המצלמה
  • מרשמים שונים של משקפי קריאה
  • MATLAB

שלב 1: צלם תמונות

לצלם תמונות
לצלם תמונות
לצלם תמונות
לצלם תמונות
לצלם תמונות
לצלם תמונות

על מנת לחשב את הגדלת העדשה, עליך להיות מסוגל להשוות אותה לגודל האובייקט בפועל. עבור פרויקט זה, נשווה תמונה מוגדלת לתמונת בקרה.

לפיכך, השלב הראשון הוא לצלם שתי תמונות של אותה תמונה - הראשונה רק באמצעות המצלמה, והשנייה דרך עדשת משקפי הקריאה שברצונך לבדוק.

אתה תצלם לוח שחמט בגודל 8.5x11 אינץ 'בשחור עם רשת 1 אינץ'. הגדר את המצלמה שלך במרחק של 11 מטרים מהלוח השחמט. לפני צילום התמונות, נעל את המיקוד על לוח השחמט.

צלם את לוח השחמט ללא משקפי הקריאה. לאחר מכן, מבלי להזיז דבר, הנח את משקפי הקריאה מול המצלמה וצלם את התמונה השנייה.

ודא שמיקום המצלמה שלך לא זז בין הצילומים. הדבר היחיד שצריך להשתנות בין שתי התמונות הוא הנוכחות של עדשת המשקפיים מול המצלמה.

כשתסיים עם התמונות, העלה אותן למחשב שלך.

שלב 2: טען את התמונות ב- MATLAB

טען את התמונות ב- MATLAB
טען את התמונות ב- MATLAB

פתח סקריפט חדש.

ראשית, ציין את הספרייה שבה מאוחסנים התמונות. לאחר מכן, השתמש בפונקציית dir לחילוץ תמונות-j.webp

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

עבור הפרויקט שלנו, רצינו לבקש מהמשתמש בתוכנית לאילו קבצים הוא רוצה להשוות. החלק הראשון מבקש מהמשתמש לציין את תמונת הבקרה, והשני מבקש מהמשתמש לציין את תמונת הבדיקה.

  • שאל את המשתמש איזה קובץ הוא תמונת הבקרה.
  • Control = קלט ('מספר תמונת הפקד. / N');
  • ControlFile = [GetDir (Control).name]
  • שאל את המשתמש איזה קובץ הוא התמונה שהם רוצים לנתח.
  • ChooseFile = קלט ('\ n# של התמונה שברצונך לנתח. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

שלב 3: ניתוח תמונה

ניתוח תמונה
ניתוח תמונה
ניתוח תמונה
ניתוח תמונה

תמונה צבעונית ב- MATLAB היא בגודל MxNx3, בעוד שתמונה בגווני אפור היא MxN. המשמעות היא שזה מהיר יותר לשפר/לערוך תמונה בגווני אפור מכיוון שיש פחות נתונים לעקוב אחריהם. השתמש ב- rgb2gray כדי להמיר את התמונה לגווני אפור. (הפונקציה imrotate שימשה מכיוון שהתמונות שלנו הגיעו לרוחב - שורת קוד זו עשויה להיות נחוצה בגרסה שלך או לא.)

  • %להמיר לגווני אפור ולסובב
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotate (I, 90);

לאחר מכן, הצג את התמונה. פונקציית חלקת המשנה משמשת כך שתמונת הבדיקה תוכל להיות ליד הפקד בשלבים מאוחרים יותר.

  • %לְהַצִיג
  • איור 1);
  • עלילת משנה (1, 2, 1)
  • imshow (I);
  • title (ControlFile);

השתמש ב- imcrop כדי לבקש מהמשתמש לחתוך את לוח השחמט מתוך התמונה המלאה. הקוד הבא מציג גם תיבת הודעות המספקת הוראות למשתמש.

  • %חיתוך לוח שחמט לניתוח
  • waitfor (msgbox ({'השתמש בשערות הצולבות כדי לחתוך לוח שחמט.', 'לאחר מכן לחץ פעמיים על אזור עניין.}}));
  • I_crop = imcrop (I);

השתמש ב- imbinarize לבינאריזציה של התמונה.

I_binary = imbinarize (I_crop);

שלב 4: חשב את רוחב הריבועים הלבנים על לוח השחמט

חשב את רוחב הריבועים הלבנים על לוח השחמט
חשב את רוחב הריבועים הלבנים על לוח השחמט
חשב את רוחב הריבועים הלבנים על לוח השחמט
חשב את רוחב הריבועים הלבנים על לוח השחמט
חשב את רוחב הריבועים הלבנים על לוח השחמט
חשב את רוחב הריבועים הלבנים על לוח השחמט

לאחר מכן, בקש מהמשתמש לצייר קו על פני התמונה באמצעות imline. קו זה אמור לרוץ אופקית על פני לוח השחמט. זה צריך להתחיל ולסיים בריבוע שחור (לא משנה היכן)- זאת מכיוון שנמדוד את רוחב הריבועים הלבנים, לא את השחורים.

  • %ציור קו
  • איור 1)
  • עלילת משנה (1, 2, 1)
  • imshow (I_binary);
  • waitfor (msgbox ({'לחץ וגרור כדי לצייר קו המשתרע על 9 תיבות, מרווח שחור למרחב שחור.', 'לחץ לחיצה כפולה לאישור.'}));
  • line = imline;
  • מיקום = המתן (שורה);
  • נקודות קצה = line.getPosition;

חלץ את הקואדינציות X ו- Y עבור נקודות הקצה של הקו המשורטט.

  • X = נקודות קצה (:, 1)
  • Y = נקודות קצה (:, 2);

השתמש בלא תקין כדי לייצר גרף המבוסס על העוצמות הנמצאות לאורך הקו המצויר. זה אמור להידמות לגל מרובע הנע בין 0 (שחור) ל -1 (לבן). חשב גם את הפסגות ואת מיקומן.

  • איור (2)
  • עלילת משנה (1, 2, 1)
  • כותרת ('עוצמת התמונה על פני הקו הבלתי מותאם (שליטה)')
  • לא תקין (I_binary, X, Y); רשת על;
  • [~, ~, c1, ~, ~] = לא תקין (I_binary, X, Y);
  • [peaks, loc] = findpeaks (c1 (:,:, 1));
  • תחזיק מעמד
  • עלילה (לוק, פסגות, 'רו');
  • להדוף

מצא את אורך כל רמה בגרף הבלתי מתאים באמצעות לולאת for. הפעל את לולאת ה- for עבור אותה כמות פסגות שיש בגרף הבלתי מתאים. כדי לחשב את אורך כל רמה, השתמש בפונקציית 'מצא' כדי למצוא את כל המיקומים שבהם יש ערך '1' במקום ערך '0'. לאחר מכן, חשב את אורך המערך כדי לקבל את האורך הכולל של הרמה, שאמור להיות שווה לרוחב הריבוע הלבן בפיקסלים. ControlPlateauList = אפסים (1, אורך (לוק));

עבור i = 1: אורך (לוק)

אם i == אורך (לוק)

רמה = למצוא (c1 (לוק (i): סוף,:, 1));

אַחֵר

רמה = מצא (c1 (לוק (i): לוק (i+1) -1,:, 1));

סוֹף

ControlPlateauList (i) = אורך (רמה);

סוֹף

שלב 5: חזור על שלבים 3 ו -4 עבור תמונת הבדיקה

חזור על שלבים 3 ו -4 עבור תמונת הבדיקה
חזור על שלבים 3 ו -4 עבור תמונת הבדיקה

*הערה: בעת ציור הקו הבלתי תקין על תמונת הבדיקה, הקפד לצייר אותו על פני הריבועים התואמים את הקו שציירת בתמונת הבקרה.

שלב 6: חשב את הגדלת העדשה

חשב את הגדלת העדשה
חשב את הגדלת העדשה

המדידות המוגדלות מחושבות על ידי חלוקת ממוצע אורך הרמה, שחושב בשלב 5, בממוצע אורך רמת הפיקוח, שחושב בשלב 4. זה מחושב ל -1.0884.

הגדלה = ממוצע (plateauList)/ממוצע (ControlPlateauList);

שלב 7: מציאת R-squared ומרשם המשתמש באמצעות אינטרפולציה

מציאת ריבוע R ו- מרשם המשתמש באמצעות אינטרפולציה
מציאת ריבוע R ו- מרשם המשתמש באמצעות אינטרפולציה

שימוש בקוד:

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

אנו יכולים למצוא את הערך R בריבוע של התרשים GivenPresciption (הערכים הנתונות לעדשות שלנו) לעומת MagArray (מערך של יחסי מדידות ההגדלה שחישבנו קודם לכן). על ידי ערך גבוה מספיק בריבוע R, ניתן להסיק שיש מתאם חזק מספיק כדי להצדיק את השימוש בשיטה זו. במקרה הספציפי הזה, ערך ה- R בריבוע היה 0.9912, מה שמעיד על מתאם חזק ולכן מוצדקים להשתמש בשיטה זו בניתוח.

שימוש בפונקציה:

Prescription = interp1 (MagArray, GivenPrescription, הגדלה, 'לינארית');

אנו יכולים לבצע אינטרפולציה של ערך המרשם המתאים (על ציר ה- x) של יחס ההגדלה שלנו (ערך על ציר y) ולמצוא מה המרשם של המשתמש.

אינטרפולציה של נתונים חשובה כדי ששיטה זו תפעל מכיוון שהיא מאפשרת לנו להניח הנחות לגבי מידע שאין לנו, בהתבסס על המידע שיש לנו. אמנם קו ההתאמה הטובה ביותר מבחינה טכנית יהיה מועמד חזק יותר להנחה זו, אך יצירת גבולות להפחתת מספר התפוקות משרתת את אותה השפעה כמו שמשקפי מרשם מגיעים בערכים אחידים מצטברים בכל מקרה. זה מוסבר בשלבים מאוחרים יותר.

שלב 8: הצגת מרשם המשתמש על גרף

הצגת מרשם המשתמש על גרף
הצגת מרשם המשתמש על גרף

שימוש בקוד הבא:

  • דמות;
  • עלילה (GivenPrescription, MagArray, '-g')
  • תחזיק מעמד
  • עלילה (מרשם, הגדלה, 'bp')
  • להדוף
  • רֶשֶׁת
  • legend ('נתונים', 'נקודות אינטרפולציה', 'מיקום', 'NW')

אנו יכולים לשרטט גרף המציג את יחסי ההגדלה מול המרשם הנתון עם קו ירוק ואת הנתונים שנמצאו של ההגדלה המחושבת שלנו מול המרשם האינטרפולציה שלנו עם כוכב כחול. ואז האגדה מתייגת את הכותרת, ציר ה- x וציר ה- y וממקמת את המקרא בפינה השמאלית העליונה.

שלב 9: צמצם את המרשם שלך

צמצם את המרשם שלך
צמצם את המרשם שלך

הקוד הבא משמש לייצור העיגול למרשם:

  • אם מרשם <= 1.125

    CalculatedPrescription = '1.0';

  • elseif מרשם <= 1.375

    CalculatedPrescription = '1.25';

  • elseif מרשם <= 1.625

    CalculatedPrescription = '1.5';

  • elseif מרשם <= 1.875

    CalculatedPrescription = '1.75';

  • elseif מרשם <= 2.25

    CalculatedPrescription = '2.0';

  • elseif מרשם <= 2.625

    CalculatedPrescription = '2.5';

  • elseif מרשם <= 3

    CalculatedPrescription = '2.75';

  • elseif מרשם <= 3.375

    CalculatedPrescription = '3.25';

  • אַחֵר

    CalculatedPrescription = 'לא ידוע';

  • סוֹף

המרשם שנמצא באמצעות אינטרפולציה אינו משקף בהכרח את המרשם בפועל - זאת מכיוון שתמיד יהיו וריאציות קלות בניתוח הצילום עקב טעות אנוש. לפיכך, אנו זקוקים לשלב זה כדי לסווג את המרשם בפועל.

המרשמים הניתנים בדרך כלל מתחילים מ -1.0 דיופטר ועולים ב -25 במרשמים שלהם, לכן לאחר חישוב המרשם אנו רוצים לקבוע את המרשם המתאים ביותר למה שהמשתמש עשוי להזדקק לו. לאחר חישוב המרשם, אנו מפעילים אותו באמצעות הצהרות If הנתונות כדי לבדוק את ערכו ולקבוע איזה מרשם נחוץ. כל מה שפחות או שווה ל- 1.125, אז המרשם הוא 1.0. כל דבר פחות או שווה ל -1.375, המרשם הוא 1.25. כל דבר פחות או שווה ל -1.625, המרשם הוא 1.5. כל דבר פחות או שווה ל -1.845, המרשם הוא 1.75. וכן הלאה.

הערכים שלנו גדלים מכיוון שאנו בודקים אם הערכים נמוכים מ-. אם עשינו את הערכים יורדים אז המשפט הראשון אם היה קורא את המשפט אם הראשון כל הזמן. אם המרשם הוא הקטן ביותר, אנו רוצים שהוא יזהה אותו כקטן ביותר מיד, ולכן זו הסיבה שהערך הקטן ביותר הוא מה שהתחלנו איתו. כל דבר הגבוה מהערך הגבוה ביותר פירושו שהמרשם אינו בטווח הנתונים שלנו, ולכן הוא יעניק לקריאת המחרוזת "לא ידועה".

מוּמלָץ: