Агуулгын хүснэгт:

Нүдний алимны жор: BME60B төсөл: 9 алхам
Нүдний алимны жор: BME60B төсөл: 9 алхам

Видео: Нүдний алимны жор: BME60B төсөл: 9 алхам

Видео: Нүдний алимны жор: BME60B төсөл: 9 алхам
Видео: хэрхэн 1000 төгрөгийг 10000 болгох вэ 2024, Арваннэгдүгээр
Anonim
Нүдний алимны жор: BME60B төсөл
Нүдний алимны жор: BME60B төсөл

Оруулсан: Ханна Силос, Санг Хи Ким, Томас Васкес, Патрик Висте

Томруулах нь диоптерийн жороор ангилдаг нүдний шилийг унших гол шинж чанаруудын нэг юм. Мичиганы Технологийн Их Сургуулийн мэдээлснээр диоптер бол линзний фокусын урт бөгөөд ихэвчлэн мм -ээр хэмжигддэг (Мичиганы Технологийн Их Сургууль). Унших шил нь гүдгэр линзтэй байдаг тул фокусын урт нь эерэг байх тул диоптерууд эерэг байх болно (HyperPhysics). Обьект хоорондын зай бодит линзээс холдох тусам фокусын урт нэмэгддэг бөгөөд энэ нь диоптерууд урвуу пропорциональ байдаг тул буурахад хүргэдэг. Нэмэлт диоптер бүхий нүдний шилтэй байх нь линзийг илүү нарийвчлалтай харагдуулахад тусална.

Үзүүлсэн кодыг үл мэдэгдэх жороор авсан линзний диоптерийг урьдчилан таамаглахад ашиглах болно. Жорыг тооцоолохдоо хоёр оролтыг ашигладаг: ямар ч линз ашиглаагүй хяналттай арын гэрэл зураг, мөн ижил дэвсгэртэй боловч сонгосон линзээр авсан өөр гэрэл зураг. Хөтөлбөр нь эдгээр хоёр зургийн хоорондох гажуудлыг хэмжих болно. Тэндээс бид линзний диоптерийг тооцоолж, хэрэглэгчдэд үзүүлэх үр дүнг гаргах боломжтой болно.

Энэхүү зааварчилгааны хувьд танд дараахь зүйлс хэрэгтэй болно.

  • 11х8.5 хэмжээтэй цаасан дээр хэвлэсэн хар цагаан өнгийн алагны загвар
  • Фокусаа түгжих чадвартай камер
  • Tripod, эсвэл камерыг хамгаалахтай төстэй зүйл
  • Унших шилний янз бүрийн жор
  • МАТЛАБ

Алхам 1: Зураг авах

Зураг авах
Зураг авах
Зураг авах
Зураг авах
Зураг авах
Зураг авах

Линзний томруулалтыг тооцоолохын тулд та үүнийг объектын бодит хэмжээтэй харьцуулж үзэх хэрэгтэй. Энэ төслийн хувьд бид томруулсан зургийг хяналтын дүрстэй харьцуулах болно.

Тиймээс эхний алхам бол нэг зургийн хоёр зургийг авах явдал юм: эхнийх нь зөвхөн камераар, хоёр дахь нь туршихыг хүсч буй унших шилний линзээр дамжих явдал юм.

Та 1 инчийн тор бүхий 8.5x11in хэмжээтэй хар цагаан өнгийн даамны зургийг авах болно. Шатны самбараас хол зайд камераа 11 инч байрлуулна уу. Зураг авахаасаа өмнө анхаарлын төвд байгаа бөмбөгийг түгжээрэй.

Унших нүдний шилгүй алаг самбарын зургийг аваарай. Дараа нь юу ч хөдөлгөхгүйгээр унших нүдний шилийг камерын өмнө тавиад хоёр дахь зургийг аваарай.

Таны камерын байрлал буудлагын хооронд шилжихгүй байгаа эсэхийг шалгаарай. Хоёр зургийн хооронд өөрчлөх ёстой цорын ганц зүйл бол камерын урд нүдний шил байдаг.

Та зургуудаа хийж дуусмагц компьютер дээрээ байршуулаарай.

Алхам 2: Зургийг MATLAB руу ачаална уу

Зургийг MATLAB руу ачаална уу
Зургийг MATLAB руу ачаална уу

Шинэ скрипт нээнэ үү.

Нэгдүгээрт, зураг хадгалагдаж буй лавлахыг зааж өгнө үү. Дараа нь-j.webp

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

Манай төслийн хувьд бид файлыг харьцуулахыг хүсч буй програмын хэрэглэгчийг санал болгохыг хүссэн. Эхний хэсэг нь хэрэглэгчээс хяналтын дүрсийг зааж өгөхийг хүсдэг бол хоёр дахь хэсэг нь хэрэглэгчээс туршилтын дүрсийг зааж өгөхийг хүсдэг.

  • %Хяналтын дүрс ямар файл болохыг хэрэглэгчээс асуугаарай.
  • Control = input ('хяналтын зургийн#. / N');
  • ControlFile = [GetDir (Control).name]
  • %Хэрэглэгчээс ямар файлыг шинжлэхийг хүсч буйгаа асуугаарай.
  • SelectFile = оролт ('\ n# дүн шинжилгээ хийхийг хүсч буй зураг. / N');
  • PrescripFile = [GetDir (SelectFile). Нэр];

Алхам 3: Зургийн шинжилгээ

Зургийн шинжилгээ
Зургийн шинжилгээ
Зургийн шинжилгээ
Зургийн шинжилгээ

MATLAB -ийн өнгөт дүрс нь MxNx3 хэмжээтэй бол саарал өнгийн дүрс нь MxN байна. Энэ нь саарал өнгийн зургийг сайжруулах, засварлахад илүү хурдан байдаг гэсэн үг бөгөөд үүнийг хянах өгөгдөл багатай байдаг. (Имротат функцийг бидний зургууд хэвтээ байдлаар байрлуулсан тул ашигласан болно. Энэ кодын мөр нь таны хувилбарт шаардлагагүй байж магадгүй юм.)

  • %нь саарал өнгөтэй болж хувирна
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = имротат (I, 90);

Дараа нь зургийг харуулна. Дэд талбарын функцийг ашигладаг бөгөөд ингэснээр туршилтын дүрс нь дараагийн алхамуудад хяналтын хажууд байх боломжтой болно.

  • %дэлгэц
  • зураг (1);
  • дэд хэсэг (1, 2, 1)
  • imshow (I);
  • гарчиг (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 хайрцгийг хамарсан шугам зурахын тулд товшоод чирнэ үү.', 'Батлахын тулд хоёр дарна уу.')));
  • мөр = imline;
  • байрлал = хүлээх (шугам);
  • төгсгөлийн цэгүүд = line.getPosition;

Зурсан шугамын төгсгөлийн цэгүүдийн хувьд X ба Y координатуудыг гаргаж ав.

  • X = төгсгөлийн цэгүүд (:, 1)
  • Y = төгсгөлийн цэгүүд (:, 2);

Зурсан шугамын дагуух эрч хүчийг үндэслэн график гаргахын тулд improfile ашиглана уу. Энэ нь 0 (хар) -аас 1 (цагаан) хүртэлх дөрвөлжин долгионтой төстэй байх ёстой. Оргилууд болон тэдгээрийн байршлыг тооцоол.

  • зураг (2)
  • дэд хэсэг (1, 2, 1)
  • гарчиг ('Дүрслэх чадваргүй шугам дээрх зургийн эрч хүч (Хяналт)')
  • дүрсгүй (I_binary, X, Y); сүлжээ асаах;
  • [~, ~, c1, ~, ~] = сайжруулаагүй (I_binary, X, Y);
  • [Peaks, loc] = findpeaks (c1 (:,,: 1));
  • түр хүлээгээрэй
  • талбай (лок, оргилууд, 'ro');
  • түр зогсоо

For давталт ашиглан тэгш бус график дээрх өндөрлөг бүрийн уртыг ол. For давталтыг тохиромжгүй графикт байгаа ижил тооны оргилуудад ажиллуулна уу. Өндөрлөг бүрийн уртыг тооцоолохын тулд "хайх" функцийг ашиглан "0" эрчмийн утгын оронд "1" байгаа бүх байршлыг олох боломжтой. Дараа нь уг массивын уртыг тооцоолж, цагаан талбайн өргөнийг пикселээр тэнцүү байх тэгш өнцөгтийн нийт уртыг авна. ControlPlateauList = тэг (1, урт (loc));

i = 1 хувьд: урт (loc)

хэрэв би == урт (loc)

өндөрлөг = олох (c1 (loc (i): төгсгөл,:, 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;

Бид GivenPresciption графикийн R-квадрат утгыг олж болно (бидний линз өгсөн утга) ба MagArray (бидний өмнө тооцоолсон томруулалтын хэмжилтийн харьцааны массив). R квадратын хангалттай өндөр утгатай болсноор энэ аргыг ашиглах үндэслэлтэй хангалттай хүчтэй хамаарал байгаа гэж дүгнэж болно. Энэ тохиолдолд R-квадрат утга нь 0.9912 байсан бөгөөд энэ нь хүчтэй хамаарлыг харуулж байгаа тул шинжилгээнд энэ аргыг ашиглах үндэслэлтэй юм.

Функцийг ашиглан:

Prescription = interp1 (MagArray, GivenPrescription, томруулах, 'шугаман');

Бид томруулалтын харьцаа (y тэнхлэг дээрх утга) -ийн харгалзах жорыг (x тэнхлэг дээр) интерполяц хийж, хэрэглэгчийн бичсэн жорыг олж мэдэх боломжтой.

Мэдээллийг интерполяци хийх нь чухал бөгөөд энэ нь бидэнд байгаа мэдээлэлд үндэслэн бидэнд байхгүй мэдээллийн талаар таамаглал гаргах боломжийг олгодог. Хамгийн сайн тохирох шугам нь техникийн хувьд энэ таамаглалд илүү хүчтэй нэр дэвшигч байх боловч гаралтын тоог багасгахын тулд хил хязгаарыг бий болгох нь жороор олгодог шил нь ямар ч байсан өсөн нэмэгдэж буй жигд утгатай байхтай ижил нөлөө үзүүлдэг. Үүнийг дараагийн алхамуудад тайлбарласан болно.

Алхам 8: Хэрэглэгчийн жорыг график дээр харуулах

Хэрэглэгчийн жорыг график дээр харуулж байна
Хэрэглэгчийн жорыг график дээр харуулж байна

Дараах кодыг ашиглан:

  • дүрс;
  • талбай (GivenPrescription, MagArray, '-g')
  • түр хүлээгээрэй
  • талбай (Жор, томруулах, 'bp')
  • түр зогсоо
  • сүлжээ
  • домог ('Өгөгдөл', 'Интерполяцлагдсан оноо', 'Байршил', 'NW')

Бид томруулалтын харьцаа ба өгсөн жорыг ногоон шугамаар харуулсан графикийг зурж, цэнхэр одтой интерполяцийн жортой харьцуулахад тооцоолсон томруулалтынхаа өгөгдлийг олж болно. Дараа нь домог нь гарчиг, x тэнхлэг, y тэнхлэгийг тэмдэглээд зүүн дээд буланд домог байрлуулна.

Алхам 9: Эмийн жороо нарийсгах

Жороо нарийсгах
Жороо нарийсгах

Жорыг бөөрөнхийлөхөд дараах кодыг ашиглана.

  • хэрэв хөөн хэлэлцэх хугацаа <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Хөөн хэлэлцэх хугацаа <= 1.375

    Тооцоолсон жор = '1.25';

  • elseif Хөөн хэлэлцэх хугацаа <= 1.625

    Тооцоолсон жор = '1.5';

  • elseif Хөөн хэлэлцэх хугацаа <= 1.875

    Тооцоолсон жор = '1.75';

  • elseif Хөөн хэлэлцэх хугацаа <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Хөөн хэлэлцэх хугацаа <= 2.625

    Тооцоолсон жор = '2.5';

  • elseif Хөөн хэлэлцэх хугацаа <= 3

    Тооцоолсон жор = '2.75';

  • elseif Хөөн хэлэлцэх хугацаа <= 3.375

    Тооцоолсон жор = '3.25';

  • өөр

    CalculatedPrescription = 'үл мэдэгдэх';

  • Төгсгөл

Интерполяци хийх замаар олж авсан жор нь жинхэнэ жорыг тусгаагүй болно, учир нь хүний буруутай үйлдлээс болж зургийг шинжлэх явцад бага зэргийн өөрчлөлт гарч байх болно. Тиймээс бодит жорыг ангилахын тулд бидэнд энэ алхам хэрэгтэй болно.

Өгөгдсөн жор нь ихэвчлэн 1.0 диоптероос эхэлж, жороор нь.25 -аар нэмэгддэг тул жорыг тооцоолсны дараа хэрэглэгчид хэрэгтэй байгаа зүйлд хамгийн сайн нийцсэн жорыг тодорхойлохыг хүсч байна. Эмийн жорыг тооцоолсны дараа бид үүнийг өгсөн If хэллэгээр дамжуулж, түүний үнэ цэнийг шалгаж, ямар жор шаардлагатай болохыг тодорхойлох болно. 1.125 -аас бага эсвэл тэнцүү зүйл байвал жор нь 1.0 болно. 1.375 -аас бага эсвэл үүнтэй тэнцүү зүйл бол жор нь 1.25 байна. 1.625 -аас бага эсвэл тэнцүү зүйл бол жор нь 1.5 байна. 1.845 -аас бага буюу үүнтэй тэнцүү зүйл бол жор нь 1.75 юм. Гэх мэт.

-Аас бага байгаа эсэхийг шалгаснаас хойш бидэнд үнэ цэнэ нэмэгдэж байна. Хэрэв бид утгууд буурч байвал эхний if илэрхийлэл нь эхний if -ийг үргэлж унших болно. Хэрэв жор нь хамгийн жижиг хэмжээтэй бол бид үүнийг хамгийн жижиг нь гэж хүлээн зөвшөөрөхийг хүсч байна, тиймээс хамгийн бага үнэ цэнэ нь бидний эхлүүлсэн зүйл юм. Хамгийн өндөр утгаас өндөр байгаа нь жор нь бидний өгөгдөлд багтахгүй гэсэн үг бөгөөд энэ нь "Үл мэдэгдэх" мөрийг унших болно.

Зөвлөмж болгож буй: