Мазмуну:

Көз алмаңыздын рецепти: BME60B долбоору: 9 кадам
Көз алмаңыздын рецепти: BME60B долбоору: 9 кадам

Video: Көз алмаңыздын рецепти: BME60B долбоору: 9 кадам

Video: Көз алмаңыздын рецепти: BME60B долбоору: 9 кадам
Video: Еске алу күні кәмпит алмасы 3 түсті: бір ыдыс 2024, Июль
Anonim
Көз алмаңыздын рецепти: BME60B долбоору
Көз алмаңыздын рецепти: BME60B долбоору

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

Чоңойтуу - диоптерлердин рецепти боюнча классификацияланган көз айнектерди окуудагы негизги өзгөчөлүктөрдүн бири. Мичиган Технологиялык Университетинин маалыматы боюнча, диоптер - линзанын фокус узундугу, адатта мм менен өлчөнөт, метр бирдигинде (Мичиган Технологиялык Университети). Окуучу көз айнектердин дөңсөө линзалары бар болгондуктан, фокустук аралыгы позитивдүү болуп, диоптриянын да оң болушуна себеп болот (HyperPhysics). Объекттин ортосундагы аралык чыныгы линзадан алыстаган сайын фокустук аралыгы жогорулайт жана бул диоптерлердин тескери пропорционалдуу болушунан улам азайышына алып келет. Ошондуктан, кошумча диоптриясы бар окуучу айнектердин болушу диоптерлердин баалуулугун жогорулатуу менен фокустун узундугу аз болуп көрүнүшү үчүн линзанын көрүнүшүн чоңойтууга жардам берет.

Белгиленген коду белгисиз рецепт менен линзанын диоптриясын болжолдоо үчүн колдонулат. Рецептти эсептөө үчүн эки киргизүү колдонулат: эч кандай линзаларды колдонбостон башкарылуучу фондун сүрөтү жана ошол эле фондо, бирок тандалган линзадан башка сүрөт. Программа бул эки сүрөттүн ортосундагы бурмалоону өлчөйт. Ал жерден биз линзанын диоптерин баалап, колдонуучу көрүшү үчүн жыйынтык чыгарабыз.

Бул көрсөтмө үчүн сизге керек болот:

  • Ак-кара түстөгү шахмат үлгүсү 11x8.5 өлчөмүндөгү кагазга басылган
  • Фокусун кулпулоо мүмкүнчүлүгү бар камера
  • Штатив же камераны коргоого окшош нерсе
  • Окуунун көз айнектеринин ар кандай рецепттери
  • MATLAB

1 -кадам: Сүрөткө тартуу

Сүрөткө тартуу
Сүрөткө тартуу
Сүрөткө тартуу
Сүрөткө тартуу
Сүрөткө тартуу
Сүрөткө тартуу

Линзанын чоңойтуусун эсептөө үчүн аны объекттин чыныгы өлчөмү менен салыштыра билүү керек. Бул долбоор үчүн биз чоңойтулган сүрөттү башкаруу сүрөтүнө салыштырып көрөбүз.

Ошентип, биринчи кадам - бир эле сүрөттүн эки сүрөтүн тартуу - биринчиси жөн эле камера аркылуу, экинчиси окуй турган көз айнектин линзасы аркылуу.

Сиз 8 дюймдук 8,5x11in ак жана кара шахматтын сүрөтүн тартып жатасыз. Камераңызды шахмат тактасынан 11ин алысыраак орнотуңуз. Сүрөткө түшөрдөн мурун фокусту шахмат тактасына кулпулаңыз.

Окуу көз айнеги жок шахмат тактасын сүрөткө тартып алыңыз. Андан кийин эч нерсени жылдырбастан, окуучу көз айнекти камеранын алдына коюп, экинчи сүрөткө түшүңүз.

Камераңыздын абалы кадрлардын ортосунда жылбай турганын текшериңиз. Эки сүрөттүн ортосунда өзгөрүшү керек болгон нерсе - камеранын алдында көз айнектин линзасынын болушу.

Сүрөттөр бүткөндөн кийин, аларды компьютериңизге жүктөңүз.

2 -кадам: Сүрөттөрдү MATLABга жүктөңүз

Сүрөттөрдү MATLABга жүктөңүз
Сүрөттөрдү MATLABга жүктөңүз

Жаңы скрипт ачыңыз.

Биринчиден, сүрөттөр сакталган каталогду көрсөтүңүз. Андан кийин-j.webp

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

Биздин долбоор үчүн биз файлды салыштыргысы келген программанын колдонуучусуна түрткү бергибиз келди. Биринчи бөлүм колдонуучудан башкаруу сүрөтүн көрсөтүүнү суранат, ал эми экинчиси колдонуучудан сыноо сүрөтүн көрсөтүүнү суранат.

  • %Колдонуучудан кайсы файл көзөмөлдөө сүрөтү экенин сураңыз.
  • Control = input ('# of control image. / N');
  • ControlFile = [GetDir (Control).name]
  • %Колдонуучудан кайсы файл анализ кылгысы келгенин сураңыз.
  • SelectFile = input ('\ n# талдоо керек болгон сүрөттүн. / N');
  • PrescripFile = [GetDir (SelectFile). Аты];

3 -кадам: Image анализи

Image Analysis
Image Analysis
Image Analysis
Image Analysis

MATLABтагы түстүү сүрөт MxNx3 өлчөмүндө, ал эми боз түстөгү сүрөт MxN. Бул боз түстөгү сүрөттү жакшыртуу/түзөтүү ылдамыраак дегенди билдирет, анткени аны көзөмөлдөө үчүн азыраак маалымат бар. (Imrotate функциясы биздин сүрөттөр горизонталдуу келгендиктен колдонулган - бул коддун сабы сиздин версияңызда керек же мүмкүн эмес.)

  • %боз масштабга айландырылат жана айланат
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = imrotate (I, 90);

Андан кийин, сүрөттү көрсөтүү. Subplot функциясы тесттик сүрөт кийинки баскычтарда көзөмөлдүн жанында боло алгыдай колдонулат.

  • %дисплей
  • сүрөт (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)
  • аталышы ('Импрофилдик линиядагы сүрөттүн интенсивдүүлүгү (Control)')
  • ыңгайсыз (I_binary, X, Y); сетка;
  • [~, ~, c1, ~, ~] = өркүндөтүү (I_binary, X, Y);
  • [Peaks, loc] = findpeaks (c1 (:,,: 1));
  • токто
  • сюжет (лок, чокулар, 'ро');
  • кармоо

For циклинин жардамы менен ар бир платонун узундугун графиктен табыңыз. Туура эмес графикте болгон чокулар үчүн for циклин иштетүү. Ар бир платонун узундугун эсептөө үчүн, "табуу" функциясын колдонуп, "0" интенсивдүүлүк маанисинин ордуна "1" болгон бардык жерлерди табыңыз. Андан кийин, платонун жалпы узундугун алуу үчүн ал массивдин узундугун эсептеңиз, ал ак квадраттын туурасына пиксель менен барабар болушу керек. ControlPlateauList = nolos (1, length (loc));

i = 1 үчүн: узундук (loc)

эгер мен == узундугу (лок)

плато = табуу (c1 (loc (i): аягы,:, 1));

башка

плато = табуу (c1 (loc (i): loc (i+1) -1,:, 1)));

аяктоо

ControlPlateauList (i) = узундук (плато);

аяктоо

5 -кадам: Test Image үчүн 3 жана 4 -кадамдарды кайталаъыз

Test Image үчүн 3 жана 4 -кадамдарды кайталаъыз
Test Image үчүн 3 жана 4 -кадамдарды кайталаъыз

*Эскертүү: текшерилүүчү сүрөттө импрофилдүү сызыкты чийип жатканда, аны контролдук сүрөткө тарткан сызыкка туура келген квадраттардын үстүнөн чийүүнү унутпаңыз.

6 -кадам: Линзанын чоңойтуусун эсептөө

Линзанын чоңойтуусун эсептөө
Линзанын чоңойтуусун эсептөө

Чоңойтулган өлчөөлөр 5 -кадамда эсептелген платонун узундугунун орточо бөлүгүнө, 4 -кадамда эсептелген башкаруу платосунун узундугуна бөлүнүү жолу менен эсептелет. Бул 1.0884 деп эсептелет.

чоңойтуу = орточо (plateauList)/орточо (ControlPlateauList);

7-кадам: R-квадратын жана Интерполяция аркылуу колдонуучунун рецептин табуу

Интерполяция аркылуу R-квадратын жана колдонуучунун рецептин табуу
Интерполяция аркылуу R-квадратын жана колдонуучунун рецептин табуу

Кодду колдонуу:

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

Биз GivenPresciption графигинин R-квадраттык маанисин таба алабыз (биздин линзалар берилген баалуулуктар) vs. R-квадраттык мааниге ээ болуу менен, бул методдун колдонулушун негиздөө үчүн жетишерлик күчтүү корреляция бар деп божомолдоого болот. Бул конкреттүү учурда, R-квадраттык мааниси 0,9912 болгон, бул күчтүү корреляцияны билдирет жана анализде бул ыкманы колдонуу менен негизделген.

Функцияны колдонуу:

Prescription = interp1 (MagArray, GivenPrescription, чоңойтуу, 'сызыктуу');

Биз чоңойтуучу катышыбыздын (х огунда) тиешелүү рецепт маанисин (y огунда мааниси) интерполяциялай алабыз жана колдонуучунун рецепти эмне экенин таба алабыз.

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

8 -кадам: Колдонуучунун рецептин графикте көрсөтүү

Колдонуучунун рецептин графикте көрсөтүү
Колдонуучунун рецептин графикте көрсөтүү

Төмөнкү кодду колдонуу:

  • фигура;
  • сюжет (GivenPrescription, MagArray, '-g')
  • токто
  • сюжет (рецепт, чоңойтуу, 'bp')
  • кармоо
  • торчо
  • легенда ("Маалыматтар", "Интерполяцияланган пункттар", "Жайгашкан жер", "Түндүк -Батыш")

Биз Жашыл сызык менен Берилген Рецептке каршы Чоңойтуунун коэффициентин көрсөтүүчү графикти жана көк жылдыз менен интерполяцияланган рецептибизге каршы эсептелген чоңойтуунун табылган маалыматтарын түзө алабыз. Андан кийин легенда аталышты, х огун жана у огун белгилейт жана легенданы жогорку сол бурчка жайгаштырат.

9 -кадам: Рецептти тарыт

Рецептти тарыт
Рецептти тарыт

Төмөнкү код рецепт үчүн тегеректөө үчүн колдонулат:

  • Эгерде рецепт <= 1.125

    CalculatedPrescription = '1.0';

  • elseif Prescription <= 1.375

    CalculatedPrescription = '1.25';

  • elseif Prescription <= 1.625

    CalculatedPrescription = '1.5';

  • elseif Prescription <= 1.875

    CalculatedPrescription = '1.75';

  • elseif рецепт <= 2.25

    CalculatedPrescription = '2.0';

  • elseif Prescription <= 2.625

    CalculatedPrescription = '2.5';

  • elseif Prescription <= 3

    CalculatedPrescription = '2.75';

  • elseif Prescription <= 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. Жана башка.

Бизде баалуулуктар жогорулап жатат, анткени биз баалуулуктар азыраак экендигин текшерип жатабыз. Эгерде биз маанилер азайып бараткан болсок, анда биринчи if оператору биринчи if операторун дайыма окуйт. Эгерде рецепт эң кичине болсо, биз аны дароо эң кичинеси катары таануусун каалайбыз, андыктан эң кичине баалуулук биз баштаган. Эң жогорку баадан жогору нерсе рецепт биздин маалыматтарга дал келбейт дегенди билдирет, андыктан ал "Белгисиз" сап окуусун берет.

Сунушталууда: