Съдържание:
- Стъпка 1: Направете снимки
- Стъпка 2: Заредете изображенията в MATLAB
- Стъпка 3: Анализ на изображението
- Стъпка 4: Изчислете ширината на белите квадратчета на шахматната дъска
- Стъпка 5: Повторете стъпки 3 и 4 за тестовото изображение
- Стъпка 6: Изчислете увеличението на обектива
- Стъпка 7: Намиране на R-квадрат и предписание на потребителя чрез интерполация
- Стъпка 8: Показване на предписанието на потребителя на графика
- Стъпка 9: Стеснете рецептата си
Видео: Определяне на рецептата на вашата очна ябълка: Проект BME60B: 9 стъпки
2024 Автор: John Day | [email protected]. Последно модифициран: 2024-01-30 07:50
От: Хана Силос, Санг Хи Ким, Томас Васкес, Патрик Вист
Увеличаването е една от ключовите характеристики на очилата за четене, които се класифицират според предписанията им за диоптри. Според Мичиганския технологичен университет диоптърът е фокусното разстояние на обектива, обикновено измерено в мм, в единица метри (Мичигански технологичен университет). Тъй като очилата за четене имат изпъкнали лещи, фокусното разстояние би било положително, което би довело и до положителни диоптри (HyperPhysics). Фокусното разстояние се увеличава, тъй като разстоянието между обекта се отдалечава от действителната леща и това води до намаляване на диоптрите, тъй като те са обратно пропорционални. Следователно наличието на очила за четене с допълнителни диоптри би помогнало на обектива да приближи изгледа, така че да изглежда, че фокусното разстояние е по -малко чрез увеличаване на стойността на диоптрите.
Представеният код ще се използва за предсказване на диоптъра на леща с неизвестна рецепта. За изчисляване на рецептата се използват два входа: снимка на контролиран фон без използване на обективи и друга снимка на същия фон, но през обектива по избор. Програмата ще измери изкривяването между тези две снимки. Оттам нататък ще можем да оценим диоптъра на обектива и да дадем резултат, който потребителят да види.
За тази инструкция ще ви трябва:
- Черно-бял шахматен модел, отпечатан върху лист хартия 11x8,5
- Камера с възможност за заключване на фокуса
- Статив или нещо подобно, за да обезопасите камерата
- Различни предписания за очила за четене
- MATLAB
Стъпка 1: Направете снимки
За да изчислите увеличението на обектива, трябва да можете да го сравните с действителния размер на обекта. За този проект ще сравняваме увеличено изображение с контролно изображение.
По този начин първата стъпка е да направите две снимки на едно и също изображение - първата само чрез камерата, а втората през обектива на очилата за четене, които искате да тествате.
Ще правите снимка на 8.5x11in черно -бяла шахматна дъска с 1in решетка. Настройте камерата на 11 инча от шахматната дъска. Преди да направите снимките, заключете фокуса върху шахматната дъска.
Направете снимка на шахматната дъска без очилата за четене. След това, без да премествате нищо, поставете очилата за четене пред камерата и направете втората снимка.
Уверете се, че позицията на вашия фотоапарат не се мести между снимките. Единственото нещо, което трябва да се промени между двете снимки, е наличието на обектива на очилата пред камерата.
Когато приключите със снимките, качете ги на компютъра си.
Стъпка 2: Заредете изображенията в 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 за тестовото изображение
*Забележка: когато рисувате импровизираната линия върху тестовото изображение, не забравяйте да я нарисувате по квадратите, които съответстват на линията, която сте нарисували върху контролното изображение.
Стъпка 6: Изчислете увеличението на обектива
Увеличените измервания се изчисляват чрез разделяне на средната стойност на дължината на платото, която беше изчислена в стъпка 5, със средната стойност на дължината на контролното плато, която беше изчислена в стъпка 4. Това се изчислява на 1,0884.
увеличение = средна стойност (plateauList)/средна стойност (ControlPlateauList);
Стъпка 7: Намиране на 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 през цялото време. Ако рецептата е най -малката, искаме тя веднага да я разпознае като най -малката, затова и най -малката стойност е това, с което започнахме. Всичко, което е по -високо от най -високата стойност, означава, че рецептата не е в обхвата с нашите данни, така че ще даде четене на низ „Неизвестно“.
Препоръчано:
Електронна магия 8 топка и очна ябълка: 11 стъпки (със снимки)
Electronic Magic 8 Ball и Eyeball: Исках да създам дигитална версия на Magic 8 Ball … Тялото на това е 3D отпечатано и дисплеят е променен от полиедър в синьо багрило на малък OLED, контролиран от случайно число генератор, програмиран в Arduino NANO. След това
Измерването на сърдечната честота е на върха на пръста ви: Фотоплетизмографски подход за определяне на сърдечната честота: 7 стъпки
Измерването на сърдечната честота е на върха на пръста ви: Фотоплетизмографски подход за определяне на сърдечната честота: Фотоплетизмографът (PPG) е проста и евтина оптична техника, която често се използва за откриване на промени в обема на кръвта в микроваскуларно легло от тъкан. Използва се предимно неинвазивно за извършване на измервания на повърхността на кожата, обикновено
Определяне на разстояние с Raspberry Pi и HC-SR04: 3 стъпки
Отчитане на разстояние с Raspberry Pi и HC-SR04: Ултразвуковият сензор за разстояние HC-SR04 използва безконтактен ултразвуков сонар за измерване на разстоянието до обект. Състои се от два предавателя, приемник и управляваща верига. Предавателите излъчват високочестотен ултразвуков звук, който отскача
Определяне на налягането и надморската височина с помощта на GY-68 BMP180 и Arduino: 6 стъпки
Определяне на налягането и надморската височина с помощта на GY-68 BMP180 и Arduino: Общ преглед В много проекти, като например летящи роботи, метеорологични станции, подобряване на маршрутизацията, спорт и т.н., измерването на налягане и височина е много важно. В този урок ще научите как да използвате сензора BMP180, който е един от най
Модернизация на LED крушка за подстригване на очна ябълка Halo 998: 8 стъпки
Модернизация на LED крушка за подстригване на очна ябълка Halo 998: Тази инструкция описва как да модифицирате частите на очната ябълка на Halo 998, за да приемете затъмняващата крушка LumiSelect PAR/R16 от earthled.com. парче, но с малко ef