Оглавление:

Рецепт вашего глазного яблока: проект BME60B: 9 шагов
Рецепт вашего глазного яблока: проект BME60B: 9 шагов

Видео: Рецепт вашего глазного яблока: проект BME60B: 9 шагов

Видео: Рецепт вашего глазного яблока: проект BME60B: 9 шагов
Видео: Яблоки 5 РЕЦЕПТОВ, которые сейчас вам точно пригодятся + ЭКСПЕРИМЕНТ! 2024, Ноябрь
Anonim
Рецепт вашего глазного яблока: проект BME60B
Рецепт вашего глазного яблока: проект BME60B

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

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

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

Для этого руководства вам понадобятся:

  • Черно-белый узор в шахматную клетку, напечатанный на листе бумаги размером 11 x 8,5 дюймов.
  • Камера с возможностью блокировки фокуса
  • Штатив или что-то подобное для крепления камеры
  • Различные рецепты очков для чтения
  • MATLAB

Шаг 1. Сделайте фотографии

Делать фотографии
Делать фотографии
Делать фотографии
Делать фотографии
Делать фотографии
Делать фотографии

Чтобы рассчитать увеличение объектива, вам необходимо сравнить его с фактическим размером объекта. В этом проекте мы будем сравнивать увеличенное изображение с контрольным изображением.

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

Вы будете делать снимок черно-белой шахматной доски 8,5x11 дюймов с сеткой 1 дюйм. Установите камеру на расстоянии 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 = imrotate (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 = imline;
  • позиция = ждать (строка);
  • endpoints = line.getPosition;

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

  • X = конечные точки (:, 1)
  • Y = конечные точки (:, 2);

Используйте improfile для построения графика на основе значений интенсивности, найденных вдоль нарисованной линии. Это должно напоминать прямоугольную волну в диапазоне от 0 (черный) до 1 (белый). Также рассчитайте пики и их расположение.

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

Найдите длину каждого плато на графике импрофиля с помощью цикла for. Запустите цикл for для того же количества пиков, что и в графе импрофиля. Чтобы рассчитать длину каждого плато, используйте функцию «найти», чтобы найти все места, где есть «1» вместо значения интенсивности «0». Затем вычислите длину этого массива, чтобы получить общую длину плато, которая должна равняться ширине белого квадрата в пикселях. ControlPlateauList = zeros (1, length (loc));

для i = 1: длина (loc)

если я == длина (место)

плато = найти (c1 (loc (i): end,:, 1));

еще

плато = найти (c1 (loc (i): loc (i + 1) -1,:, 1));

конец

ControlPlateauList (i) = длина (плато);

конец

Шаг 5: повторите шаги 3 и 4 для тестового изображения

Повторите шаги 3 и 4 для тестового изображения
Повторите шаги 3 и 4 для тестового изображения

* Примечание: рисуя линию импрофиля на тестовом изображении, обязательно проведите ее по квадратам, которые соответствуют линии, которую вы нарисовали на контрольном изображении.

Шаг 6: Рассчитайте увеличение объектива

Рассчитайте увеличение объектива
Рассчитайте увеличение объектива

Увеличенные измерения рассчитываются путем деления среднего значения длины плато, которое было вычислено на этапе 5, на среднее значение длины контрольного плато, которое было вычислено на этапе 4. Рассчитанное значение составляет 1,0884.

увеличение = среднее (список плато) / среднее значение (список контрольных полей);

Шаг 7: Нахождение R-квадрата и рецепта пользователя с помощью интерполяции

Нахождение R-квадрата и рецепта пользователя с помощью интерполяции
Нахождение R-квадрата и рецепта пользователя с помощью интерполяции

Используя код:

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

Мы можем найти значение R-квадрат графика GivenPresciption (данные для наших линз) и MagArray (массив коэффициентов увеличения, которые мы вычислили ранее). Имея достаточно высокое значение R-квадрата, можно сделать вывод, что существует достаточно сильная корреляция, чтобы оправдать использование этого метода. Для этого конкретного случая значение R-квадрата было 0,9912, что предполагает сильную корреляцию и, следовательно, оправдано использование этого метода в анализе.

Используя функцию:

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

Мы можем интерполировать соответствующее значение предписания (по оси X) нашего коэффициента увеличения (значение по оси Y) и найти рецепт пользователя.

Интерполяция данных важна для работы этого метода, поскольку она позволяет нам делать предположения об информации, которой у нас нет, на основе той информации, которая у нас есть. В то время как линия наилучшего соответствия технически была бы более сильным кандидатом на это предположение, создание границ для уменьшения количества выходных результатов в любом случае дает тот же эффект, что и очки по рецепту, которые в любом случае приходят с постепенными единообразными значениями. Это объяснено в последующих шагах.

Шаг 8: Отображение рецепта пользователя на графике

Отображение рецепта пользователя на графике
Отображение рецепта пользователя на графике

Используя следующий код:

  • фигура;
  • сюжет (GivenPrescription, MagArray, '-g')
  • Подожди
  • сюжет (предписание, увеличение, 'bp')
  • откладывать
  • сетка
  • легенда ('Данные', 'Интерполированные точки', 'Местоположение', 'СЗ')

Мы можем построить график, который показывает коэффициенты увеличения в зависимости от данного рецепта с зеленой линией, а найденные данные нашего рассчитанного увеличения по сравнению с нашим интерполированным рецептом с синей звездой. Затем легенда помечает заголовок, ось x и ось y и помещает легенду в верхний левый угол.

Шаг 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 диоптрии и увеличиваются на 0,25 в их рецептах, поэтому после расчета рецепта мы хотим определить рецепт, который лучше всего подходит для того, что может потребоваться пользователю. После расчета рецепта мы проходим его через указанные операторы If, чтобы проверить его значение и определить, какой рецепт необходим. Если значение меньше или равно 1,125, то рецепт - 1,0. Все, что меньше или равно 1,375, рецепт 1,25. Все, что меньше или равно 1,625, рецепт - 1,5. Все, что меньше или равно 1,845, рецепт 1,75. И так далее.

У нас есть значения, увеличивающиеся, так как мы проверяем, меньше ли они. Если бы мы уменьшили значения, то первый оператор if все время будет читать первый оператор if. Если рецепт наименьший, мы хотим, чтобы он сразу распознал его как наименьший, поэтому мы начали с наименьшего значения. Все, что выше наивысшего значения, означает, что предписание не соответствует нашим данным, поэтому будет получено значение «Неизвестно».

Рекомендуемые: