فهرست مطالب:

Eyeballing your Eyeball's Eyeballing: یک پروژه BME60B: 9 مرحله
Eyeballing your Eyeball's Eyeballing: یک پروژه BME60B: 9 مرحله

تصویری: Eyeballing your Eyeball's Eyeballing: یک پروژه BME60B: 9 مرحله

تصویری: Eyeballing your Eyeball's Eyeballing: یک پروژه BME60B: 9 مرحله
تصویری: Unreal Engine 5 Sequencer for Beginners 2024, نوامبر
Anonim
Eyeballing Your Eyeball's Eyeballing: یک پروژه BME60B
Eyeballing Your Eyeball's Eyeballing: یک پروژه BME60B

نویسنده: هانا سیلوس ، سان هی هی کیم ، توماس واسکز ، پاتریک ویست

بزرگنمایی یکی از ویژگی های کلیدی موجود در عینک خواندن است که با تجویز دیوپترها طبقه بندی می شود. به گفته دانشگاه فناوری میشیگان ، دیوپتر فاصله کانونی عدسی است که معمولاً بر حسب میلی متر در واحد متر اندازه گیری می شود (دانشگاه فناوری میشیگان). از آنجا که عینک های مطالعه دارای لنزهای محدب هستند ، فاصله کانونی مثبت خواهد بود و باعث مثبت شدن دیوپترها نیز می شود (HyperPhysics). فاصله کانونی با افزایش فاصله بین جسم از لنز واقعی افزایش می یابد و این امر باعث می شود دیوپترها به دلیل تناسب معکوس کاهش پیدا کنند. بنابراین ، داشتن عینک مطالعه با دیوپترهای اضافی به لنز کمک می کند تا در تصویر بزرگنمایی کند ، به طوری که ممکن است با افزایش ارزش دیوپترها فاصله کانونی کمتر به نظر برسد.

از کد ارائه شده برای پیش بینی دیوپتر لنز با نسخه ای ناشناخته استفاده می شود. از دو ورودی برای محاسبه نسخه استفاده می شود: یک عکس از پس زمینه کنترل شده بدون استفاده از لنز ، و یک عکس دیگر با همان زمینه اما از طریق لنز انتخابی. این برنامه اعوجاج بین این دو عکس را اندازه گیری می کند. از آنجا ، ما می توانیم دیوپتر لنز را تخمین زده و نتیجه ای را برای کاربر ایجاد کنیم.

برای این دستورالعمل ، شما نیاز دارید:

  • یک الگوی شطرنجی سیاه و سفید بر روی کاغذ با ابعاد 11x8.5 چاپ شده است
  • دوربینی با قابلیت قفل کردن فوکوس خود
  • سه پایه یا چیزی مشابه برای ایمن سازی دوربین
  • نسخه های مختلف عینک مطالعه
  • متلب

مرحله 1: عکس بگیرید

عکس گرفتن
عکس گرفتن
عکس گرفتن
عکس گرفتن
عکس گرفتن
عکس گرفتن

برای محاسبه بزرگنمایی عدسی ، باید بتوانید آن را با اندازه واقعی شی مقایسه کنید. برای این پروژه ، ما یک تصویر بزرگنمایی شده را با یک تصویر کنترل مقایسه می کنیم.

بنابراین ، اولین قدم این است که دو عکس از یک عکس بگیرید - اولین عکس فقط از طریق دوربین ، و دومی از طریق عینک مطالعه که می خواهید آزمایش کنید.

شما از یک صفحه شطرنج سیاه و سفید 8.5 در 11 اینچ با یک شبکه 1 اینچ عکس می گیرید. دوربین خود را در فاصله 11 اینچی از صفحه شطرنج تنظیم کنید. قبل از گرفتن عکس ، فوکوس را روی صفحه شطرنج قفل کنید.

از صفحه شطرنج بدون عینک مطالعه عکس بگیرید. سپس ، بدون حرکت دادن چیزی ، عینک مطالعه را جلوی دوربین قرار دهید و عکس دوم را بگیرید.

اطمینان حاصل کنید که موقعیت دوربین شما بین عکس ها حرکت نمی کند. تنها چیزی که باید بین دو عکس تغییر کند وجود عدسی عینک در جلوی دوربین است.

پس از اتمام کار با عکس ها ، آنها را در رایانه خود بارگذاری کنید.

مرحله 2: بارگذاری تصاویر در متلب

بارگذاری تصاویر در متلب
بارگذاری تصاویر در متلب

یک اسکریپت جدید باز کنید.

ابتدا دایرکتوری محل ذخیره عکس ها را مشخص کنید. سپس ، از تابع dir برای استخراج تصاویر-j.webp

Dir = 'C: / Users / kuras / Desktop / class / 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) ؛

در مرحله بعد ، تصویر را نمایش دهید. تابع subplot استفاده می شود تا تصویر آزمایشی بتواند در مراحل بعدی در کنار کنترل قرار گیرد.

  • ٪نمایش دادن
  • شکل 1)؛
  • فرع فرعی (1 ، 2 ، 1)
  • نمایش (I) ؛
  • عنوان (ControlFile) ؛

از imcrop استفاده کنید تا از کاربر بخواهید تخته شطرنج را از تصویر کامل برش دهد. کد زیر همچنین یک جعبه پیام برای ارائه دستورالعمل به کاربر نشان می دهد.

  • ٪ تخته شطرنج را برای تجزیه و تحلیل برش دهید
  • waitfor (msgbox ({'از موهای متقاطع برای بریدن صفحه شطرنجی استفاده کنید.' ، 'سپس روی ناحیه مورد علاقه خود دوبار کلیک کنید.'}))؛
  • I_crop = imcrop (I)؛

برای باینار کردن تصویر از imbinarize استفاده کنید.

I_binary = بی نامگذاری (I_crop) ؛

مرحله 4: عرض مربع های سفید را در صفحه شطرنج محاسبه کنید

عرض مربع های سفید را در صفحه شطرنج محاسبه کنید
عرض مربع های سفید را در صفحه شطرنج محاسبه کنید
عرض مربع های سفید را در صفحه شطرنج محاسبه کنید
عرض مربع های سفید را در صفحه شطرنج محاسبه کنید
عرض مربع های سفید را در صفحه شطرنج محاسبه کنید
عرض مربع های سفید را در صفحه شطرنج محاسبه کنید

در مرحله بعد ، از کاربر بخواهید با استفاده از imline خطی را در سراسر تصویر بکشد. این خط باید به صورت افقی در سراسر صفحه شطرنجی اجرا شود. این باید در یک مربع سیاه شروع و پایان یابد (مهم نیست کجا)- این بدان دلیل است که ما عرض مربع های سفید را اندازه گیری می کنیم ، نه مربع های سیاه.

  • ٪ رسم خط
  • شکل 1)
  • فرع فرعی (1 ، 2 ، 1)
  • نمایش (I_binary) ؛
  • waitfor (msgbox ({'برای کشیدن خطی که 9 جعبه را ترسیم می کند ، از یک فضای سیاه به یک فضای سیاه.' ، 'برای تأیید دوبار کلیک کنید.'})) ؛
  • خط = خط مستقیم ؛
  • موقعیت = انتظار (خط) ؛
  • endpoints = line.getPosition؛

برای نقاط انتهایی خط ترسیم شده ، کدئینات X و Y را استخراج کنید.

  • X = نقاط پایانی (:، 1)
  • Y = نقاط پایانی (: ، 2) ؛

برای ایجاد نمودار بر اساس شدت یافت شده در امتداد خط ترسیم شده ، از improfile استفاده کنید. این باید شبیه یک موج مربعی از 0 (سیاه) تا 1 (سفید) باشد. قله ها و مکان آنها را نیز محاسبه کنید.

  • شکل 2)
  • فرع فرعی (1 ، 2 ، 1)
  • عنوان ('شدت تصویر در خط غیرفعال (کنترل)')
  • غیرفعال (I_binary، X، Y)؛ شبکه روشن است ؛
  • [~ ، ~ ، c1 ، ، ~] = غیرفعال (I_binary، X، Y)؛
  • [قله ، loc] = findpeaks (c1 (:،: ، 1)) ؛
  • صبر کن
  • طرح (محل ، قله ، 'ro') ؛
  • ایستادن

با استفاده از حلقه for ، طول هر فلات را در نمودار improfile بیابید. حلقه for را برای همان قله هایی که در نمودار غیرفعال وجود دارد اجرا کنید. برای محاسبه طول هر فلات ، از تابع "پیدا" برای یافتن همه مکانهایی که به جای مقدار شدت "1" در آن 1 وجود دارد ، استفاده کنید. سپس ، طول آن آرایه را محاسبه کنید تا طول کل فلات را بدست آورید ، که باید برابر عرض یک مربع سفید در پیکسل باشد. ControlPlateauList = صفر (1 ، طول (loc))

برای i = 1: طول (loc)

اگر من == طول (loc)

فلات = find (c1 (loc (i): end،:، 1))؛

دیگری

فلات = پیدا کردن (c1 (loc (i): loc (i+1) -1 ،: ، 1)) ؛

پایان

ControlPlateauList (i) = طول (فلات) ؛

پایان

مرحله 5: مراحل 3 و 4 را برای تصویر آزمایش تکرار کنید

مراحل 3 و 4 را برای تصویر آزمایش تکرار کنید
مراحل 3 و 4 را برای تصویر آزمایش تکرار کنید

*توجه: هنگام کشیدن خط غیرفعال روی تصویر آزمایشی ، مطمئن شوید که آن را در مربع هایی که مطابق خطی است که روی تصویر کنترل کشیده اید بکشید.

مرحله 6: بزرگنمایی لنز را محاسبه کنید

بزرگنمایی لنز را محاسبه کنید
بزرگنمایی لنز را محاسبه کنید

اندازه گیری های بزرگنمایی شده با تقسیم میانگین طول فلات ، که در مرحله 5 محاسبه شد ، با میانگین طول فلات کنترل ، که در مرحله 4 محاسبه شد محاسبه می شود. این مقدار 1.0884 محاسبه می شود.

بزرگنمایی = میانگین (plateauList)/میانگین (ControlPlateauList) ؛

مرحله 7: پیدا کردن مربع R و نسخه کاربر از طریق درون یابی

پیدا کردن مربع R و نسخه کاربر از طریق درون یابی
پیدا کردن مربع R و نسخه کاربر از طریق درون یابی

با استفاده از کد:

  • md1 = fitlm (GivenPrescription ، MagArray) ؛
  • Rsquared = md1. Rsquared. Ordinary؛

ما می توانیم مقدار مربع R از نمودار GivenPresciption (مقادیر عدسی های ما) در مقابل MagArray (آرایه ای از نسبت های اندازه گیری بزرگنمایی که قبلاً محاسبه کرده ایم) را بیابیم. با داشتن مقدار مربع R به اندازه کافی بالا ، می توان استنباط کرد که همبستگی کافی برای توجیه استفاده از این روش وجود دارد. برای این مورد خاص ، مقدار مربع R 0.9912 بود که نشان دهنده همبستگی قوی است و بنابراین استفاده از این روش در تجزیه و تحلیل موجه است.

استفاده از تابع:

نسخه = interp1 (MagArray ، GivenPrescription ، بزرگنمایی ، "خطی") ؛

ما می توانیم مقدار تجویز مربوطه (در محور x) نسبت بزرگنمایی خود (مقدار در محور y) را در نظر بگیریم و نسخه مصرف کننده را پیدا کنیم.

درون یابی داده ها برای این روش مهم است زیرا به ما امکان می دهد بر اساس اطلاعاتی که داریم ، در مورد اطلاعاتی که نداریم فرض هایی انجام دهیم. در حالی که از نظر تکنیکی بهترین گزینه برای این فرض است ، ایجاد محدودیت برای کاهش تعداد خروجی ها همان تأثیر را دارد که به هر حال عینک های تجویزی در مقادیر یکنواخت افزایش می یابند. این در مراحل بعدی توضیح داده شده است.

مرحله 8: نمایش نسخه کاربر بر روی نمودار

نمایش نسخه کاربر روی نمودار
نمایش نسخه کاربر روی نمودار

با استفاده از کد زیر:

  • شکل؛
  • طرح (GivenPrescription ، MagArray ، '-g')
  • صبر کن
  • طرح (نسخه ، بزرگنمایی ، 'bp')
  • ایستادن
  • توری
  • افسانه ('Data'، 'Interpolated Points'، 'Location'، '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 دیوپتر شروع می شوند و در نسخه های آنها 0.25 افزایش می یابد ، بنابراین پس از محاسبه نسخه ، می خواهیم نسخه ای را که به بهترین نحو با نیازهای کاربر مطابقت دارد ، تعیین کنیم. پس از محاسبه نسخه ، آن را از طریق دستورات داده شده If برای بررسی ارزش آن و تعیین نسخه ای که لازم است ، اجرا می کنیم. هر چیزی کمتر یا مساوی 1.125 ، پس نسخه 1.0 است. هر چیزی کمتر از 1.375 و نسخه آن 1.25 است. هرچیزی که کمتر یا مساوی 1.625 باشد ، نسخه 1.5 است. هرچیزی که کمتر یا مساوی 1.845 باشد ، نسخه 1.75 است. و غیره

ما مقادیر را افزایش می دهیم زیرا در حال بررسی این هستیم که آیا مقادیر کمتر از است یا خیر. اگر مقادیر را کاهش دهیم ، اولین عبارت if اولین عبارت if را تمام وقت می خواند. اگر نسخه کوچکترین است ، ما می خواهیم آن را به عنوان کوچکترین تشخیص دهد ، بنابراین به همین دلیل است که کوچکترین ارزش همان چیزی است که ما با آن شروع کردیم. هر چیزی بالاتر از بالاترین مقدار به این معناست که نسخه با داده های ما در محدوده نیست ، بنابراین رشته "ناشناخته" را می خواند.

توصیه شده: