Съдържание:

Определяне на рецептата на вашата очна ябълка: Проект BME60B: 9 стъпки
Определяне на рецептата на вашата очна ябълка: Проект BME60B: 9 стъпки

Видео: Определяне на рецептата на вашата очна ябълка: Проект BME60B: 9 стъпки

Видео: Определяне на рецептата на вашата очна ябълка: Проект BME60B: 9 стъпки
Видео: SCP-261 Пан-мерное Торговый и эксперимент Войти 261 объявление Де + полный + 2024, Ноември
Anonim
Изчисляване на рецептата на вашата очна ябълка: проект BME60B
Изчисляване на рецептата на вашата очна ябълка: проект BME60B

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

Увеличаването е една от ключовите характеристики на очилата за четене, които се класифицират според предписанията им за диоптри. Според Мичиганския технологичен университет диоптърът е фокусното разстояние на обектива, обикновено измерено в мм, в единица метри (Мичигански технологичен университет). Тъй като очилата за четене имат изпъкнали лещи, фокусното разстояние би било положително, което би довело и до положителни диоптри (HyperPhysics). Фокусното разстояние се увеличава, тъй като разстоянието между обекта се отдалечава от действителната леща и това води до намаляване на диоптрите, тъй като те са обратно пропорционални. Следователно наличието на очила за четене с допълнителни диоптри би помогнало на обектива да приближи изгледа, така че да изглежда, че фокусното разстояние е по -малко чрез увеличаване на стойността на диоптрите.

Представеният код ще се използва за предсказване на диоптъра на леща с неизвестна рецепта. За изчисляване на рецептата се използват два входа: снимка на контролиран фон без използване на обективи и друга снимка на същия фон, но през обектива по избор. Програмата ще измери изкривяването между тези две снимки. Оттам нататък ще можем да оценим диоптъра на обектива и да дадем резултат, който потребителят да види.

За тази инструкция ще ви трябва:

  • Черно-бял шахматен модел, отпечатан върху лист хартия 11x8,5
  • Камера с възможност за заключване на фокуса
  • Статив или нещо подобно, за да обезопасите камерата
  • Различни предписания за очила за четене
  • MATLAB

Стъпка 1: Направете снимки

Направи снимки
Направи снимки
Направи снимки
Направи снимки
Направи снимки
Направи снимки

За да изчислите увеличението на обектива, трябва да можете да го сравните с действителния размер на обекта. За този проект ще сравняваме увеличено изображение с контролно изображение.

По този начин първата стъпка е да направите две снимки на едно и също изображение - първата само чрез камерата, а втората през обектива на очилата за четене, които искате да тествате.

Ще правите снимка на 8.5x11in черно -бяла шахматна дъска с 1in решетка. Настройте камерата на 11 инча от шахматната дъска. Преди да направите снимките, заключете фокуса върху шахматната дъска.

Направете снимка на шахматната дъска без очилата за четене. След това, без да премествате нищо, поставете очилата за четене пред камерата и направете втората снимка.

Уверете се, че позицията на вашия фотоапарат не се мести между снимките. Единственото нещо, което трябва да се промени между двете снимки, е наличието на обектива на очилата пред камерата.

Когато приключите със снимките, качете ги на компютъра си.

Стъпка 2: Заредете изображенията в MATLAB

Заредете изображенията в MATLAB
Заредете изображенията в MATLAB

Отворете нов скрипт.

Първо посочете директорията, където се съхраняват снимките. След това използвайте функцията dir, за да извлечете-j.webp

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

За нашия проект искахме да подканим потребителя на програмата за кои файлове искат да сравнят. Първият раздел изисква от потребителя да посочи контролното изображение, а вторият изисква от потребителя да посочи тестовото изображение.

  • %Попитайте потребителя кой файл е контролното изображение.
  • Control = input ('# на контролното изображение. / N');
  • ControlFile = [GetDir (Control).name]
  • %Попитайте потребителя кой файл е изображението, което иска да анализира.
  • ChooseFile = input ('\ n# на изображението, което искате да анализирате. / N');
  • PrescripFile = [GetDir (ChooseFile).name];

Стъпка 3: Анализ на изображението

Анализ на изображението
Анализ на изображението
Анализ на изображението
Анализ на изображението

Цветното изображение в MATLAB е с размер MxNx3, докато изображението в сиви тонове е MxN. Това означава, че е по -бързо да подобрите/редактирате изображение в сиви скали, защото има по -малко данни за проследяване. Използвайте rgb2gray, за да конвертирате изображението в сиво. (Функцията imrotate е използвана, защото нашите снимки са хоризонтални - този ред код може или не може да е необходим във вашата версия.)

  • %конвертиране в сива скала и завъртане
  • I = imread (ControlFile);
  • I = rgb2gray (I);
  • I = обездвижвам (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 кутии, от черно пространство до черно пространство.', 'Щракнете двукратно, за да потвърдите.'}));
  • линия = наклонена;
  • позиция = чакане (ред);
  • крайни точки = line.getPosition;

Извлечете координатите X и Y за крайните точки на начертаната линия.

  • X = крайни точки (:, 1)
  • Y = крайни точки (:, 2);

Използвайте импрофил, за да създадете графика въз основа на интензитетите, намерени по начертаната линия. Това трябва да прилича на квадратна вълна, варираща от 0 (черно) до 1 (бяло). Изчислете върховете и тяхното местоположение.

  • фигура (2)
  • подплот (1, 2, 1)
  • title ('Интензивност на изображението през импровизираната линия (контрол)')
  • improfile (I_binary, X, Y); включена мрежа;
  • [~, ~, c1, ~, ~] = импровизиран (I_binary, X, Y);
  • [пикове, loc] = findpeaks (c1 (:,:, 1));
  • дръж се
  • сюжет (loc, peaks, 'ro');
  • задържам

Намерете дължината на всяко плато на импровизираната графика, като използвате цикъл for. Изпълнете цикъла for за същото количество пикове, които има в импрофилната графика. За да изчислите дължината на всяко плато, използвайте функцията „find“, за да намерите всички места, където има „1“вместо „0“стойност на интензитета. След това изчислете дължината на този масив, за да получите общата дължина на платото, която трябва да е равна на ширината на бял квадрат в пиксели. ControlPlateauList = нули (1, дължина (loc));

за i = 1: дължина (loc)

ако i == дължина (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 (Дадена рецепта, MagArray);
  • Rsquared = md1. Rsquared. Ordinary;

Можем да намерим R-квадратна стойност на графиката DatePresciption (нашите лещи дават стойности) срещу MagArray (масив от съотношенията на измерване на увеличение, които сме изчислили по-рано). Като има достатъчно висока R-квадратна стойност, може да се заключи, че има достатъчно силна корелация, която да оправдае използването на този метод. За този конкретен случай стойността на R-квадрат е 0,9912, което предполага силна корелация и следователно е оправдано при използването на този метод в анализа.

Използване на функцията:

Предписание = interp1 (MagArray, GivenPrescription, увеличение, 'линейно');

Можем да интерполираме съответната стойност на предписанието (по оста x) на нашето съотношение на увеличение (стойност по оста y) и да намерим какво е предписанието на потребителя.

Интерполирането на данни е важно, за да работи този метод, тъй като ни позволява да правим предположения за информация, която нямаме, въз основа на информацията, с която разполагаме. Докато най -подходящата линия би била технически по -силен кандидат за това предположение, създаването на граници за намаляване на броя на изходите служи на същия ефект, тъй като диоптричните стъкла все пак идват в нарастващи еднакви стойности. Това се обяснява в следващите стъпки.

Стъпка 8: Показване на предписанието на потребителя на графика

Показване на предписанието на потребителя на графика
Показване на предписанието на потребителя на графика

Използвайки следния код:

  • фигура;
  • сюжет (ДаденоПрепис, MagArray, '-g')
  • дръж се
  • сюжет (Предписание, увеличение, 'bp')
  • задържам
  • решетка
  • легенда („Данни“, „Интерполирани точки“, „Местоположение“, „СЗ“)

Можем да начертаем графика, която показва съотношенията на увеличение спрямо дадената рецепта със зелена линия и намерените данни от нашето изчислено увеличение спрямо нашето интерполирано предписание със синя звезда. След това легендата маркира заглавието, оста x и y и поставя легендата в горния ляв ъгъл.

Стъпка 9: Стеснете рецептата си

Ограничете рецептата си
Ограничете рецептата си

Следният код се използва за закръгляване на рецептата:

  • ако предписание <= 1.125

    CalculatedPrescription = '1.0';

  • иначе рецепта <= 1.375

    CalculatedPrescription = '1.25';

  • иначе рецепта <= 1.625

    CalculatedPrescription = '1.5';

  • иначе рецепта <= 1.875

    CalculatedPrescription = '1.75';

  • иначе рецепта <= 2.25

    CalculatedPrescription = '2.0';

  • иначе рецепта <= 2.625

    CalculatedPrescription = '2.5';

  • иначе рецепта <= 3

    CalculatedPrescription = '2.75';

  • иначе рецепта <= 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 през цялото време. Ако рецептата е най -малката, искаме тя веднага да я разпознае като най -малката, затова и най -малката стойност е това, с което започнахме. Всичко, което е по -високо от най -високата стойност, означава, че рецептата не е в обхвата с нашите данни, така че ще даде четене на низ „Неизвестно“.

Препоръчано: