Мазмұны:

Көз алмасының рецепті: BME60B жобасы: 9 қадам
Көз алмасының рецепті: BME60B жобасы: 9 қадам

Бейне: Көз алмасының рецепті: BME60B жобасы: 9 қадам

Бейне: Көз алмасының рецепті: BME60B жобасы: 9 қадам
Бейне: КӨЗІЛДІРІКТІ ҰМЫТЫҢЫЗ!❌️ Пайдалы шырын.Сәбіздің пайдасы мен зияны.Морковный сок.Қазақша рецепт. 2024, Қараша
Anonim
Көз алмасының рецепті: BME60B жобасы
Көз алмасының рецепті: BME60B жобасы

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

Ұлғайтқыш - диоптерлердің рецепті бойынша жіктелген көзілдірікті оқуға арналған негізгі ерекшеліктердің бірі. Мичиган технологиялық университетінің мәліметі бойынша, диоптер - бұл линзаның фокус ұзындығы, әдетте мм -де, метр бірлігінде (Мичиган технологиялық университеті). Оқу көзілдірігінде дөңес линзалар болғандықтан, фокустық қашықтық оң болады, бұл диоптерлердің оң болуына әкеледі (HyperPhysics). Нысан арасындағы қашықтық нақты линзадан алыстаған сайын фокус ұзындығы артады және бұл диоптерлердің кері пропорционалды болуына байланысты төмендеуіне әкеледі. Сондықтан, қосымша диоптриясы бар оқу көзілдірігінің болуы линзаның көрінісін ұлғайтуға көмектеседі, осылайша диоптерлердің мәнін жоғарылату арқылы фокустық қашықтық аз болып көрінуі мүмкін.

Ұсынылған код рецепті белгісіз линзаның диоптриясын болжау үшін қолданылады. Рецептіні есептеу үшін екі кіріс қолданылады: линзаларды қолданбай басқарылатын фонның фотосуреті және сол фондағы, бірақ таңдаған объектив арқылы түсірілген басқа фотосурет. Бағдарлама осы екі фотосуреттің арасындағы бұрмалануды өлшейді. Сол жерден біз линзаның диоптриясын бағалай аламыз және пайдаланушы көруі үшін нәтиже шығара аламыз.

Бұл нұсқаулық үшін сізге қажет:

  • Ақ-қара түсті шахмат үлгісі 11x8,5 қағазға басылған
  • Фокусты жабу мүмкіндігі бар камера
  • Штатив немесе камераны бекіту үшін ұқсас нәрсе
  • Оқуға арналған көзілдіріктің әр түрлі рецептілері
  • MATLAB

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. Бұл сұр реңкті суретті жақсарту/өңдеу жылдамырақ екенін білдіреді, себебі оны бақылау үшін деректер аз. Суретті сұр реңкке түрлендіру үшін rgb2gray пайдаланыңыз. (Имротат функциясы біздің фотосуреттер көлденең келгендіктен қолданылды - бұл код жолы сіздің нұсқада қажет болуы мүмкін немесе қажет емес.)

  • %сұр реңкке айналады және айналады
  • 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 жәшікті қамтитын сызықты сызу үшін басыңыз және қара кеңістіктен қара бос орынға.', 'Растау үшін екі рет басыңыз.')));
  • сызық = имлайн;
  • позиция = күту (сызық);
  • соңғы нүктелер = 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));
  • күте тұр
  • сюжет (лок, шыңдар, 'ro');
  • тоқтата тұру

Форф циклінің көмегімен импрофильді графиктен әр үстірттің ұзындығын табыңыз. Болжамсыз диаграммадағы шыңдардың бірдей саны үшін for циклін іске қосыңыз. Әр үстірттің ұзындығын есептеу үшін «табу» функциясын қолданып, қарқындылықтың «0» орнына «1» болатын барлық орындарды табыңыз. Содан кейін, ақ квадраттың еніне пиксельмен тең болатын үстірттің жалпы ұзындығын алу үшін сол жиымның ұзындығын есептеңіз. ControlPlateauList = нөлдер (1, length (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, ұлғайту, 'сызықтық');

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

Бұл әдіс жұмыс істеуі үшін интерполяциялық деректер маңызды, өйткені ол бізде жоқ ақпарат туралы болжам жасауға мүмкіндік береді. Ең қолайлы сызық техникалық тұрғыдан бұл болжамға неғұрлым күшті үміткер болар еді, бірақ шығыс санын азайту үшін шекараны құру сол әсерді береді, себебі рецепт көзілдірігі біркелкі мәндерде болады. Бұл кейінгі қадамдарда түсіндіріледі.

8 -қадам: Пайдаланушының рецептісін графикте көрсету

Графикте пайдаланушының рецептісін көрсету
Графикте пайдаланушының рецептісін көрсету

Келесі кодты қолдану:

  • фигура;
  • сюжет (GivenPrescription, MagArray, '-g')
  • күте тұр
  • сюжет (рецепт, үлкейту, 'bp')
  • тоқтата тұру
  • тор
  • легенда ('Деректер', 'Интерполяцияланған нүктелер', 'Орналасу', 'NW')

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

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 құрайды. Және тағы басқа.

Бізде мәндер кіші екенін тексергеннен кейін жоғарылайды. Егер біз мәндерді төмендететін болсақ, онда бірінші if операторы әрқашан if операторын оқиды. Егер рецепт ең кішкентай болса, біз оны бірден ең кішкентайы деп танығанын қалаймыз, сондықтан біз ең кіші құндылықты біз бастадық. Ең жоғары мәннен жоғары нәрсе рецепт біздің деректермен сәйкес келмейтінін білдіреді, сондықтан ол «Белгісіз» жолын оқуға мүмкіндік береді.

Ұсынылған: