Питер Корк Машинное зрение Основы и алгоритмы с примерами на Matlab Peter Corke Robotic Vision Fundamental Algorithms in MATLAB® Питер Корк Машинное зрение Основы и алгоритмы с примерами на Matlab Москва, 2023 УДК 004.93 ББК 32.972 К66 К66 Корк П. Машинное зрение. Основы и алгоритмы с примерами на Matlab / пер. с англ. В. C. Яценкова. – М.: ДМК Пресс, 2023. – 584 с.: ил. ISBN 978-5-93700-222-8 В этой книге теоретические основы компьютерного зрения подкреплены многочисленными примерами с использованием специализированного пакета инструментов для MATLAB. Читатель ознакомится с ключевыми понятиями зрения роботов, такими как моделирование камеры, обработка изображений, выделение признаков и многоракурсная геометрия, и узнает, как решать сложные задачи из этой области при помощи мощных численных инструментов и эффективного программного обеспечения. Издание адресовано исследователям в области робототехники, инженерам и студентам. Предполагается, что читатель владеет навыками работы с MATLAB, а также знаниями в области геометрии и векторной алгебры. УДК 004.93 ББК 32.972 First published in English under the title Robotic Vision. Fundamental Algorithms in MATLAB by Peter Corke. This edition has been translated and published under licence from Springer Nature Switzerland AG. Springer Nature Switzerland AG takes no responsibility and shall not be made liable for the accuracy of the translation. Все права защищены. Любая часть этой книги не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. ISBN 978-3-030-79174-2 (англ.) ISBN 978-5-93700-222-8 (рус.) © Springer Nature Switzerland AG 2022 © Перевод, оформление, издание, ДМК Пресс, 2023 Моей семье – Филиппе, Люси и Мадлен – за их снисходительность и поддержку; моим родителям Маргарет и Дэвиду за то, что разожгли мое любопытство; и Лу Полу, заронившему семя, из которого выросла эта книга. Содержание Вступительное слово редакторов...................................................................... 11 Вступительное слово ко второму изданию...................................................... 12 Предисловие. ........................................................................................................... 14 Примечание ко второму изданию....................................................................... 21 Специальные обозначения.................................................................................... 23 1 Введение............................................................................................................... 29 1.1 О книге......................................................................................................... 42 1.1.1 Программное обеспечение MATLAB и наборы инструментов.................................................................................. 43 1.1.2 Условные обозначения, соглашения и структура книги....... 45 1.1.3 Целевая аудитория......................................................................... 46 1.1.4 Обучение с по­мощью книги........................................................ 47 1.1.5 Преподавание с по­мощью книги............................................... 48 1.1.6 Структура книги............................................................................. 49 Дополнительное чтение. ......................................................................... 50 Часть I 2 Основы............................................................................................ 51 Представление позиции и ориентации.................................................. 53 2.1 2.2 2.3 2.4 2.5 Работа в двух измерениях (2D). ............................................................. 60 2.1.1 Ориентация в двух измерениях. ................................................ 61 2.1.2 Положение в двух измерениях. .................................................. 66 Работа в трех измерениях (3D)............................................................... 73 2.2.1 Ориентация в трех измерениях.................................................. 74 2.2.2 Положение в трех измерениях.................................................... 94 Дополнительные темы............................................................................100 2.3.1 Нормализация................................................................................100 2.3.2 Понятие экспоненциального отображения............................101 2.3.3 Подробнее о кручениях. ..............................................................103 2.3.4 Производная положения.............................................................107 2.3.5 Преобразование пространственных скоростей.....................109 2.3.6 Вращение, задаваемое в приращениях...................................111 2.3.7 Движение твердого тела, задаваемое в приращениях.........113 Использование Toolbox...........................................................................114 Подведение итогов...................................................................................117 Дополнительное чтение. ........................................................................120 Упражнения. ..............................................................................................121 Содержание 7 Часть II 3 Свет и цвет..........................................................................................................125 3.1 3.2 3.3 3.4 3.5 4 Компьютерное зрение............................................................123 Спектральное представление света.....................................................125 3.1.1 Поглощение....................................................................................129 3.1.2 Отражение.......................................................................................130 3.1.3 Яркость.............................................................................................131 Цвет..............................................................................................................132 3.2.1 Человеческий глаз.........................................................................133 3.2.2 Измерение цвета...........................................................................136 3.2.3 Воспроизведение цветов.............................................................138 3.2.4 Цветовое пространство................................................................142 3.2.5 Названия цветов............................................................................147 3.2.6 Другие цветовые и хроматические пространства. ...............148 3.2.7 Преобразование между различными основными цветами............................................................................................152 3.2.8 Что такое белый цвет?..................................................................155 Дополнительные темы............................................................................155 3.3.1 Цветовая температура. ................................................................156 3.3.2 Постоянство цвета. .......................................................................157 3.3.3 Баланс белого.................................................................................157 3.3.4 Изменение цвета из-за поглощения........................................159 3.3.5 Двухцветное отражение. .............................................................160 3.3.6 Гамма................................................................................................162 Применение: цветное изображение....................................................164 3.4.1 Сравнение цветовых пространств [examples/colorspaces]. ...164 3.4.2 Удаление теней [examples/shadow]. ..........................................166 Подведение итогов...................................................................................168 Дополнительное чтение. ........................................................................169 Источники данных...................................................................................171 Упражнения. ..............................................................................................172 Изображения и их обработка....................................................................174 4.1 4.2 4.3 4.4 4.5 Получение изображения.........................................................................175 4.1.1 Изображения из файлов..............................................................175 4.1.2 Изображения с подключенной камеры...................................181 4.1.3 Изображения из видеофайла. ....................................................185 4.1.4 Изображения из интернета. .......................................................186 4.1.5 Изображения с карт......................................................................187 4.1.6 Изображения из кода. ..................................................................188 Гистограммы изображений....................................................................190 Монадические операции........................................................................192 Диадические операции...........................................................................195 Пространственные операции................................................................200 4.5.1 Линейная пространственная фильтрация..............................201 4.5.2 Сравнение с шаблоном................................................................216 8 Содержание 4.6 4.7 4.8 5 4.5.3 Нелинейные операции. ...............................................................223 Математическая морфология................................................................225 4.6.1 Удаление шума...............................................................................229 4.6.2 Обнаружение границы.................................................................231 4.6.3 Преобразование «попадание или промах».............................232 4.6.4 Преобразование расстояния [examples/chamfer_match.m]....233 Изменение формы. ..................................................................................235 4.7.1 Обрезка............................................................................................235 4.7.2 Изменение размера изображения. ...........................................236 4.7.3 Пирамиды изображений.............................................................238 4.7.4 Деформация изображения..........................................................239 Подведение итогов...................................................................................243 Дополнительное чтение. ........................................................................245 Источники изображений........................................................................246 Примечания к MATLAB. ..........................................................................247 Программные инструменты общего назначения. ...........................247 Упражнения. ..............................................................................................248 Извлечение признаков изображения.....................................................251 5.1 5.2 5.3 5.4 Получение признаков из области.........................................................252 5.1.1 Классификация..............................................................................254 5.1.2 Оформление...................................................................................266 5.1.3 Описание.........................................................................................270 5.1.4 Промежуточный итог...................................................................285 Признаки, извлекаемые из линий........................................................287 5.2.1 Промежуточный итог...................................................................293 Признаки, извлекаемые из точек.........................................................294 5.3.1 Классические детекторы углов..................................................294 5.3.2 Угловые детекторы в масштабируемом пространстве........301 Подведение итогов...................................................................................308 Примечания к MATLAB. ..........................................................................309 Дополнительное чтение. ........................................................................310 Упражнения. ..............................................................................................314 Часть III 6 Геометрия зрения......................................................................317 Формирование изображения. ...................................................................319 6.1 6.2 Перспективная камера............................................................................320 6.1.1 Перспективная проекция............................................................320 6.1.2 Моделирование перспективной камеры.................................324 6.1.3 Дискретная плоскость изображения........................................326 6.1.4 Матрица камеры............................................................................328 6.1.5 Точки проекции.............................................................................331 6.1.6 Дисторсия объектива. ..................................................................334 Калибровка камеры. ................................................................................336 Содержание 9 6.3 6.4 6.5 6.6 6.7 7 6.2.1 Метод гомогенного преобразования. ......................................337 6.2.2 Разложение калибровочной матрицы камеры......................340 6.2.3 Вычисление положения...............................................................341 6.2.4 Инструменты для калибровки камеры....................................343 Изображения с широким полем зрения.............................................345 6.3.1 Камера с объективом «рыбий глаз»..........................................346 6.3.2 Катадиоптрическая камера........................................................349 6.3.3 Сферическая камера.....................................................................352 Унифицированная модель формирования изображений..............354 6.4.1 Сопоставление широкоугольных изображений со сферой.........................................................................................356 6.4.2 Преобразование сферического изображения в перспективное............................................................................358 Новые типы камер....................................................................................360 6.5.1 Многокамерные массивы............................................................360 6.5.2 Камеры светового поля................................................................361 Дополнительные темы............................................................................364 6.6.1 Проецирование произвольных линий в трехмерном пространстве..................................................................................364 6.6.2 Неперспективные камеры..........................................................366 6.6.3 Камера и движение изображения.............................................368 Подведение итогов...................................................................................375 Дополнительное чтение и ресурсы......................................................377 Примечания к инструментам................................................................379 Упражнения. ..............................................................................................380 Использование нескольких изображений...........................................382 7.1 7.2 7.3 7.4 7.5 Cовмещение признаков..........................................................................384 Геометрия нескольких ракурсов...........................................................390 7.2.1 Фундаментальная матрица. .......................................................393 7.2.2 Существенная матрица................................................................396 7.2.3 Вычисление фундаментальной матрицы по данным реального изображения...............................................................398 7.2.4 Планарная гомография................................................................404 Стереозрение.............................................................................................411 7.3.1 Разреженное стереозрение.........................................................411 7.3.2 Плотное стереосопоставление...................................................416 7.3.3 Уточнение пика. ............................................................................426 7.3.4 Очистка и реконструкция. ..........................................................427 7.3.5 Отображение 3D-текстуры. ........................................................432 7.3.6 Анаглифы........................................................................................433 7.3.7 Исправление изображения.........................................................435 Пакетная подстройка...............................................................................437 Облака точек..............................................................................................447 7.5.1 Поиск плоскости............................................................................447 7.5.2 Сопоставление двух наборов точек..........................................449 10 Содержание 7.6 7.7 7.8 Структурированный свет........................................................................453 Приложения...............................................................................................455 7.7.1 Коррекция перспективы..............................................................455 7.7.2 Мозаика [examples/mosaic]. ........................................................459 7.7.3 Сопоставление и поиск изображений [examples/retrieval]....463 7.7.4 Визуальная одометрия [examples/vodemo].............................471 Подведение итогов...................................................................................476 Примечания к MATLAB и Toolbox.........................................................477 Дополнительное чтение. ........................................................................478 Дополнительные ресурсы.......................................................................484 Упражнения. ..............................................................................................486 Приложения. ......................................................................................................493 A Установка наборов инструментов............................................................495 B Линейная алгебра: краткое повторение...............................................499 B.1 B.2 С Векторы.......................................................................................................499 Матрицы.....................................................................................................501 Геометрия............................................................................................................509 C.1 C.2 C.3 Евклидова геометрия. .............................................................................509 Однородные координаты.......................................................................522 Геометрические преобразования.........................................................526 D Группы и алгебра Ли.......................................................................................530 E Линеаризация, якобианы и гессианы.....................................................537 F Решение систем уравнений. .......................................................................543 F.1 F.2 Линейные задачи......................................................................................543 Нелинейные задачи.................................................................................545 G Графы.....................................................................................................................555 H Определение пика...........................................................................................559 Литература...........................................................................................................564 Предметный указатель.......................................................................................579 Вступительное слово редакторов На заре третьего десятилетия века робототехника радует нас удивительными успехами и продолжает стремительно развиваться, опираясь на передовые технологии. Это безостановочное развитие способствует широчайшему внедрению роботов в человеческую жизнь в больницах и домах, на фабриках и в школах; в поле роботы тушат пожары, производят товары и продукты, собирают фрукты и поливают сельскохозяйственные угодья, сохраняя человеческие жизни и сберегая драгоценное время. Сегодня мы ожидаем, что роботы окажут значительное влияние на самые разные отрасли, от промышленного производства до здравоохранения, транспорта и исследования дальнего космоса и моря. Завтра роботы станут будничным явлением и еще больше проникнут в различные аспекты нашей жизни. Издательский проект Springer Tracts in Advanced Robotics (STAR) призван донести до сообщества исследователей последние достижения в области робототехники исходя из их значимости и качества. Наша цель – путем широкого и своевременного распространения важнейших научных разработок в области робототехники способствовать обмену информацией и сотрудничеству между исследователями и поддерживать дальнейший прогресс в этой быстро развивающейся области. Эта книга представляет собой доработанный ремейк одного из томов второго издания книги Питера Корка «Робототехника, зрение и управление – фундаментальные алгоритмы в MATLAB», вышедшего в 2017 г. Его работа теперь состоит из двух отдельных томов: один посвящен робототехнике и управлению, а другой – роботизированному зрению. Первый том содержит материал из первых девяти глав предыдущего издания и раскрывает такие понятия, как: положение, время и движение; мобильные роботы с навигацией и локализацией; кинематика, динамика и управление роботами-манипуляторами. Второй том содержит материал из первых двух глав и глав с десятой по четырнадцатую предыдущего издания и охватывает следующие темы: основы положения наблюдателя в пространстве, компьютерного зрения, обработки изображений и выделения признаков; формирование изображения и множественные изображения в контексте геометрии зрения. В результате мы получили комплект из двух книг, который, по отзывам читателей, стал настоящей жемчужиной в нашей серии STAR! Редакторы STAR Бруно Сицилиано (Неаполь, Италия) Усама Хатиб (Стэнфорд, США) Ноябрь 2020 г. Вступительное слово ко второму изданию Однажды ко мне на рецензию попала очень толстая папка с диссертацией из далекой страны. Темой диссертации было «Визуальное управление роботами», а ее автором был Питер Корк. Я вспоминаю отрывок из моих комментариев, в котором говорил, что это мастерская научная работа, качество диссертации, к которому следует стремиться всем студентам, зная, что очень немногие смогут его достичь, – очень хорошо продуманное и выполненное исследование. Связь между робототехникой и зрением вот уже более двух десятилетий является центральной нитью фундаментальных исследований и успешных прикладных разработок Питера Корка. Этот редкий опыт воплощен во втором издании его книги. В своем слиянии теории и практики это второе издание значительно выиграло от уникального сочетания академического и практического опыта автора, основанного на его многолетней работе в области роботизированной горнодобывающей, авиационной, подводной и полевой техники. Существует множество учебников по робототехнике и компьютерному зрению, но лишь немногие из них достигли уровня интеграции знаний, анализа научной области и доходчивости иллюстраций, представленных в этой книге. Обсуждение подробное, повествование удивительно информативное и доступное, и в целом создается впечатление, что эта книга станет важнейшим ресурсом для сегодняшних и будущих исследователей в области робототехники. Я могу смело утверждать, что почти каждый аспект, который можно считать относящимся к задаче, был проанализирован и включен в эту книгу, и мою убежденность в этом подтверждает эффективное использование программного обеспечения MATLAB Toolbox. Читатель ознакомится с такими ключевыми понятиями зрения роботов, как моделирование камеры, обработка изображений, выделение признаков и многоракурсная геометрия. В процессе обсуждения автор дает представление о том, как сложные проблемы могут быть разделены на ряд частных задач, решаемых с использованием мощных численных инструментов и эффективного программного обеспечения. Вступительное слово ко второму изданию 13 Издательский проект Springer Tracts in Advanced Robotics (STAR) призван донести до сообщества исследователей последние достижения в области робототехники исходя из их значимости и качества. Наша цель – путем широкого и свое­ временного распространения важнейших научных разработок в области робототехники способствовать обмену информацией и сотрудничеству между исследователями и поддерживать дальнейший прогресс в этой быстро развивающейся области. Питер Корк дополняет нашу серию STAR авторитетной книгой, охватывающей разные области, идеально задуманной и блестяще выполненной. Усама Хатиб Стэнфорд, Калифорния Октябрь 2016 г. Предисловие Скажи мне – и я забуду. Покажи – и я запомню. Заставь меня сделать – и я пойму. Китайская пословица Простые вещи должны быть простыми, сложные вещи должны быть возможными. Алан Кей Цифровые изображения окружают нас повсюду – у большинства из нас есть коллекции из тысяч цифровых изображений, снятых на различных устройствах. Каждое изображение содержит информацию, о которой мы обычно не задумываемся, – в наборе пикселей скрыта информация о трехмерной структуре сцены, материалах, из которых она состоит, и условиях освещения в данный момент. В повседневной жизни мы используем зрение, чтобы выполнять огромное количество разнообразных действий: узнавать людей, читать текст, манипулировать объектами и ориентироваться в пространстве. Некоторые простые визуальные задачи теперь могут решать машины. Например, камеры могут определить, улыбаемся ли мы, платформы социальных сетей и таможенные терминалы могут распознавать отдельные лица; мы можем искать фотоснимки в онлайн-альбомах, используя ключевые слова. Роботы обязаны овладеть визуальными навыками, если они хотят реализовать свой потенциал в качестве полезных и вездесущих машин в нашей повседневной жизни. Роботы – это машины, управляемые данными: они собирают данные, обрабатывают их и предпринимают действия на их основе. Данные поступают от различных датчиков, включая камеры. Изображение состоит из миллионов пикселей, и объем данных, которые необходимо обрабатывать в режиме реального времени, огромен. Прогресс роботизированного зрения всегда был обусловлен появлением более эффективных способов обработки этих дан- «В будущем компьютеры могут ных. Все успехи в области роботизированного зрения достиг- весить не более нуты за счет новых и более эффективных алгоритмов, а также 1.5 тонн». Журнал резкого увеличения вычислительной мощности в соответствии Popular Mechanics, предсказавший с законом Мура . Когда я начал заниматься робототехникой развитие науки и компьютерным зрением в середине 1980-х (рис. 0.1), как раз в 1949 г. Предисловие 15 появился компьютер IBM PC – он имел 16-разрядный микропроцессор с частотой 4.77 МГц и 16 Кбайт памяти (с возможностью расширения до 256 Кбайт). За прошедшие 30 с лишним лет вычислительная мощность выросла более чем в миллион раз. За последние пять лет на передний план вышли графические процессоры (GPU), которые породили новую волну алгоритмов, Тема глубокого управляемых данными, в первую очередь в области глубокого обучения выходит обучения . за рамки этой книги. Стойка VME ЦПУ 68030, 25 МГц + ОЗУ 16 Мбайт + VxWorks Пиксельный процессор Datacube, 10 Мпикс/с Изображение с камеры робота Управление выборкой с камеры Стойка ввода/вывода Multibus ток моторов сжатие + крутящий момент Фильтры аналоговых сенсоров Контроллер робота Unimation Рис. 0.1. Когда-то для экспериментов с роботизированным зрением требовалось много специального оборудования. Здесь автор книги сидит возле стойки, набитой модулями для обработки изображений в реальном времени и управления роботами (1992 г.) «Понимание» – это За относительно короткую историю роботизированного зреслово с очень об- ния было разработано очень большое количество алгоритмов ширной смысловой нагрузкой, и фило- для эффективного решения крупномасштабных задач понисофский вопрос мания сцены , оценки движения и трехмерной реконструко том, сможет ли ции – значительное, осязаемое и коллективное достижение исмашина когда-либо «понимать», пока следовательского сообщества. Однако объем и сложность этих остается открытым. знаний представляют собой вполне реальную преграду для ноВ этом контексте мы вичков. При взгляде на изобилие доступных алгоритмов возиспользуем узкую интерпретацию никает реальный и важный вопрос: «понимания», котоКакой алгоритм выбрать для моей конкретной задачи? рая подразумевает распознавание объРазумеется, можно попробовать несколько разных алгоритектов и, возможно, действий. мов и посмотреть, какой из них лучше всего подходит для теку- щей задачи, но это очень трудоемкий подход, и он приводит нас к следующему вопросу: Как я могу оценить алгоритм X на своих собственных данных, не тратя дни на его реализацию и отладку исходного кода из оригинальных исследовательских работ? 16 Предисловие К счастью, нам благоволят два важных фактора. Во-первых, это доступное математическое программное обеспечение общего назначения, которое упрощает создание прототипов алгоритмов. Существуют коммерческие пакеты, такие как MAT- Соответственно товарные знаки LAB®, Mathematica®, Maple® и MathCad® , а также проекты The MathWorks Inc., с открытым исходным кодом, такие как SciLab, Octave и Mat- Wolfram Research, MapleSoft и PTC. plotlib. Все эти инструменты эффективно работают с векторами и матрицами, способны рисовать сложную и красивую графику и могут применяться в интерактивном режиме или в качестве среды программирования. Во-вторых, это сообщество сторонников открытого исходного кода. Многие алгоритмы, разработанные исследователями, доступны в виде открытого исходного кода. Они могут быть реализованы на одном из только что упомянутых математических языков общего назначения или написаны на распространенном языке, таком как C, C++, Java или Python. Более двадцати лет я участвую в жизни сообщества разработчиков программного обеспечения с открытым исходным кодом и поддерживаю два набора инструментов MATLAB с открытым исходным кодом: один для машинного зрения и один для робототехники. Их основы были заложены еще в моей докторской диссертации, и с тех пор они развивались, обретая новые функции и отслеживая изменения в языке MATLAB. Именно они составляют основу этой книги. У этих наборов инструментов есть несколько важных достоинств. Во-первых, они существуют уже давно, и тысячи пользователей применяют их для решения самых разных задач, поэтому коду можно доверять. Новые алгоритмы или даже традиционные подходы, закодированные на новых языках или выполняемые в новых средах, вполне можно сопоставить с реа­ лизациями в MATLAB Toolbox. » позволить пользователю работать с реальными задачами, а не только с тривиальными примерами Во-вторых, они позволяют пользователю работать с реальными задачами, а не только с тривиальными примерами. Когда мы беремся за обработку реальных изображений с миллионами пикселей, необходимые вычисления многократно превышают возможности человека. В-третьих, они позволяют нам получить понятное визуальное представление, которое в противном случае могло бы затеряться на фоне сложных вычислений. Мы можем быстро и легко экспериментировать, играть в игру «что, если…» и выводить результаты на экран, используя мощные инструменты 2D- и 3D-графического отображения MATLAB. В-четвертых, код Toolbox делает многие распространенные алгоритмы осязаемыми и доступными. Вы можете Предисловие 17 прочитать код, применить его к своим задачам, расширить или переписать. Это дает вам серьезную фору на старте, когда вы начинаете свой путь к роботизированному зрению. Я старался использовать в книге свободное разговорное повествование, переплетая текст, математические формулы и примеры кода. Я хотел показать, как сложные проблемы можно разложить на части и решить, используя всего несколько простых строк кода. Строго говоря, это индуктивный подход к обучению – переход от конкретных и частных примеров к более общему знанию. » показать, как сложные проблемы можно разложить на части Выбор тем, затронутых в этой книге, основан на моих собственных научных интересах, а также отражает реальные проблемы, которые я наблюдал в течение многих лет как практик робототехники и компьютерного зрения. Я хочу дать вам общее представление о том, что такое роботизированное зрение и на что оно способно, – считайте, что вы держите в руках меню грандиозной дегустации. Я надеюсь, что к концу этой книги вы разделите мой энтузиазм по поводу всех упомянутых тем. » считайте, что вы держите в руках меню грандиозной дегустации Прежде всего я старался написать серьезное введение в компьютерное зрение для робототехников. Большинство учебников по робототехнике, как правило, сосредоточено лишь на простых методах бинарного зрения. В этой книге мы рассмотрим широкий круг тем, включая цветовое зрение, передовые методы сегментации, деформацию изображения, стереозрение, оценку движения, визуальную одометрию и поиск изображений. Мы также рассматриваем неперспективную визуализацию с использованием объективов типа «рыбий глаз», катадиоптрической оптики и новых камер светового поля. Эти темы становятся все более важными для робототехники, но обычно не освещаются в массовой литературе. Зрение – это мощный источник сенсорной информации, и робототехники должны хорошо разбираться в основах его работы. » программное обеспечение является важнейшей частью этой книги Эта книга не похожа на другие учебники, и это сделано намеренно. Во-первых, программное обеспечение является важнейшей частью книги. Программное обеспечение – это осязаемая реализация описанных алгоритмов. Его можно прочитать, его можно разобрать, изменить и снова собрать. Существует ряд 18 Предисловие классических книг, в которых программное обеспечение используется в качестве иллюстраций и которые повлияли на мой подход, например LaTeX: A document preparation system (Lamport 1994), Numerical Recipes in C (Press et al. 2007), The Little Lisper (Friedman et al. 1987) и Structure and Interpretation of Classical Mechanics (Sussman et al. 2001). Более 700 примеров в этой книге иллюстрируют, как можно использовать программное обеспечение Toolbox, и, как правило, обеспечивают мгновенный результат спустя всего пару строк кода MATLAB. » мгновенный результат спустя всего пару строк кода MATLAB Во-вторых, построение книги на основе MATLAB и Toolbox означает, что мы можем решать более реалистичные и более сложные задачи, чем в других книгах. » эта книга предполагает комплексный подход Акцент на программном обеспечении и примерах не означает, что строгость и теория не важны – они очень важны, но эта книга предполагает комплексный подход. Ее лучше всего читать в сочетании с другими учебными материалами, предлагающими строгую теоретическую базу. В конце каждой главы есть раздел с перечнем дополнительной литературы и ссылками на соответствующие учебники, статьи и онлайн-ресурсы. Я старался дать читателям необходимое и достаточно развернутое математическое обоснование каждой темы, но, если вам нужна глубокая и строгая математика, возможно, эта книга не для вас. Набор инструментов также включает в себя отличное программное обеспечение с открытым исходным кодом, и я благодарен за следующий код, который был включен в набор инструментов машинного зрения: RANSAC Питера Ковеси; оценку пространственного положения сделал Франческо Морено-Ногер, Винсент Лепети и Паскаль Фуа; преобразование цветового пространства выполнил Паскаль Гетройер; числовые процедуры для геометрического зрения разработаны различными членами группы визуальной геометрии в Оксфорде (с веб-сайта книги Хартли и Зиссермана, 2003 г.); алгоритмы k-means, SIFT и MSER заимствованы из замечательного пакета VLFeat (vlfeat. org) Андреа Ведальди и Брайана Фулкерсона; программное обеспечение для сегментации изображений на основе графов разработал Педро Фельзеншвальб; также был использован детектор признаков OpenSURF Дирка-Яна Кроона и набор инструментов для калибровки камеры Жан-Ива Буге. Работая над этой книгой, я был очарован математиками, учеными и инженерами, чьи труды сотни лет назад легли в основу современной науки о роботизированном зрении. Некоторые Предисловие 19 имена стали прилагательными, например гауссов, лапласов или декартов, или существительными, такими как якобиан. Это интересные персонажи далекой эпохи, когда наука была не профессией, а хобби, и занимались ей врачи, алхимики, игроки, астрологи, философы или наемники. Чтобы знать, на плечах каких гигантов мы стоим, я добавил в книгу небольшие вставки о жизни некоторых из этих людей. В моей собственной карьере мне посчастливилось работать со многими замечательными людьми, которые вдохновляли и направляли меня. Давным-давно в Мельбурнском университете Джон Андерсон пробудил во мне интерес к управлению роботами, а Грэм Холмс с переменным успехом пытался заставить меня «думать, прежде чем писать код». В начале пути я провел десять месяцев, изменивших направление моей жизни, работая с Ричардом (Лу) Полом в лаборатории GRASP Пенсильванского университета в период с 1988 по 1989 гг. Разработка инструментария Toolbox легла в основу докторской диссертации (1991–1994), и мои консультанты Малкольм Гуд (Мельбурнский университет) и Пол Данн (CSIRO) задавали мне хорошие вопросы и руководили моими исследованиями. Ласло Немес (CSIRO) поделился мудростью о жизни и способах организации исследований и надоумил меня опубликовать открытый исходный код моего программного обеспечения. Большая часть моей карьеры прошла в CSIRO, где у меня была привилегия и возможность работать над разнообразными реальными проектами в области робототехники и технического зрения, а также сотрудничать с действительно талантливыми коллегами и друзьями. На полпути к написанию первого издания я присоединился к Технологическому университету Квинсленда, который выделил время для завершения этой работы, а в 2015 г. ушел в творческий отпуск, чтобы закончить второе издание. Многие люди помогали мне в моем начинании, и я благодарен им. На период работы над книгой меня щедро поддерживали Пол Ньюман в Оксфорде (оба издания) и Даниэла Рус в Массачусетском технологическом институте (первое издание). Даниэла, Поль и Седрик Прадалье внесли конструктивные предложения и комментарии по первым наброскам этого издания. В работе над вторым изданием мне помогли комментарии к черновикам глав, которые предоставили Тим Барфут, Дмитрий Братанов, Дункан Кэмпбелл, Дональд Дансеро, Том Драммонд, Малкольм Гуд, Питер Куджала, Обадия Лам, Йорн Мальзан, Фелипе Насименто Мартинс, Аджай Пандей, Седрик Прадалье, Дэн Ричардс, Даниэла Рус, Сарех Ширази, Сурья Сингх, Райан Смит, Бен Талбот, Дориан Цай и Бен Апкрофт. Я благодарен за мудрые советы о содержании книги, которые мне дали Франсуа Шометт, Дональд Дансеро, Кевин Линч, Роберт Махони и Фрэнк Парк. 20 Предисловие Я старался устранить ошибки, но некоторые из них неизбежно ускользнут от моего внимания. Пожалуйста, присылайте по адресу [email protected] сообщения об ошибках, а также предложения по улучшениям и дополнениям книги. Второе издание было написано при финансовой поддержке гранта платформы EPSRC EP/M019918/1, гранта научно-технического факультета QUT, премии вице-канцлера QUT, кафедры робототехнических систем QUT и Центра передового опыта ARC в области робототехнического зрения (грант CE140100016). Во время работы над обоими изданиями я получил замечательную помощь от авторской программы MathWorks и издательства Springer. Мой редактор Springer Томас Дитцингер оказал большую поддержку этому проекту, а Армин Сташ, с его огромным терпением и самоотверженностью в верстке и наборе текста, превратил мои неаккуратные наброски в нечто прекрасное. Наконец, моя глубочайшая благодарность Филиппе, которая поддерживала меня с присущим ей изяществом и терпением в течение очень долгого времени и во многих разных ситуациях, – без нее эта книга никогда не была бы написана. Питер Корк, Брисбен, Квинсленд, август 2018 г. Примечание ко второму изданию Принцип доработки заключался в том, чтобы сохранить в книге хорошее (стиль повествования, приоритет кода, мягкая ламинированная обложка) и устранить плохое (ошибки и пропущенные темы). Ошибок было больше, чем мне бы хотелось, и я благодарю всех, кто прислал исправления и предложил улучшения. Первое издание было написано до того, как я начал преподавать в университете или создал MOOC, что противоречит тому, как обычно пишутся книги. Подготовка к преподаванию дала мне понимание того, как лучше изложить некоторые темы, особенно связанные с представлением поз, кинематикой и динамикой роботов, поэтому описания были соответствующим образом скорректированы. Добавления включают матричную экспоненциальную запись; основы теории винтов и алгебры Ли; инерциальную навигацию; дифференциальное управление и всенаправленных мобильных роботов; более глубокую обработку систем SLAM, включая сопоставление сканирования и графов поз; более широкое использование компьютерной алгебры MATLAB; оперативный контроль пространства; более глубокое рассмотрение динамики и управления манипулятором; визуальный SLAM и визуальную одометрию; структурированный свет и светосильные камеры. В первом издании я избегал алгебры Ли, матричных экспонент и кручений, но теперь считаю важным осветить их. Темы глубоко математические, и я попытался найти золотую середину между жесткой алгебраической топологией и подходом большинства других книг к описанию только однородных преобразований, оставаясь при этом верным общему подходу этой книги. Все сгенерированные MATLAB рисунки были обновлены, чтобы отразить последние улучшения графики MATLAB, и все примеры кода были обновлены и протестированы в соответствии с актуальными требованиями и доступны в виде MATLAB Live Scripts. Второму изданию книги соответствуют новые базовые версии моих наборов инструментов: Robotics Toolbox (выпуск 10) и Machine Vision Toolbox (выпуск 4). Эти более новые версии наборов инструментов имеют некоторые незначительные не- 22 Примечание ко второму изданию совместимости с предыдущими выпусками наборов инструментов и, следовательно, также с примерами кода в первом издании книги. Примечание к этому изданию Эта книга, изданная в виде самостоятельного тома, по существу, является частями I и IV второго издания книги «Робототехника, зрение и управление». Часть IV предыдущей версии книги была переработана и разделена на две части, а содержание, относящееся к робототехнике и управлению на основе зрения, было исключено. Специальные обозначения К сожалению, в книгах и научных статьях, посвященных роботизированному зрению, нет единообразия, и применяемые в них символы и обозначения могут значительно различаться. Символы, используемые в этой книге, и их единицы измерения, где это уместно, перечислены ниже. Некоторые символы имеют несколько значений, и для устранения неоднозначности следует четко понимать контекст, в котором они применяются. Обозначение x* x+ x# x̂ – x x〈k〉 υ υ̂ υ̃ v[i] vx A A[i,j] Ai,j f(x) Fx(x) Fxy(x, y) q˚ 0m×n 1m×n Описание желаемое значение x спрогнозированное значение x измеренное или наблюдаемое значение x ожидаемое значение x среднее по x или относительное значение k-й элемент временного ряда вектор единичный вектор, параллельный υ однородное представление вектора υ i-й элемент вектора υ компонент вектора матрица элемент (i, j) матрицы A элемент (i, j) матрицы A функция от x производная ¶f/¶x производная ¶ 2f/¶x¶y единичный кватернион q˚ ∈ �3 матрица нулей m×n матрица единиц m×n 24 Специальные обозначения Символ C E f f � In×n J A JB k, K K L N(μ, σ2) p P ℙ2 ℙ3 q R � �2 �3 �1 �n se(n) so(n) SE(n) SO(n) S t T T A TB u, ν u0, ν0 u–, – v υ υ X, Y, Z – x,– y � �+ Описание матрица камеры, C ∈ �3×4 освещенность (люкс) фокусное расстояние вектор признаков изображения множество всех кватернионов (� происходит от Гамильтона) единичная матрица n×n, матрица тождественности матрица Якоби, якобиан преобразованная по Якоби скорость в системе координат B по отношению к системе A константа калибровочная матрица камеры яркость (нит, 1нт = 1кд/1м²) нормальное (гауссово) распределение со средним μ и стандартным отклонением σ точка в плоскости изображения, p ∈ �2 мировая точка проективное пространство всех двухмерных точек, 3-кортеж проективное пространство всех трехмерных точек, 4-кортеж обобщенные (лагранжевы) координаты, конфигурация q ∈ � ортонормальная матрица вращения, R ∈ SO(2) или SO(3) множество вещественных чисел множество всех точек в двухмерном пространстве множество всех точек в трехмерном пространстве единичная окружность, множество углов [0, 2π) единичная сфера, вписанная в �n+1 алгебра Ли для SE(n), �(n+1)×(n+1)-дополненная кососимметричная матрица алгебра Ли для SО(n), кососимметричная матрица �n×n особая евклидова группа, множество всех положений в n измерениях, представленное гомогенной матрицей преобразования �(n+1)×(n+1) особая ортогональная группа, множество всех ориентаций в n измерениях, представленное ортогональной матрицей �n×n скручивание в трех измерениях, S ∈ �6 время температура оптическая прозрачность, светопропускание гомогенное преобразование, представленное системой координат {B} по отношению системе {A}. Если A не дано, система рассматривается относительно точки 0 мировой системы координат координаты на плоскости изображения камеры координаты главной точки нормализованные координаты плоскости изображения относительно главной точки скорость вектор скорости декартовы координаты нормализованные координаты плоскости изображения множество всех целых чисел множество всех целых чисел больше ноля Единица лк м нт м, рад с K м–1 пиксели пиксели м м/с м/с Специальные обозначения 25 φ Г θ θr, θp, θy λ λ ν ξ ξB A π π ρw, ρh σ Σ ω ω Ω сила света (световой поток, люмены) 3-угловое представление вращения, Г ∈ �3 угол углы крена, тангажа, рысканья длина волны собственное значение трехмерная (пространственная) скорость «кси», абстрактное представление положения в декартовых координатах абстрактное представление относительного положения, системы координат {B} относительно системы {A} или движения твердого тела из системы {A} в {B} математическая константа плоскость ширина и высота пикселя стандартное отклонение в алгебре Ли Σ = [·] ∈ se(3) скорость вращения вектор угловой скорости в алгебре Ли Ω = [·]×∈ so(3) лм рад рад рад м м/с, рад/с м рад/с рад/с 26 Специальные обозначения Оператор ||·|| υ1·υ2 υ1×υ2 A–1 A+ A* AT A–T • ⊕ ⊖ ⊖ Δ(·) Δ–1(·) �i (θ) �(ω) �i (d) �(t) [·]t [·]R [·]× ⋁×(·) [·] ⋁(·) Ad(·) ad(·) ∘ v̊ ~ ≃ ⊝ �(·) ⋆ ⊗ ≡ ⊕ ⊖ ∘ • {F} [a, b] (a, b) [a, b) (a, b] Описание норма (длина) вектора: �n ↦ � скалярное (внутреннее) произведение, также υ1T·υ2: �n×�n ↦ � векторное (перекрестное) произведение: �n×�n ↦ � обращение (инверсия) A: �n×n ↦ �n×n псевдообращение (псевдоинверсия) A: �n×m ↦ �m×n дополнение (присоединение): A ↦ det(A)A–1, �n×n ↦ �n×n транспонирование A: �n×m ↦ �m×n транспонирование с обращением: A ↦ (AT )–1 = (A–1)T, �n×n ↦ �n×n преобразование точки (вектора координат) в относительное положение: SE(n) × �n ↦ �n суперпозиция: SOE (n) × SOE (n) ↦ SOE (n) суперпозиция с инверсией: SOE (n) × SOE (n) ↦ SOE (n) унарная (одноместная) инверсия: SOE (n) ↦ SOE (n) отображение инкрементного (абсолютного) изменения расположения в дифференциальное (относительное) движение: SE(3) ↦ �6 отображение дифференциального движения в инкрементное изменение расположения: �6 ↦ SE(3) чистое вращение относительно оси i: � ↦ SE(3) чистое вращение по ||ω|| относительно ω: �3 ↦ SE(3) чистое перемещение вдоль оси i: � ↦ SE(2), SE(3) чистое перемещение по вектору: �n ↦ SE(n) компонент перемещения в простр. расположении: SE(n) ↦ �n компонент вращения в простр. расположении: SE(n) ↦ �n×n кососимметричная матрица: � ↦ so(2), �3 ↦ so(3) распаковка кососимметричной матрицы: so(2) ↦ �, so(3) ↦ �3 пополненная кососимметричная матрица: �3 ↦ se(2), �6 ↦ se(3) распаковка пополненной кососимметричной матрицы: se(2) ↦ �3, so(3) ↦ �6 сопряженное представление: SE(3) ↦ �6×6 логарифм сопряженного представления: SE(3) ↦ �6×6 перемножение кватернионов (гамильтонианов): �×� ↦ � чистый кватернион: �3 ↦ � эквивалентность представлений эквивалентность однородных координат наименьшая угловая разность между углами на окружности: � 1 × �1 ↦ � функция проекции камеры: �3 ↦ �2 свертка корреляция колориметрическая эквивалентность морфологическая диляция морфологическая эрозия морфологическое открывание морфологическое закрывание система координат интервал от a до b включительно интервал от a до b, не включая a и b интервал от a до b, не включая b интервал от a до b, не включая a MATLAB norm, .norm dot cross inv pinv ' * * / .inv tr2delta delta2tr SE3.rotx|y|z SE3.angvec SE2, SE3 SE2, SE3 .t .R skew vex skewa vexa .Ad .ad * Quaternion.pure angdiff .project iconv Специальные обозначения 27 Соглашения MATLAB Toolbox Декартова координата (точка) выражается как векторстолбец. Множество точек выражается в виде матрицы со столбцами, представляющими координаты отдельных точек. Прямоугольная область определяется двумя противоположными углами как матрица 2´2 [xmin xmax; ymin ymax]. Данные временного ряда выражаются в виде матрицы со строками, представляющими временные шаги. Матрица MATLAB имеет нижние индексы (i, j), которые представляют строку и столбец соответственно. Координаты изображения записываются как (u, v), поэтому изображение, представленное матрицей I, индексируется как I(v, u). Часто используются матрицы с тремя и более измерениями: – цветное изображение имеет три измерения: строку, столбец, цветовую плоскость; – последовательность изображений в оттенках серого имеет три измерения: строку, столбец, индекс; – последовательность цветных изображений имеет четыре измерения: строку, столбец, цветовую плоскость, индекс. Общие сокращения 2D – двухмерный. 3D – трехмерный. n-кортеж (n-ка) – группа из n чисел, может представлять точку вектора. Отзывы и пожелания Мы всегда рады отзывам наших читателей. Расскажите нам, что вы ду­маете об этой книге – что понравилось или, может быть, не понравилось. Отзывы важны для нас, чтобы выпускать книги, которые будут для вас максимально полезны. Вы можете написать отзыв на нашем сайте www.dmkpress. com, зайдя­ на страницу книги и оставив комментарий в разделе «Отзывы и рецензии». Также можно послать письмо глав- 28 Специальные обозначения ному редактору по адресу [email protected]; при этом укажите название книги в теме письма. Если вы являетесь экспертом в какой-либо области и заинтересованы в написании новой книги, заполните форму на нашем сайте по адресу http://dmkpress.com/authors/publish_book/ или напишите в издательство по адресу [email protected]. Список опечаток Хотя мы приняли все возможные меры для того, чтобы обеспечить высокое качество наших текстов, ошибки все равно случаются. Если вы найдете ошибку в одной из наших книг, мы будем очень благодарны, если вы сообщите о ней главному редактору по адресу [email protected]. Сделав это, вы избавите других читателей от недопонимания и поможете нам улучшить последующие издания этой книги. Нарушение авторских прав Пиратство в интернете по-прежнему остается насущной проблемой. Издательства «ДМК Пресс» и Manning Publications очень серьезно относятся к вопросам защиты авторских прав и лицензирования. Если вы столкнетесь в интернете с незаконной публикацией какой-либо из наших книг, пожалуйста, пришлите нам ссылку на интернет-ресурс, чтобы мы могли применить санкции. Ссылку на подозрительные материалы можно прислать по адресу элект­ронной почты [email protected]. Мы высоко ценим любую помощь по защите наших авторов, благодаря которой мы можем предоставлять вам качественные материалы. Глава 1 Попробуйте балансировать на одной ноге с закрытыми глазами. Введение На мгновение остановитесь и задумайтесь, насколько замечательна наша способность видеть. Свет, отраженный от объектов окружающего мира, воспринимается нашими глазами и обрабатывается нашим мозгом, который создает модель окружающего мира. Это позволяет нам отвечать на очень важные вопросы: где я? что вокруг меня? что происходит? что может произойти дальше? Наше зрение и наша память тесно связаны. У нас очень яркая и емкая зрительная память – мы можем мысленно перемещаться в ней и видеть картины прошлого, а опыт помогает нам лучше понимать то, что мы видим. Зрение и движения тела также тесно связаны. Мы бессознательно двигаем глазами и телом, чтобы разрешить неопределенность сцены и более точно определить, насколько далеко находятся предметы; мы используем зрение, чтобы направлять руки при манипулировании объектом, и даже помогаем себе поддерживать равновесие. Жизнь существует на Земле несколько миллиардов лет, но способность видеть появилась совсем недавно. Наша планета образовалась около 4.5 млрд лет назад, а простые одноклеточные формы жизни появились, согласно последним данным, лишь 400 млн лет спустя. Они обитали в первобытных океанах в течение следующих 3.5 млрд лет и очень медленно эволюционировали, дав начало новым типам клеток, таким как эукариоты (из которых мы состоим), и новым способностям, таким как фотосинтез, жгутики для передвижения и химические сенсоры для поиска питательных веществ. Химическое восприятие, как и наше чувство вкуса или обоняния, – это самая древняя способность. Но эти организмы не могли видеть. Около 550 млн лет назад генетическая мутация создала чувствительный к свету белок. На планете, залитой естественным светом от Солнца, это изменило правила игры, потому что колебания уровня освещенности являются косвенным показателем структуры и активности в локальной среде обитания организма. В отличие от химических сенсоров, дающих информацию о том, что находится рядом, зрение обеспечивает восприятие на большом расстоянии. Единственный световой сенсор был прорывом, но чем больше, тем лучше – эволюция 30 Глава 1 · Введение усердно развивала это новшество, и очень скоро появились существа с несколькими сенсорами света, организованными таким образом, что они могли создавать изображения окружающего мира. Первыми добились успеха трилобиты с парой сложных глаз (рис. 1.1) – они появились 540 млн лет назад и блуждали по океанам следующие 270 млн лет. А 520 млн лет назад уже существовали организмы с глазами, принципиально не отличающимися от наших. Любопытно, что появление глаз исторически соответствует переломной точке эволюции, когда количество видов на Земле резко возросло всего за 10 млн лет – период, известный как кембрийский взрыв. Хотя мы, возможно, никогда не узнаем причин этих событий, теория «выключателя света» Паркера (2004) утверждает, что появление зрения привело к гонке вооружений между хищниками и добычей, которая значительно ускорила эволюцию. Эта удивительная мутация остается с нами сегодня – в каждой клетке палочек и колбочек глаза – и позволяет нам видеть. Рис. 1.1. Сложные глаза трилобита (Erbernochile erbeni) состоят из сотен линз, образованных из минерала кальцита. Обратите внимание на солнцезащитные козырьки в верхней части глаз для защиты от света, падающего сверху (изображение предоставлено Питером Кэмероном) Эволюция создала разнообразные конструкции и конфигурации зрительного органа; несколько примеров глаз животных показано на рис. 1.2. Мы видим здесь составные глаза мухи, главные и дополнительные глаза паука, рефлекторный глаз морского гребешка и линзовый глаз человека. У позвоночных два глаза, а у беспозвоночных их много. Характеристики глаз животного соответствуют его экологической нише; например, орлы могут видеть мелкие предметы на большом расстоянии, а совы и кошки хорошо видят ночью. Большинство существ может ощущать несколько цветовых каналов: у млекопитающих есть 2 канала, за исключением приматов, включая человека, у которых их 3 (красный, зеленый и синий); у насекомых 3 (зеленый, синий и ультрафиолетовый); у птиц 4 канала, а у креветки-богомола 12 каналов. Глава 1 · Введение 31 a Рис. 1.2. (a) Муха-разбойница, Holocephala fusca. (b) Паук-скакун, Phidippus putnami (снимки предоставлены Томасом Шаханом, thomasshanan.com). (c) Гребешок (снимок предоставил Шонке Джонсен), каждая из маленьких синих сфер представляет собой глаз. (d) Человеческий глаз b с d Биологическая цена зрения высока. Нам нужны не только тонкие и сложные органы чувств, но также и зрительная кора Это самые быстрые для обработки данных – одна треть нашего мозга предназначемышцы в нашем теле. Глаз может на для обработки изображений. Кроме того, у нас есть мышцы поворачиваться для движения глаз , веки для их защиты и слезные протоки со скоростью для поддержания их в чистоте. Однако выгоды от обладания до 600 град/с и ускорением до зрением значительно превосходят затраты на его содержание. 35 000 град/с2. Наш личный опыт показывает, что зрение является очень эффективным способом решения важнейших задач распознавания объектов, навигации, избегания препятствий и манипулирования предметами. Перейдя к другому концу шкалы размера и сложности, мы обнаруживаем, что зрение – хорошее решение и для простых животных. Например, пчелы с мозгом, соРазвитие глаза. Считается, что все глаза животных имеют общего предка в виде протоглаза, который развился 540 млн лет назад. Однако наиболее крупные эволюционные успехи, по-видимому, произошли всего за последние несколько миллионов лет. Самые ранние глаза, называемые глазными пятнами, представляли собой простые участки белка-фоторецептора у одноклеточных животных, которые могли ощущать яркость света, но не его направление. Многоклеточные животные развили несколько глазных пятен, выстилающих небольшую зрительную ямку, что давало ограниченную способность различать направленную яркость в зависимости от того, какие клетки были освещены. Со временем ямка углубилась, отверстие стало меньше, а количество фоторецепторных клеток увеличилось, образуя камеру-обскуру, способную различать формы. Затем последовало разрастание прозрачных клеток для защиты глазного пятна, что привело к заполнению глазной камеры и в конечном итоге – к глазу, который мы знаем сегодня. Линзовый глаз развивался независимо семь раз у разных видов. Природа создала десять совершенно разных конструкций глаз, включая те, что показаны выше. 32 Глава 1 · Введение стоящим всего из 106 нейронов (по сравнению с нашими 1011), способны с по­мощью зрения выполнять сложные и жизненно важные задачи, такие как поиск пищи и доставка ее в улей. Если зрение смогло изменить жизнь на Земле и сделать возможным выполнение почти всех наших задач, то, несомненно, оно является важным источником информации для машины или робота. Современные камеры хорошо имитируют работу глаза, они маленькие и недорогие. На рис. 1.3 показан робот, оснащенный камерами различных типов. Однако мало оснастить роботов камерами. Для создания у роботов компетенций, основанных на зрении – использования цифровых изображений для распознавания объектов и навигации в мире, – нам необходимо извлекать смысл из изображений, создаваемых камерами. Нам нужно эмулировать мыслительную часть биологической системы зрения. Рис. 1.3. Группа камер на мобильном роботе для наружного применения: стереопара переднего обзора, широкоугольная камера бокового обзора, зеркало с панорамной камерой над головой (мобильный робот CSIRO) Обработка изображений компьютерами была впервые исследована в 1960-х гг. и имеет много названий: (цифровая) обработка изображений, компьютерное зрение, распознавание образов, машинное зрение или роботизированное зрение. Хотя эти термины кажутся похожими, между ними есть тонкие различия. Обработка изображений относится к классу алгоритмов, которые берут изображение и выводят другое, часто в некотором отношении улучшенное. Например, происходит удаление шума, улучшение контраста или совмещение одного изобра- Глава 1 · Введение 33 жения с другим. Компьютерное зрение и распознавание образов относятся к алгоритмам, которые интерпретируют или извлекают смысл из изображений. На выходе получается краткая информация, полученная из пикселей изображения: принадлежность лица, количество и типы клеток на изображении под микроскопом, действие, наблюдаемое в сцене. Машинное зрение – это компьютерное зрение, встроенное в машину, которая принимает решение на основе визуальных входных данных, например распознает дефектные продукты на конвейерной ленте и отправляет их в мусорный бак. Важно, чтобы решения принимались своевременно или в режиме реального времени. Следовательно, машинное зрение – это компьютерное зрение с ограничением по времени и подключенное к машине, выполняющей физическое действие. Аспект времени критически важен – нам нужно извлечь смысл из значений интенсивности миллионов пикселей за короткий промежуток времени. Обработка живого видео похожа на питье из пожарного шланга, только вместо воды поток данных от десятков до сотен мегабайт в секунду. Роботизированное зрение – это машинное зрение на стероидах. Мало того, что робот намного сложнее обычной машины, вдобавок мы пытаемся извлечь из видеопотока ответы на гораздо более изощренные вопросы: где я? что вокруг меня? кто этот человек? на что указывает знак? где кофейная чашка? этот пешеход собирается выйти на дорогу? Термин «роботизированное зрение» постепенно становится все более распространенным и отражает современный подход к машинному обучению. С момента зарождения робототехники для получения информации об окружающей среде применялся широкий спектр сенсоров робота. Камеры, несмотря на аналогию с нашими собственными чрезвычайно полезными глазами, не были предпочтительным сенсором: они были громоздкими и дорогими; нам не хватало хороших алгоритмов для извлечения смысла из изображений; а компьютеры были слишком медленными, чтобы своевременно предоставлять результаты. Однако самая серьезная проблема заключалась в том, что изображение с одной камеры не дает явной информации о глубине сцены – мы не можем на самом деле определить, как далеко находится объект, и для робототехники это было большой проблемой. Разумеется, человеческий глаз проецирует трехмерную сцену в двухмерное изображение на поверхности сетчатки – информация теряется. Несмотря на эту потерю, люди очень хорошо понимают трехмерную природу сцены, но роботы в настоящее время не так хорошо развиты. На рис. 1.4 показаны результаты очень ранних исследований по реконструкции трехмерной каркасной модели по одному двухмерному изображению, и вы можете составить некоторое представление о сложности этого процесса. Другим 34 Глава 1 · Введение подходом является стереозрение, при котором информация с двух камер объединяется для оценки трехмерной структуры сцены – этот метод используют как люди, так и роботы; например, марсоход, показанный на рис. 1.11а, имеет стереокамеру, установленную на мачте. a b c d Рис. 1.4. Первые результаты применения компьютерного зрения для оценки формы и положения объектов, полученные доктором Робертсом в лаборатории Линкольна Массачусетского технологического института в 1963 г. (Roberts, 1963): a) оригинальное изображение; b) градиентное изображение; c) связанные характерные точки; d) линии реконструированного рисунка Ограниченные возможности первых систем компьютерного зрения заставили исследователей робототехники искать новые пути, и они исследовали другие способы восприятия. Наиболее популярными были активные сенсоры, которые излучают импульс энергии (ультразвуковой, инфракрасный или микро- Также LiDAR или волновый) и измеряют время, необходимое для отражения им- LADAR можно пульса от внешнего объекта. Хотя скорость света очень высока, рассматривать как RADAR, используюсовременные лазерные дальномеры могут легко и точно из- щий свет, а не мик­ мерять расстояние всего в несколько сантиметров. Измерение роволны. Термин расстояния важно, потому что оно напрямую дает представ- LiDAR поначалу был комбинацией слов ление о трехмерной структуре мира, которую робот может ис- light (свет) и RADAR, пользовать для планирования своих действий. но теперь является Простейшие лазерные дальномеры измеряют расстояние до аббревиатурой термина Light Detecближайшей точки мира по линии распространения лазерных tion And Ranging импульсов (рис. 1.5а). Сканирующие лазерные дальномеры, или (обнаружение обълидары , (рис. 1.5b) используют вращающееся зеркало для из- ектов и измерение дальности при мерения дальности до различных точек вокруг робота – что-то помощи света). вроде маяка – и получают плоское поперечное сечение сцены, как показано на рис. 1.7а . Некоторые лазерные дальномеры Диапазон углов обзора может быть также измеряют отражательную способность (или альбедо) по- разным, но обычно верхности, а также ее дальность. составляет 180°, В 1990-х гг. лазерные дальномеры были дорогими, зато уль- 270° или 360°. тразвуковые дальномеры были доступны и широко использовались. Они до сих пор применяются в недорогих любительских роботах. Для создания поперечного сечения обычно использовалось кольцо ультразвуковых дальномеров, как показано на рис. 1.6а. Для формирования трехмерного изображения облака точек, подобного изображениям, показанным на рис. 1.7b и c, разра- Глава 1 · Введение 35 ботано несколько общих подходов, которые схематично показаны на рис. 1.5b–f. времяизмерительный пиксельный массив e пиксельный массив камеры a b c d f Рис. 1.5. Активные дальномеры: а) отдельный пучок световых импульсов измеряет расстояние до объекта; b) одномерный лидар использует вращающееся зеркало для выполнения нескольких измерений в плоскости; c) двухмерный лидар использует два вращающихся зеркала для проведения множественных измерений по плоскости; d) двухмерный многолучевой лидар использует вращающийся узел, состоящий из зеркала и нескольких дальномеров, для проведения измерений по площади; e) пульсирующий лидар освещает всю сцену импульсами света, и значение каждого пикселя умножается время пролета светового импульса до объекта и обратно; f) структурированный свет, когда на сцену проецируется световой узор, а форма выводится из искажения этого узора a b c d Рис. 1.6. Дальномерные технологии для роботов: a) кольцо ультразвуковых сенсоров (диски из золотистой сетки) на iRobot Magellan Pro; b) одномерный лидар с угловым диапазоном 270° (любезно предоставлено Hokuyo Automatic Co. Ltd.); c) многолучевой лидар Velodyne HDL-64 имеет 64 луча (любезно предоставлено Velodyne LiDAR); d) «CamBoard pico flexx» (любезно предоставлено Pmdtechnologies AG) (1) Двухмерный лидар использует два зеркала для механического перемещения луча лазерного дальномера слева направо и сверху вниз по сцене. (2) Одномерный лидар, установленный на транспортном средстве, выполняет сканирование в плоскости, ортогональной движению транспортного средства. Последний эффективно заменяет одно из сканирующих зеркал в двухмерном лидаре. (3) Многолучевой лидар использует несколько (обычно от 32 до 128) вращающихся лазерных дальномеров для сканирования сцены. (4) Импульсный лидар направляет широкий импульс света на всю сцену и использует камеру со специальным сенсором, где каждый пиксель записывает время, необходимое для возврата отраженной световой энергии. (5) Вместо лидара может применяться структурированное освещение, когда световой узор (обычно в виде сетки) проецируется на мир, 36 Глава 1 · Введение а искажения сетки, наблюдаемые камерой, используются для воссоздания трехмерной структуры. a c b Рис. 1.7. Лазерные карты: a) плоское поперечное сечение внутренней среды от одномерного лидара; b) трехмерное облако точек от многолучевого лидара Velodyne (изображение предоставлено Velodyne LiDAR); c) трехмерное облако точек от одномерного лидара, установленного на движущейся машине (изображение предоставлено Alex Stewart; Stewart 2014); b) и c) иногда называют «2.5-мерным» представлением, поскольку видны только передние поверхности объектов Активные сенсоры предоставляют обширные геометрические данные, но имеют свои ограничения. Во-первых, представление о мире может быть весьма бедным, как показано на рис. 1.7а. Хотя мы можем распознать стену или дверной проем, отличить человека от стула, не говоря уже о том, чтобы распознать личность, практически невозможно. Даже в подробном трехмерном изображении облака точек, подобном рис. 1.7b–с, плотность точек низка, и вся информация о цвете и тонкой текстуре теряется. Во-вторых, оптические лазерные дальномеры Эти устройства имеют ограниченный радиус действия при работе на открытом обычно используют воздухе. Когда луч лазерного излучения попадает на поверх- инфракрасный свет, чаще всего от лазерность, он отражается во многих направлениях, поэтому ин- ного диода с длиной тенсивность отраженного света уменьшается по закону обрат- волны 780 нм. ных квадратов. Излучаемая мощность лазера ограничена для Солнце излучает много инфракрасобеспечения безопасности глаз, поэтому окружающий свет ной энергии, как может подавить слабый отраженный импульс. В-третьих, ла- сказано в главе 3. Глава 1 · Введение 37 зерные дальномеры «видят» прямо сквозь стеклянные стены и витрины, которые широко распространены во многих помещениях, что искажает восприятие мира. То же самое можно сказать и о камерах, но у стеклянных стен есть свои характерные признаки, такие как наклейки для предотвращения столкновений, оконная рама и даже отражения, которые используют люди и могли бы использовать камеры, чтобы сделать вывод о наличии стекла. Камеры являются пассивными сенсорами и имеют дополнительные проблемы по сравнению с активными сенсорами, к которым относятся вышеупомянутые ультразвуковые и оптические радары. Камерам требуется внешний свет, который отражается от сцены. В темное время суток приходится применять искусственное освещение сцены, однако уже доступны камеры, способные вести съемку в ночное время (с эффективным значением ISO 50 000 и более). Современные технологии позволяют эффективно реализовать потенциал камер и зрения для роботов. Камеры CMOS для сотовых телефонов стоят всего несколько долларов за штуку, а наши мобильные и персональные компьютеры имеют огромную вычислительную мощность. Новые алгоритмы, дешевые светочувствительные матрицы и доступные вычислительные мощности сделали зрение очень практичным «органом чувств» для роботов. Я несколько раз упоминал робототехнику, но этот термин означает разные вещи для разных людей, и потому нуждается в пояснениях. Многое из того, что обыватели знают о роботах, взято из научно-фантастических книг и фильмов, которые сильно повлияли на представления людей о том, как роботы выглядят и что они могут делать, – к сожалению, практика робототехники ощутимо отстает от этой заманчивой картины. Одно можно сказать наверняка: робототехника станет важной технологией в этом столетии. Такие продукты, как роботы-пылесосы, существуют уже более десяти лет, и мы всерьез надеемся, что скоро появятся беспилотные автомобили. Это авангард волны умных машин, которые появятся в наших домах и на рабочих местах в ближайшей и средней исторической перспективе. Существует множество определений робота, и не все из них одинаково полезны. Вот определение, которое нам пригодится: Робот – это машина, способная ощущать, планировать и целенаправленно действовать. Робот ощущает свое окружение и использует эту информацию вместе с целью, чтобы спланировать какое-то действие. Действие может заключаться, например, в перемещении инстру- 38 Глава 1 · Введение мента манипулятора робота для захвата объекта или в перемещении самого робота в другое место. В XVIII в. люди Европы были очарованы автоматами, такими как утка Вокансона, показанная слева. Эти машины, сложные по меркам того времени, демонстрировали то, что казалось людям поведением живого существа. В утке был задействован кулачковый механизм для выполнения последовательности движений, и впоследствии Вокансон механизировал с его помощью ткацкие станки для производства шелка. Жаккард развил его идеи и разработал ткацкий станок, в котором узор ткани был закодирован как серия отверстий на перфокартах. У этого ткацкого станка было много признаков современного робота – он выполнял физическую задачу и был перепрограммируемым. Роботы в популярной культуре. Термин «робот» впервые появился в 1920 г. в чешской научно-фантастической пьесе «Универсальные роботы Россума» Карела Чапека. Этот термин был придуман его братом Йозефом и на чешском языке означает крепостной труд, но в просторечии – тяжелую работу. Роботы в пьесе были искусственными людьми (андроидами), и, как и во многих других последующих историях, они восстают, и это плохо кончается для человечества. Серия книг Айзека Азимова о роботах, состоящая из множества книг и рассказов, написанных между 1950 и 1985 гг., исследует морально-этические вопросы взаимодействия человека и робота. Роботы в этих историях оснащены «позитронными мозгами», в которых закодированы «три закона робототехники». Эти истории повлияли на последующие книги и фильмы, которые, в свою очередь, сформировали общественное представление о том, что такое роботы. Восприятие (sensing) имеет решающее значение для роботов. Проприоцептивные сенсоры измеряют состояние самого робота: угол изгиба сочленений руки, количество оборотов колеса мобильного робота или ток, потребляемый электродвигателем. Экстероцептивные сенсоры измеряют состояние внешнего мира по отношению к роботу. Сенсор может быть простейшим датчиком удара на роботе-пылесосе для обнаружения столкновения. Это может быть GPS-приемник, измеряющий расстояние до орбитальной группировки спутников, или компас, Глава 1 · Введение 39 Unimation Inc. (1956–1982) была первой компанией по производству промышленных роботов. Ее основал в 1956 г. Джордж Девол – младший и Джозеф Энгельбергер в Данбери, штат Коннектикут. Их первый робот начал работать в 1961 г. на линии по литью под давлением на заводе General Motors в НьюДжерси. С тех пор роботизированная автоматизация производства получила широкое распространение, и многие миллионы роботов манипуляторного типа, наподобие показанного на рис. 1.8, были задействованы для выполнения таких задач, как сварка, покраска, загрузка и разгрузка машин, сборка электроники, упаковка изделий и укладка коробок на поддоны. Использование роботов привело к повышению производительности и улучшению качества продукции. Сегодня многие продукты, которые мы покупаем, были собраны или обработаны роботом. Девол (1912–2011) был плодовитым американским изобретателем, родившимся в Луисвилле, Кентукки. В 1954 г. он подал заявку на патент США № 2988237 на систему запрограммированного перемещения предметов, в которой была представлена концепция универсальной автоматизации или «унификации». В частности, в ней описывался роботизированный манипулятор с захватом и программируемым контроллером – предшественник всех современных роботов. Энгельбергер (1925–2015) был американским инженером, предпринимателем и неутомимым пропагандистом робототехники, которого часто называют «отцом современной робототехники». В 1966 г. он появился в «Вечернем шоу» Джонни Карсона с роботом Unimate, который наливал пиво, клал мяч для гольфа и дирижировал музыкальной группой. Каждый год Ассоциация робототехники вручает награду в его честь «лицам, внесшим выдающийся вклад в развитие науки и практики робототехники». измеряющий направление вектора магнитного поля Земли относительно робота. Это также может быть активный сенсордальномер, о котором мы говорили выше, или камера. Книга посвящена извлечению из изображений с камер информации, которая может быть полезна роботам. Например, определение координаты круглого красного объекта на сцене или того, как далеко сдвинулся робот, исходя из визуально воспринимаемого смещения мира относительно робота. Мы можем классифицировать роботов по их возможностям и роли. Производственные роботы работают на фабриках и являются технологическими потомками роботов Unimation первого поколения. Производственный робот обычно представляет собой манипулятор наподобие механической руки на фиксированном основании, изображенной на рис. 1.8а, который выполняет по- 40 Глава 1 · Введение вторяющиеся задачи в локальной рабочей ячейке. Детали подаются роботу строго упорядоченно, что позволяет максимально использовать преимущество высокой скорости и точности робота. Эти роботы быстро работают, неспособны чувствовать людей и обычно размещаются за защитным барьером. Напротив, робот Baxter, показанный на рис. 1.8b, безопасен для человека – он работает на низкой скорости и останавливается, если сталкивается с препятствием. Мобильные роботы (рис. 1.9) могут перемещаться по миру с по­ мощью колес, ног, пропеллеров или крыльев. Сервисные роботы (рис. 1.10) предоставляют людям такие услуги, как уборка, уход, лечение и реабилитация или доставка и переноска предметов, как показано на рис. 1.10b. Многие сервисные роботы также мобильны. Человекоподобные роботы, как, например, на рис. 1.10c, имеют физическую форму человека – это и мобильные, и сервисные роботы . Полевые роботы (рис. 1.11) работают на открытом воздухе, выполняя такие задачи, как помощь в сельском хозяйстве, добыча полезных ископаемых, строительство, лесное хозяйство и мониторинг окружающей среды. Полевые и сервисные роботы должны работать и перемещаться в сложной, загроможденной и меняющейся среде, а сервисные роботы – безопасно работать рядом с людьми. Телероботы – это роботоподобные машины, которыми дистанционно управляет человек-оператор. Примерами могут служить современные хирургические роботы для дистанционных операций и подводные роботы. Возможны и гибриды. Например, марсоход может автономно перемещаться по поверхности Марса, но операторы-люди обеспечивают выполнение задач высокого уровня. Учитывая большую задержку канала связи, без принятия решений на местном уровне на Марсе не обойтись. Умная система круиз-контроля регулирует скорость автомобиля, в то время как человек-водитель безопасно удерживает автомобиль на полосе движения. a b На практике категоризация роботов применяется не очень строго, и в ней полно неоднозначностей. Рис. 1.8. Производственные роботы – технологические потомки Unimate: a) современный шестиосевой робот, разработанный для обеспечения высокой точности и производительности (изображение предоставлено компанией ABB robotics); b) двурукий робот Baxter со встроенным зрением и программируемый путем демонстрации действий оператором, предназначенный для выполнения штучных работ средней производительности (изображение предоставлено Rethink Robotics) Глава 1 · Введение 41 Рис. 1.9. Мобильные роботы: a) вертолет Yamaha RMAX с диаметром лопастей 3 м (фото Санджива Сингха); b) роботизированный летательный аппарат с неподвижным крылом (фото ScanEagle предоставлено Insitu); c) DEPTHX – Deep Phreatic Thermal Explorer – подводный робот с 6 двигателями (Stone Aerospace/CMU 2007; фото Дэвида Веттергрина, ©Университет Карнеги–Меллона); d) автономный надводный аппарат (фото Мэтью Данбэбин); e) беспилотный автомобиль (изображение предоставлено кафедрой информационной инженерии Оксфордского университета); f) робот, способный бегать (изображение предоставлено Boston Dynamics) Рис. 1.10. Сервисные роботы: a) роботпылесос Roomba, 2008 г. (фото предоставлено iRobot Corporation); b) Робот-доставщик Savioke Relay (изображение предоставлено Savioke); c) гуманоидный робот Honda Asimo (изображение предоставлено Honda Motor Co. Japan); d) хирургический робот, несколько инструментов проходят через один небольшой разрез (изображение ® 2015 Intuitive Surgical, Inc.) a b с d e f a с b d 42 Глава 1 · Введение a b с d Рис. 1.11. Полевые роботы: a) марсоход Exploration, Марсианская научная лаборатория (MSL), известный как Curiosity, проходит испытания (фото любезно предоставлено НАСА / Фрэнки Мартин); b) логистика – автоматизированный портальный перевозчик, который перемещает контейнеры, порт Брисбена, 2006 г. (фото предоставлено Port of Brisbane Pty Ltd); c) горное дело – автономный самосвал (© 2015 Rio Tinto); d) сельское хозяйство – робот для прополки больших площадей (изображение предоставлено Оуэном Боуденом) Почему мы не используем GPS в каждом роботе? GPS – отличный сенсор, но он просто сообщает, где находится GPS-при­ем­ник, – не более того. Он не может помочь роботу поднять кофейную чашку, если у кофейной чашки также нет GPS-приемника и радиосвязи, чтобы сообщить роботу о своем местоположении. GPS больше подходит для мобильных роботов, но использование только GPS аналогично вождению автомобиля без окон, когда вы смотрите исключительно на экран навигационной системы. Кроме того, вы должны предполагать, что GPS точен (это не всегда так), что карта полностью обновлена (маловероятно) и что дорога хорошего качества и без препятствий (очень смелое предположение). Вы потерпите неудачу, если на дороге встретятся другие автомобили, пешеходы, светофоры или дорожные работы. GPS также дает сбои в туннелях, плотной городской застройке и под густыми кронами деревьев. Чтобы иметь дело с реальным миром, лучшая стратегия – смотреть вовне, т. е. ощущать мир таким, какой он есть на самом деле, и соответствующим образом планировать свои действия. Люди легко это делают, не напрягая сознание, но пока еще очень сложно добиться того же от машины – в этом и заключается главная задача роботизированного зрения. 1.1 О книге Эта книга посвящена роботизированному зрению – методам компьютерного зрения, которые можно использовать в робототехнике. Это большая тема, и охват обязательно должен быть широким. Цель состоит не в том, чтобы поверхностно коснуться каждой темы, а в том, чтобы дать вам представление о том, что такое робототехника и зрение и на что они способны, – считайте это грандиозным меню на дегустации обширного перечня блюд. О книге 43 Цели книги: сформировать широкую и прочную основу для понимания с по­мощью теории и примеров; сделать абстрактные понятия осязаемыми; научить читателя решать более сложные задачи в других специализированных учебниках благодаря мощным вычислительным инструментам и лежащему в их основе программному обеспечению; предоставлять моментальную отдачу, решая сложные задачи с относительно небольшим количеством кода; дополнить множество отличных публикаций по робототехнике и компьютерному зрению; развивать интуицию посредством вычислительных экспериментов; ограничить количество математических формул только теми случаями, когда они действительно нужны для понимания. Подход, который я использовал в этой книге, заключается в объединении предыстории, теории и примеров. Код и примеры являются важнейшими элементами этой книги и не помещаются в конец главы или на веб-сайт издателя, а включены непосредственно в текст. Примеры кода, включенные в обсуждение, выглядят так: >> cam.fov() * 180/pi ans = 46.2127 37.6930 где код MATLAB дополняет обсуждаемую тему и обычно приводит к четкому числовому ответу, изображению или графику, который затем обсуждается. Примеры иллюстрируют использование соответствующих наборов инструментов, и эти знания можно затем применить к другим задачам. Большинство рисунков в этой книге были сгенерированы из предоставленных примеров кода, и они доступны на веб-сайте книги, как описано в приложении A. 1.1.1 рограммное обеспечение MATLAB и наборы П инструментов Хорошая работа начинается с хороших инструментов. Китайская пословица Все вычисления в этой книге основаны на пакете программного обеспечения MATLAB, разработанном The MathWorks Inc. MAT- 44 Глава 1 · Введение LAB – это интерактивная среда математического программирования, которая упрощает использование линейной алгебры, Это один из 20 наианализ данных и построение высококачественных графиков. более распростраMATLAB – это популярный пакет, который, скорее всего, знаком ненных языков как студентам инженерных специальностей, так и исследовате- программирования, он широко испольлям. У него также есть собственный язык программирования . зуется во многих Сильной стороной MATLAB является поддержка наборов ин- научных дисциплиструментов, представляющих собой наборы функций, ориенти- нах и отраслях, что позволяет создавать рованных на определенные темы. Пользователям доступны ты- сложные алгоритмы. сячи наборов инструментов от MathWorks, сторонних компаний и частных лиц. Некоторые наборы инструментов являются коммерческими продуктами, в то время как другие имеют открытый исходный код и, как правило, бесплатны для использования. Эта книга основана на двух наборах инструментов для MATLAB с открытым исходным кодом, написанных автором: Machine Vision Toolbox (набор инструментов машинного зрения) и Robotics Toolbox (набор инструментов для робототехники). Далее в книге для краткости они называются просто Toolbox. Эти наборы инструментов вместе с MATLAB превращают ваш компьютер в мощную и удобную среду для исследования сложных проблем роботизированного зрения и робототехники. Наборы инструментов бесплатны для использования и распространяются под лицензией GNU Lesser General Public License (GNU LGPL). Machine Vision Toolbox (MVTB) предоставляет богатый набор функций для моделирования камер, обработки изображений, извлечения признаков изображения, многоракурсной геомет­ рии и управления на основе машинного зрения. MVTB также содержит функции для получения и отображения изображений, фильтрации, выделения пятен, точек и линий, математической морфологии, деформации изображения, стереозрения, гомографии и вычисления фундаментальной матрицы, робастной оценки, регулировки пучка, визуальных якобианов, геометрического моделирования камеры, калибровки камеры и операций с цветовым пространством. Если изображения небольшого размера, то скорости обработки на современном компьютере может быть достаточно для работы в псевдореальном времени, чтобы обеспечить управление с обратной связью. Мы также будем использовать Robotics Toolbox (RTB), который включает в себя функции для манипулирования данными и преобразования между типами данных, такими как векторы, однородные преобразования, трехмерные представления, повороты и единичные кватернионы, которые необходимы для представления трехмерного положения и ориентации. Он также предоставляет широкий набор функций, не описанных в этой книге, для моделирования мобильных и манипуляторных роботов, а также стандартные алгоритмы для планирования пути робота, локализации, создания карт и SLAM. О книге 45 Если вы только начинаете заниматься робототехникой или машинным зрением, наборы инструментов – это важная исходная база кода, на основе которой вы будете строить свой проект. Наборы инструментов предоставляются в виде исходного кода. Основная часть кода написана на М-языке MATLAB. В целом код инструментов написан как можно проще для облегчения понимания, возможно, в ущерб вычислительной эффективности. Приложение A содержит подробные сведения о том, как получить наборы инструментов, а также ссылки на онлайн-ресурсы, включая дискуссионные группы. В этой книге приводятся примеры использования многих функций Toolbox в контексте решения конкретных задач, но она не является справочным руководством. Полная документация по всем функциям Toolbox доступна через встроенный справочный механизм MATLAB или в руководстве в формате PDF, которое распространяется с каждым пакетом Toolbox. 1.1.2 У словные обозначения, соглашения и структура книги Математические обозначения, используемые в книге, сведены в таблицу, размещенную во введении. Поскольку охват книги широк, удобных символов не хватает, и некоторые символы неизбежно обозначают разные понятия в разных частях книги. В книге много кода MATLAB, и он обозначен синим шрифтом фиксированной ширины, например >> 21 * 2 ans = 42 Командная строка MATLAB – это символы >>, а за ними следует команда пользователя, которую должен выполнить MATLAB. Последующие строки без ввода пользователя являются ответом MATLAB. Все функции, классы и методы, упомянутые в текс­те или в сегментах кода, снабжены перекрестными ссылками и имеют собственные указатели в конце книги, позволяющие найти различные способы использования конкретных функций. Вставки в текст на цветном фоне используются для обозначения различных типов материала вне основного потока. Светлозеленые информационные блоки выделяют особенно важный материал, а темно-зеленые предупреждающие блоки выделяют моменты, которые часто являются ловушками для начинающих. Блоки на голубом фоне содержат техническую, историческую или биографическую информацию, дополняющую основной текст, но не являющуюся критической для его понимания. 46 Глава 1 · Введение Автору пришлось преодолевать противоречия между полнотой, ясностью и краткостью. По этой причине многие детали были помещены в примечания и блоки на голубом фоне, и при первом чтении их можно пропустить. В конце некоторых глав есть раздел «Дополнительные материалы», который также можно пропустить при первом чтении. Однако если вы пытаетесь понять конкретный алгоритм и применить его к своей собственной задаче, то понимание деталей и нюансов может быть важным, и не стоит игнорировать примечания и дополнения. Каждая глава заканчивается разделом «Подведение итогов», в котором обобщаются важные уроки из главы, обсуждаются рекомендации для дальнейшего чтения и предлагаются упражнения. Для ясности ссылки в тексте каждой главы приводятся скупо. В разделе «Дополнительная литература» перечислены предшествующие работы и ссылки, которые обеспечивают более точное или более полное описание алгоритмов. Ресурсы содержат ссылки на соответствующий онлайн-код и наборы данных. MATLAB Notes предоставляет дополнительные сведения о наборах инструментов автора и инструментах MathWorks с аналогичной функциональностью. Упражнения укрепляют понимание материала главы и обычно связаны с конкретными примерами кода, обсуждаемыми в главе. Упражнения различаются по сложности: от простого дополнения примеров кода до более сложных задач. 1.1.3 Целевая аудитория Книга предназначена в первую очередь для студентов третьего или четвертого курсов инженерного бакалавриата, магистрантов и аспирантов. Студентам бакалавриата книга будет служить вспомогательным пособием по курсу робототехнического или компьютерного зрения или для поддержки крупного проекта в области робототехники или машинного зрения. Учащиеся должны изучить часть I и приложения для усвоения основных понятий, а затем соответствующую часть книги: машинное зрение или визуальную геометрию. Пакеты Toolbox предоставляют надежный набор инструментов для различных целей, а упражнения в конце каждой главы предлагают дополнительные задачи помимо детальных примеров. Студентам, поступающим в аспирантуру и ранее изучавшим инженерное дело или компьютерные науки, книга поможет заполнить пробелы между тем, что вы узнали в бакалавриате, и тем, что потребуется для более глубокого изучения роботизированного зрения. Примеры кода в книге помогут ускорить ваши исследования, позволяя быстрее приступить к работе и продуктивно трудиться над своими проблемами и идеями. О книге 47 Поскольку исходный код свободно доступен, вы можете изменить его в соответствии с вашими потребностями, а когда придет время (как это обычно бывает) реализовать ваши алгоритмы на каком-либо другом языке программирования, тогда можно использовать Toolbox для перекрестной проверки вашей реализации. Для тех, кто уже не является студентом, – исследователей или практикующих специалистов, – книга послужит полезным дополнением к литературе по широкому кругу тем роботизированного зрения, а также справочником и руководством по пакетам Toolbox. Книга предполагает знание линейной алгебры (матрицы, векторы, собственные значения), базовой теории групп и теории графов на уровне бакалавра. Некоторые из этих тем, вероятно, будут лучше знакомы студентам инженерных специальностей, чем студентам, изучающим информатику. Книга также предполагает, что читатель знаком с моделированием и программированием в MATLAB, а также с методами объектно ориентированного программирования (возможно, C++, Java или Python). Ресурсы для изучения MATLAB доступны по адресу https:// matlabacademy.mathworks.com. Некоторые из них бесплатны и открыты, а для других требуется лицензия MATLAB. 1.1.4 Обучение с по­мощью книги Лучший способ учиться – это делать. Хотя в книге показаны коман­ды и ответы MATLAB, ничто не заменит самостоятельную работу. Воспринимайте книгу как приглашение поработать. Выполняя команды самостоятельно, вы можете просматривать результаты так, как вам удобно, отображать их по-другому или опробовать алгоритм на других данных или с другими параметрами. Книга специально разработана так, чтобы дать вам возможность вводить команды во время чтения. Вы также можете просмотреть онлайн-документацию по функциям Toolbox, открыть для себя дополнительные функции и параметры и поэкспериментировать с ними или прочитать код, чтобы увидеть, как он работает на самом деле, и, возможно, изменить его. Большинство команд довольно короткие, поэтому не составит труда ввести их в MATLAB. Однако веб-сайт книги (приложение A) предоставляет доступ ко всем командам MATLAB, показанным здесь (более 700 коротких примеров). Они даются в формате интерактивной записной книжки (MATLAB LiveScripts), по одной на главу. Вы можете запускать их напрямую, изменять или копировать и вставлять код в свои собственные сценарии. 48 Глава 1 · Введение Robot Academy – это бесплатный и открытый учебный ресурс, который содержит сотни коротких видеоуроков по многим темам этой книги, а также простые онлайн-викторины. Его можно найти на http://robotacademy.net.au. 1.1.5 Преподавание с по­мощью книги Книгу можно использовать как методическое пособие для курсов по роботизированному зрению, компьютерному зрению и мехатронике. Все курсы должны содержать введение в системы координат и их состав, о чем пойдет речь в главе 2. Для курса обработки изображений достаточно преподавать только двухмерный случай. Для визуальной геометрии следует преподавать двухмерные и трехмерные случаи. Большинство рисунков (все сгенерированные MATLAB и линейные чертежи) в этой книге доступны в виде файлов в формате PDF с веб-сайта книги, и вы можете свободно использовать их с указанием авторства в любом учебном материале. Весь код в этой книге можно загрузить с веб-сайта издательства и использовать в качестве основы для демонстрации на лекциях или в учебных пособиях. Подробности приведены в приложении А. Упражнения в конце каждой главы можно использовать в качестве основы для экзаменационных заданий, в качестве примеров для работы в классе или при разработке учебных пособий. Некоторые вопросы специально рассчитаны на открытую дискуссию, чтобы стимулировать исследование влияния параметров и поиск пределов производительности алгоритмов. Это исследование должно сопровождаться дискуссиями о показателях эффективности и о том, какие из них наиболее информативны. Истинное понимание алгоритмов включает оценку не только влияния параметров, но и того, как и при каких обстоятельствах алгоритмы терпят неудачу. Подход к обучению также может быть обратным: с головой погрузиться в конкретную задачу, а затем разобрать соответствующий базовый материал. Подходящие задачи можно выбрать из раздела «Применение» главы 7 или из любого из упражнений. Особо сложные упражнения снабжены пометкой. Если вы хотите использовать обратный подход к обучению, то ряд задач можете найти в вышеупомянутой Robot Academy. Студенты будут смотреть видео и готовиться вне аудитории, а вы можете использовать время в классе для работы над наборами задач. Статьи и учебники, упомянутые в разделе «Дополнительная литература», могут стать основой списка для дополнительного чтения. Они также могут пригодиться при проведении исследований и подготовке научных публикаций. О книге 49 1.1.6 Структура книги Я обещал книгу с моментальной отдачей, но, прежде чем мы сможем приступить к изучению роботизированного зрения, необходимо очень хорошо разобраться с фундаментальными понятиями. Часть I знакомит читателей с понятиями положений (поз, pose) и систем координат – как мы представляем положение и ориентацию робота, камеры или объектов, с которыми робот должен работать. Мы обсудим, как движение между двумя положениями можно разложить на последовательность элементарных перемещений и вращений и как из элементарных движений можно составить более сложные движения. В главе 2 обсуждается компьютерное представление положений. Оставив позади эти формальности, мы переходим к главному – роботизированному зрению. Это обширная область, которая включает в себя основные операции обработки изображений, классификацию и описание различных типов объектов в сцене и создание трехмерной модели, соответствующей сцене. Часть II посвящена машинному зрению – разновидности компьютерного зрения, которую мы рассматриваем здесь как извлечение числовых характеристик из изображений, получаемых роботом. Глава 3 начинается с изучения основ света, освещения и цвета. В главе 4 обсуждается обработка изображений, которая представляет собой обработку двухмерных сигналов с целью преобразования одно изображения в другое. Глава начинается с получения изображений реального мира, а затем охватывает различные арифметические и логические операции, которые можно выполнять с такими изображениями. Затем вводится понятие пространственных операторов, таких как свертка, сегментация, морфологическая фильтрация и, наконец, изменение формы и размера изображения. Эти операции лежат в основе главы 5, которая описывает извлечение числовых признаков из изображений. Признаки описывают однородные области (блобы), линии или отдельные точки на сцене и служат основой для управления роботом с по­мощью зрения. Часть III знакомит с геометрическим принципам формирования изображения. Глава 6 посвящена пониманию связи между трехмерным миром и двухмерным изображением. Мы начинаем с обычных камер с линзами (таких как наш глаз) и расширяем их, чтобы охватить изображения без перспективы, получаемые с использованием широкоугольных линз и систем зеркал, массивов камер и камер светового поля. По мере движения камеры изображение меняется, и в главе 7 рассказано, как использовать эти изменения для оценки 3D-мира по нескольким 2D-изображениям. Два вида одной и той же сцены связаны математическими понятиями, такими как эпиполярная геометрия, фундаментальная, существенная и гомогра- 50 Глава 1 · Введение фическая матрица. Увеличение количества видов может быть связано с такими методами, как пакетная корректировка и извлечение структуры из движения. Мы также обсудим классические методы 3D-реконструкции, такие как структурированное освещение, и практические приложения, включая коррекцию перспективы, поиск изображений и визуальную одометрию. Это большая книга, но любую из частей можно читать отдельно, периодически обращаясь к рассмотренным ранее понятиям. По-настоящему обязательной для чтения в этой книге является только глава 2. Части II или III могут быть использованы соответственно для преподавания вводного или продвинутого курса роботизированного зрения. Альтернативный подход, основанный на теме мгновенной отдачи, состоит в том, чтобы сразу же перейти к любой главе и начать изучение, заглядывая в предыдущие главы по мере необходимости. Дополнительное чтение Биология зрения увлекательна, и хорошие сведения о зрении, глазах и мозге можно найти в книгах Ингса (Ings, 2008), Стоуна (Stone, 2012) и Грегори (Gregory, 1997). Разнообразие глаз животных и экологические факторы зрения рассмотрены в книге Лэнда и Ниссома (Land and Nilsson, 2002). Зрение насекомых хорошо описано Шринивасаном и Венкатешем (Srinivasan and Venkatesh, 1997). Роль «выключателя света» в теории эволюции описана Паркером (Parker, 2004). Всесторонний анализ компьютерного зрения представлен в книге Шелиски (Szeliski, 2011), а хорошим и детальным введением в классический искусственный интеллект является работа Рассела и Норвига (Russell and Norvig, 2009). Часть I Основы Глава 2 Представление позиции и ориентации Глава 2 Представление позиции и ориентации Числа являются важнейшей частью математики. Мы используем числа для счета: есть два яблока. Мы используем именованные числа – число плюс единица измерения, – чтобы указать расстояние: объект находится на расстоянии 2 м. Мы также называем это единственное число скаляром. Мы используем вектор – именованное число плюс направление, – чтобы указать местоположение: объект находится в 2 м строго на север. Мы также можем указать ориентацию объекта: объект находится в 2 м строго на север и обращен на запад. Сочетание позиции и ориентации мы называем положением (pose). Из математики вы знакомы с понятием точки в пространстве – ее можно описать координатным вектором, как показано на рис. 2.1а. Вектор представляет собой смещение точки относительно некоторой системы отсчета – мы называем его связанным вектором, поскольку он не может свободно перемещаться. Система координат, точнее декартова система координат, представляет собой набор ортогональных осей, пересекающихся в одной точке, которая называется началом координат. Вектор можно описать через его компоненты, линейную комбинацию единичных векторов, которые параллельны осям системы координат. Обратите внимание, что точки и векторы – это разные типы математических объектов, хотя каждый из них может Рис. 2.1. (a) Точка P описывается координатным вектором относительно абсолютной системы координат; (b) точки описываются относительно системы координат объекта {B}, которая, в свою очередь, описывается относительной позицией ξB. Оси координат обозначены толстыми линиями с незамкнутой стрелкой, векторы тонкими линиями со стреловидным наконечником, а положение толстой линией со сплошным наконечником ось точка координатный вектор начало координат ось 54 Глава 2 · Представление позиции и ориентации быть описан набором чисел. Мы можем складывать векторы, но сложение точек не имеет математического смысла. Зато разность двух точек – это вектор, и мы можем прибавить вектор к точке, чтобы получить другую точку. Точка – интересная математическая абстракция, но реальный объект состоит из бесконечного множества точек. Объект, в отличие от точки, также имеет ориентацию. Если мы привяжем систему координат к объекту, как показано на рис. 2.1b, то смоПредположим, что жем описать каждую точку внутри объекта как постоянный век- объект является тор относительно этой системы координат . Теперь мы можем твердым, т. е. его описать позицию и ориентацию – т. е. положение – этой системы точки не перемещаются друг относикоординат по отношению к базовой системе. Чтобы различать тельно друга. разные системы, их обозначают буквами. В нашем случае система координат объекта обозначена буквой {B}, а ее оси тогда будут xB и yB, где нижний индекс соответствует системе координат. Чтобы полностью описать положение твердого объекта в трехмерном мире, нам нужно на самом деле не три измерения, а целых шесть: три для описания его позиции и три – для ориентации. Эти измерения ведут себя совершенно по-разному. Если мы увеличим значение одного из измерений позиции, объект сместится по прямой линии, но при увеличении одного из измерений ориентации объект начнет вращаться и вскоре вернется к своей первоначальной ориентации – это измерение не прямолинейное. Очевидно, что нам нужно обращаться с измерениями положения и ориентации совершенно по-разному. Положение системы координат обозначается символом ξ (произносится «кси»). На рис. 2.2 показаны две системы {A} и {B}, а также относительное положение AξB, которое описывает {B} относительно {A}. Начальный верхний индекс обозначает опорную систему координат, а нижний индекс – описываемую систему координат. Мы можем также рассматривать AξB как описание какого-то движения – представьте, что вы берете {A} и применяете смещение и поворот, чтобы она преобразовалась в {B}. Если начальный верхний индекс отсутствует, мы предполагаем, что изменение положения происходит относительно мировой системы координат, которая обычно обозначается {O}. Рис. 2.2. Точка P может быть описана координатными векторами относительно системы координат {A} или {B}. Положение {B} относительно {A} равно AξB Глава 2 · Представление позиции и ориентации 55 Точка P на рис. 2.2 может быть описана относительно любой системы координат векторами Ap или Bp соответственно. Формально они связаны так: p = AξB • Bp, A (2.1) где правая часть выражает движение от {A} к {B}, а затем к P. Оператор • (точка) преобразует вектор, в результате чего получается новый вектор, описывающий ту же точку, но относительно другой системы координат. В композиции относительного положения мы можем проверить правильность наших систем отсчета, убедившись, что нижний и верхний индекс на каждой стороне оператора ⊕ совпадают. Затем мы можем отменить промежуточные нижние и верхние индексы ξZ = XξY ⊕ YξZ , X оставляя только выделенные крайние нижние и верхние ин­дексы. Евклид Александрийский (ок. 325 г. до н. э. – 265 г. до н. э.) – греческий математик, который родился и жил в Александрии (Египет) и считается «отцом геометрии». Его великий труд «Начала», состоящий из 13 книг, собрал и систематизировал многие ранние знания о геометрии и числах. Он выводит свойства плоских и объемных геометрических фигур из набора 5 аксиом и 5 постулатов. «Начала» – это, пожалуй, самая успешная книга в истории математики. Она описывает планимет­рию, и с ее постулатов начинается знакомство большинства людей с геометрией и формальными доказательствами, а также является основой того, что мы сейчас называем евклидовой геометрией. Евклидово расстояние – это просто расстояние между двумя точками на плоскости. Евклид также написал «Оптику», которая описывает геометрию зрения и перспективу. Важной характеристикой относительных положений является то, что они могут быть составными. Рассмотрим случай, показанный на рис. 2.3. Если одна система координат может быть описана через другую с по­мощью относительного положения, то они могут применяться последовательно: A ξC = AξB ⊕ BξC, т. е. положение {C} относительно {A} можно получить путем соединения положений {A} относительно {B} и {B} относительно {C}. Мы используем оператор ⊕ для обозначения композиции относительных положений. 56 Глава 2 · Представление позиции и ориентации В этом случае точка P (рис. 2.3) может быть описана следующим образом: p = (AξB ⊕ BξC) • Cp. A Позже в этой главе мы преобразуем эти абстрактные понятия ξ, • и ⊕ в стандартные математические объекты и операторы, которые можно реализовать в MATLAB. До сих пор в примерах мы показывали двухмерные системы координат. Они подходят для большого класса задач робототехники, особенно для мобильных роботов, действующих в плоском мире. Для других задач нам требуются трехмерные системы координат, позволяющие описывать объекты в нашем трехмерном мире. Например, это может быть положение летающего или подводного робота или наконечника инструмента, переносимого манипулятором. Рис. 2.3. Точка P может быть описана координатными векторами относительно любой системы координат {A}, {B} или {C}. Системы координат описываются относительными положениями Евклидова геометрия против декартовой. Евклидова геометрия связана с точками и прямыми на евклидовой плоскости (2D) или в евклидовом пространстве (3D). Она полностью основана на наборе аксиом и не использует арифметику. Декарт добавил систему координат (2D или 3D) и смог описать точки, прямые и различные кривые с по­мощью алгебраических уравнений. Изучение таких уравнений называется аналитической геометрией и лежит в основе всей современной геометрии. Декартова плоскость (или пространство) представляет собой евклидову плоскость (или пространство) со всеми ее аксиомами и постулатами плюс дополнительные возможности, предоставляемые системой координат. Термин «евклидова геометрия» часто используется для обоЕвклидова Декартова значения того, что выполняется пятый постулат Евклида (параллельные прямые никогда не пересекаются), что справедливо для плоской поверхности, но не работает на искривленной. Глава 2 · Представление позиции и ориентации 57 Рене Декарт (1596–1650) был французским философом, математиком и по совместительству наемником. Он известен своим философским утверждением «Cogito, ergo sum», или «Я мыслю, следовательно, я существую». Он был болезненным ребенком и на всю жизнь выработал привычку лежать в постели и думать до позднего утра. Легенда гласит, что в одно такое утро он наблюдал за мухой, прогуливающейся по потолку, и понял, что может описать ее положение с точки зрения расстояния от двух краев потолка. Эта догадка легла в основу декартовой системы координат и современной (аналитической) геометрии, которые он описал в своей книге 1637 г. «Геометрия». Впервые математика и геометрия слились воедино, и на этом фундаменте Ньютон и Лейбниц построили современный математический анализ. В Швеции по приглашению королевы Кристины Декарт был вынужден вставать в 5 утра, нарушив жизненную привычку, – вероятно оттого он вскоре заболел воспалением легких и умер. Позже его останки были перевезены в Париж и в настоящее время утеряны, за исключением его черепа, который находится в Музее человека. После его смерти Римско-католическая церковь поместила его произведения в Индекс запрещенных книг. На рис. 2.4 показан более сложный трехмерный пример, где мы привязали трехмерные системы координат к различным объектам и указали некоторые относительные положения. Неподвижная камера наблюдает за объектом со своей фиксированной точки зрения и оценивает положение объекта FξB относительно себя. Другая камера не фиксирована, она прикреплена к роботу в некотором постоянном относительном положении и оценивает положение объекта CξB относительно себя. Вполне возможно, Альтернативным представлением пространственных отночто граф положе- шений является ориентированный граф (приложение G), поканий может быть несогласованным, занный на рис. 2.5 . Каждый узел в графе представляет полот. е. два пути через жение, а каждое ребро – относительное положение. Стрелка от граф дают разные X к Y обозначается Xξ и описывает положение Y относительно Y результаты. В робототехнике эти X. Помня, что мы можем составлять относительные положения положения всегда с по­мощью оператора ⊕, можно записать некоторые пространполучаются только ственные отношения в виде уравнений: из зашумленных данных сенсоров. ξF ⊕ FξB = ξR ⊕ RξC ⊕ CξB ξF ⊕ FξR = ξR, и каждое уравнение представляет собой петлю на графе, где каждая сторона уравнения начинается и заканчивается в одном и том же узле. Каждая сторона первого уравнения представляет путь через сеть от {0} до {B} – последовательность ребер (стрелок), записанных по порядку. 58 Глава 2 · Представление позиции и ориентации фиксированная камера объект камера на роботе робот мировая система координат Рис. 2.4. Несколько трехмерных систем координат и относительных положений Рис. 2.5. Пространственный пример рис. 2.4, представленный в виде ориентированного графа Очень полезным свойством положений является возможность выполнять алгебраические действия. Уравнение второй петли графа говорит о том, что положение робота аналогично композиции двух относительных положений: от мировой системы отсчета до неподвижной камеры и от неподвижной камеры до робота. Мы можем вычесть ξF из обеих частей уравне- Здесь важен и мы ния , просто прибавив инверсию ξF, которую мы обозначаем порядок, добавляем ⊖ξF как ⊖ξF, и получим: слева в каждой части уравнения. ⊖ξF ⊕ ξF ⊕ FξR = ⊖ξF ⊕ ξR, ξR = ⊖ξF ⊕ ξR, F что представляет собой положение робота относительно непо­ движной камеры, показанное пунктирной линией на рис. 2.5. Глава 2 · Представление позиции и ориентации 59 С математической точки зрения положения составляют группу – набор объектов, поддерживающий ассоциативный бинарный оператор (композицию), результат которого принадлежит группе, обратную операцию и элемент идентичности. В данном случае группа – это специальная евклидова группа либо в 2, либо в 3 измерения, которые обычно обозначают SE(2) или SE(3) соответственно. Есть всего несколько алгебраических правил : ξ ⊕ 0 = ξ, ξ ⊖ 0 = ξ, ξ ⊕ ξ = 0, ⊖ξ ⊕ ξ = 0, где 0 представляет нулевое относительное положение. У положения есть инверсия ⊖XξY = YξX, которая на графе представлена стрелкой от {Y} до {X}. Относительные положения также могут быть скомбинированы. ξY ⊕ YξZ = XξZ. X Важно отметить, что алгебраические правила для положений отличаются от правил нормальной алгебры и что композиция не является коммутативной, ξ 1 ⊕ ξ 2 ≠ ξ2 ⊕ ξ 1 за исключением случая, когда ξ1 ⊕ ξ2 = 0. Относительное положение может преобразовать точку, выраженную в виде вектора относительно одной системы координат, в вектор относительно другой системы координат: p = XξY • Yp. X Мы можем быстро записать эти выражения, глядя на граф. Чтобы найти положение узла X относительно узла Y: найдите путь из Y в X и запишите относительные положения на ребрах слева направо; если вы проходите по ребру в направлении его стрелки, перед ним используйте оператор ⊕, в противном случае ⊖. Итак, что такое ξ? Это может быть любой математический объект, поддерживающий описанные выше алгебраические действия и подходящий для рассматриваемой задачи. Это зависит от того, рассматриваем ли мы двухмерную или трехмерную задачу. Некоторые из объектов, которые мы обсудим в оставшейся части этой главы, будут нам знакомы, например векторы, но другие представляют собой более экзотические математические объекты, такие как однородные преобразования, ортонормированные матрицы вращения, скручивания и кватернионы. К счастью, все эти математические объекты хорошо подходят для среды математического программирования MATLAB. Краткое резюме. 1. Точка описывается связанным координатным вектором, представляющим ее смещение от точки отсчета системы координат. 60 Глава 2 · Представление позиции и ориентации 2. Точки и векторы – это разные вещи, хотя каждая из них описывается кортежем чисел. Мы можем суммировать векторы, но не точки. Разность двух точек является вектором. 3. Множество точек, представляющих твердое тело, может быть описано одной системой координат, а составляющие его точки описываются постоянными векторами относительно этой системы координат. 4. Совокупность позиции и ориентации системы координат объекта называется его положением. 5. Относительное положение описывает положение одной системы координат относительно другой и обозначается алгебраической переменной ξ. 6. Координатный вектор, описывающий точку, может быть представлен относительно другой системы координат путем применения относительного положения к вектору с по­ мощью оператора • (точка). 7. Мы можем выполнять алгебраические манипуляции с выражениями, записанными в форме относительных положений и операторов ⊕ и ⊖. В оставшейся части этой главы обсуждаются конкретные представления ξ для различных распространенных случаев, с которыми мы столкнемся в робототехнике и компьютерном зрении. Начнем с рассмотрения двухмерного случая, который является сравнительно простым, а затем расширим эти понятия до трех измерений. В каждом случае мы сначала рассматриваем вращение, а затем добавляем перенос, чтобы создать описание положения. 2.1 Работа в двух измерениях (2D) Двухмерный мир, или плоскость, знаком нам из школьного курса евклидовой геометрии. Мы используем правосторон- Относительная нюю декартову систему координат или систему координат ориентация осей x и y подчиняется с ортогональными осями, обозначаемыми x и y, и обычно ри- правилу правой суем с горизонтальной осью x и вертикальной осью y. Точка руки, как показано пересечения осей называется началом координат. Единичные в разделе 2.2. векторы, параллельные осям, обозначаются x̂ и ŷ. Точка представляется своими координатами по осям x и y в виде записи (x, y) или в виде связанного вектора: p = x x̂ + y ŷ. (2.2) На рис. 2.6 показана красная система координат {B}, которую мы хотим описать относительно синей системы отсчета {A}. Мы Работа в двух измерениях (2D) 61 ясно видим, что начало координат {B} было смещено на вектор t = (x, y), а затем повернуто против часовой стрелки на угол θ. Рис. 2.6. Две двухмерные системы координат {A} и {B} и мировая точка P. Система {B} повернута и смещена относительно {A} Таким образом, конкретным представлением положения является трехкомпонентный вектор AξB ∼ (x, y, θ), и мы используем символ ∼, чтобы обозначить, что эти два представления эквивалентны. К сожалению, такое представление неудобно для комбинирования, поскольку операция (x1, y1, θ1) ⊕ (x2, y2, θ2) является сложной тригонометрической функцией обоих положений. Вместо этого мы будем искать другой способ представления поворота и положения. Рассмотрим задачу в двух частях: вращение и затем перенос. 2.1.1 Ориентация в двух измерениях 2.1.1.1 Ортонормированная матрица вращения Рассмотрим произвольную точку P, которую мы можем выразить относительно каждой из систем координат, показанных на рис. 2.6. Мы создаем новую систему координат {V}, оси которой параллельны осям {A}, но начало координат такое же, как у {B}, как показано на рис. 2.7. Согласно уравнению 2.2 мы можем выразить точку P относительно {V} через единичные векторы, определяющие оси системы (2.3) которые мы записали как произведение строки и вектор-столбца. 62 Глава 2 · Представление позиции и ориентации Рис. 2.7. Повернутые системы координат на плоскости. Точку P можно рассматривать относительно красной или синей системы координат Система координат {B} полностью описывается своими двумя ортогональными осями, которые мы представляем двумя единичными векторами: x̂B = cos θ x̂V + sin θ ŷV; ŷB = –sin θ x̂V + cos θ ŷV, они могут быть разложены в матричную форму: (2.4) Используя уравнение 2.2, мы можем представить точку P относительно {B} как И, подставляя уравнение, 2.4 получим: (2.5) Теперь, приравнивая коэффициенты правых частей уравнений 2.3 и 2.5, мы получаем уравнение которое описывает, как точки преобразуются из системы {B} в {V} при повороте системы. Это так называемая матрица вра- Работа в двух измерениях (2D) 63 щения, поскольку она преобразует точку из системы {V} в {B} путем вращения; она обозначается как VRB. (2.6) представляет собой двухмерную матрицу вращения с некоторыми особыми свойствами: См. приложение B, в котором можно освежить свои знания о векторах, матрицах и линейной алгебре. • она ортонормированная (также называется ортогональной), поскольку каждый из ее столбцов является единичным вектором, а столбцы ортогональны ; • столбцы – это единичные векторы, которые определяют оси повернутой системы отсчета Y относительно X и по определению являются как единичными, так и ортогональными; • принадлежит специальной ортогональной группе размерности 2, или, иначе, R ∈ SO(2) ⊂ �2´2. Это означает, что произведение любых двух матриц принадлежит группе, как и обращенная матрица; • ее определитель равен +1, это означает, что длина вектора не изменилась после преобразования, т. е. ǁYpǁ = ǁXpǁ, ∀θ; • обращение совпадает с транспонированием, т. е. R−1 = RT. Мы можем переписать уравнение 2.6 как Заметим, что обращение (инвертирование) матрицы – это то же самое, что замена верхнего и нижнего индексов местами, что приводит к тождеству R(−θ) = R(θ)T. Интересно отметить также, что вместо представления угла, который является скаляром, мы использовали матрицу 2´2, состоящую из четырех элементов, однако эти элементы не являются независимыми. Каждый столбец в сумме равен единице, что дает два ограничения. Столбцы ортогональны, что обеспечивает еще одно ограничение. Если у нас есть четыре элемента и три ограничения, фактически это значит, что мы имеем только одно независимое значение. Матрица поворота является примером избыточного представления, но ее недостатки, такие как потребность в увеличенном объеме памяти, перевешиваются, как вы скоро увидите, ее преимуществами, такими как компонуемость. 64 Глава 2 · Представление позиции и ориентации Toolbox позволяет легко создавать эти матрицы вращения: >> R = rot2(0.2) R = 0.9801 -0.1987 0.1987 0.9801 где угол указан в радианах. Мы можем наблюдать некоторые свойства, такие как >> det(R) ans = 1 и произведение двух матриц вращения также является матрицей вращения >> det(R*R) ans = 1 Toolbox также поддерживает символьную математику , на- Вам потребуется установить MATLAB пример: >> syms theta >> R = rot2(theta) R = [ cos(theta), -sin(theta)] [ sin(theta), cos(theta)] >> simplify(R*R) ans = [ cos(2*theta), -sin(2*theta)] [ sin(2*theta), cos(2*theta)] >> simplify(det(R)) ans = 1 2.1.1.2 Symbolic Math Toolbox™. Матричная экспонента Рассмотрим чистое вращение на 0.3 рад, выраженное в виде logm отличается от встроенной функматрицы вращения >> R = rot2(0.3) ans = 0.9553 -0.2955 0.2955 0.9553 Мы можем вычислить логарифм этой матрицы, используя встроенную функцию MATLAB logm >> S = logm(R) S = ции log, которая вычисляет логарифм каждого элемента матрицы. Логарифм можно вычислить, используя степенной ряд с матрицей вместо скалярного аргумента. Для матрицы логарифм не уникален, и logm вычисляет главный логарифм матрицы. Работа в двух измерениях (2D) 65 0.0000 0.3000 -0.3000 0.0000 И в результате получается простая матрица с двумя элементами, имеющими величину 0.3, что, как ни странно, является первоначальным углом поворота. Здесь происходит нечто глубокое и интересное – мы забрели на окраины теории групп Ли, с которой будем иметь дело на протяжении всей этой главы. В двух измерениях кососимметричная матрица такова: (2.7) Она имеет четкую структуру и только один уникальный элемент ω ∈ �. Простой пример поддержки Toolbox для кососиммет­ ричных матриц: >> skew(2) ans = 0 -2 2 0 а обратная операция выполняется с по­мощью функции vex Toolbox > > vex(ans) ans = 2 Эта матрица имеет нулевую диагональ и является примером кососимметричной матрицы 2´2. Матрица имеет только один уникальный элемент, и мы можем извлечь его с по­мощью функции vex Toolbox > > vex(S) ans = 0.3000 чтобы восстановить угол поворота. expm отличается Инверсия логарифма – это возведение в степень с по­мощью от встроенной функции exp, которая встроенной матричной экспоненциальной функции MATLAB вычисляет степень expm каждого элемента матрицы. >> expm(S) expm(A) = I + A + 2 A /2! + А3/3! + ⋯. ans = 0.9553 0.2955 -0.2955 0.9553 Результатом, как и ожидалось, является наша исходная мат­ рица вращения. На самом деле команда >> R = rot2(0.3); 66 Глава 2 · Представление позиции и ориентации эквивалентна >> R = expm( skew(0.3) ); Формально мы можем написать выражение R = e[θ]´ ∈ SO(2), где θ – угол поворота, а обозначение [·]´: � ↦ �2´2 указывает на отображение скалярной матрицы в кососимметричную. 2.1.2 Положение в двух измерениях 2.1.2.1 Однородная матрица преобразования Теперь нам нужно учесть перенос между начальными точками систем координат, показанных на рис. 2.6. Поскольку оси {V} и {A} параллельны, как видно на рис. 2.6 и 2.7, это просто векторное сложение: (2.8) (2.9) (2.10) Более компактно его можно записать как (2.11) где t = (x, y) – перенос системы координат, а изменение ориентации – ARB. Обратите внимание, что ARB = VRB, поскольку оси систем {A} и {V} параллельны. Векторы координат для точки P теперь выражаются в однородной форме, и мы пишем Работа в двух измерениях (2D) 67 где ATB называется гомогенным преобразованием. Матрица имеет очень специфическую структуру и принадлежит специальной евклидовой группе размерности 2 или T ∈ SE(2) ⊂ �3´3. Из сравнения с уравнением 2.1 видно, что ATB представляет собой перенос и ориентацию или относительное положение. Это сочетание часто называют движением твердого тела (rigidbody motion). Вектор p = (x, y) записывается в однородной форме как p̃ ∈ ℙ2, p̃ = (x1, x2, x3), где x = x1/x3, y = x2/x3 и x3 ≠ 0. Размерность увеличена на единицу, а точка на плоскости теперь представлена 3-вектором. Чтобы преобразовать точку в однородную форму, мы обычно добавляем элемент, равный единице p̃ = (x, y, 1). Тильда означает, что вектор однороден. Однородные векторы обладают тем важным свойством, что p̃ эквивалентно λp̃ для всех λ ≠ 0, что мы записываем как p̃ ≃ λp̃. То есть p̃ представляет одну и ту же точку на плоскости независимо от общего коэффициента масштабирования. Однородное представление важно для компьютерного зрения, которое мы обсудим в части IV. Дополнительные подробности приведены в разделе С.2. Прямым представлением относительного представления ξ является ξ ∼ T ∈ SE(2) и T1 ⊕ T2 ↦ T1T2, что значит стандартное умножение матриц: Одно из рассмотренных ранее алгебраических правил гласит: ξ ⊕ 0 = ξ. Для матриц мы знаем, что TI = T, где I – матрица тождественности, поэтому для положения 0 ↦ I – единичная матрица. Другое правило заключалось в том, что ξ ⊖ ξ = 0. Для матриц мы знаем, что TT −1 = I, откуда следует, что ⊖T ↦ T −1: Для точки, описываемой как p̃ ∈ ℙ2, справедливо T • p̃ ↦ Tp̃, что является стандартным произведением матрица–вектор. Чтобы сделать эти рассуждения интуитивно более понятными и осязаемыми, рассмотрим несколько численных примеров 68 Глава 2 · Представление позиции и ориентации с использованием MATLAB и Toolbox. Создадим однородное преобразование, которое представляет собой перемещение (1, 2) с последующим поворотом на 30°: >> T1 = transl2(1, 2) * trot2(30, 'deg') T1 = 0.8660 -0.5000 1.0000 0.5000 0.8660 2.0000 0 0 1.0000 Многие функции Функция transl2 создает относительное положение с конеч- Toolbox имеют ным перемещением, но нулевым вращением, в то время как варианты, которые ортоtrot2 создает относительное положение с конечным вращени- возвращают нормированные ем, но нулевым перемещением . Мы можем выполнить эти матрицы вращения операции относительно мировой системы координат (рис. 2.8): или однородные преобразования, например rot2 и trot2. >> plotvol([0 5 0 5]); >> trplot2(T1, 'frame', '1', 'color', 'b') Рис. 2.8. Системы координат, нарисованные с по­мощью функции Toolbox trplot2 Параметры указывают, что метка системы {1}, и она окрашена в синий цвет, как показано на рис. 2.8. Теперь создадим другое относительное положение, представляющее собой смещение (2, 1) и нулевое вращение >> T2 = transl2(2, 1) T2 = 1 0 2 0 1 1 0 0 1 которое мы нарисуем красным >> trplot2(T2, 'frame', '2', 'color', 'r'); Работа в двух измерениях (2D) 69 Теперь можем составить композицию двух относительных положений >> T3 = T1*T2 T3 = 0.8660 -0.5000 0.5000 0.8660 0 0 2.2321 3.8660 1.0000 и построить ее зеленым цветом >> trplot2(T3, 'frame', '3', 'color', 'g'); Мы видим, что смещение (2, 1) было применено относительно системы {1}. Важно отметить, что наше конечное смещение не равно (3, 3), потому что смещение относится к повернутой системе координат. Отсутствие коммутативности композиции наглядно демонстрирует следующий код: >> T4 = T2*T1; >> trplot2(T4, 'frame', '4', 'color', 'c'); и мы видим, что система {4} отличается от системы {3}. Теперь определим точку (3, 2) относительно мировой системы координат >> Р = [3 ; 2]; что фактически является вектором-столбцом, и добавим ее к графику >> plot_point(P, 'label', 'P', 'solid', 'ko'); Чтобы определить координату точки относительно {1}, воспользуемся уравнением (2.1) и запишем p = 0ξ1 • 1p, 0 а затем выполним перестановку: p = 1ξ0 • 0p 1 = (0ξ1)–1 • 0p. Подставим числовые значения: >> P1 = inv(T1) * [P; 1] P1 = 1.7321 -1.0000 1.0000 70 Глава 2 · Представление позиции и ориентации где мы сначала преобразовали евклидовы координаты точки в однородную форму, добавив единицу. Результат также однороден и имеет отрицательную координату y в системе {1}. Используя Toolbox, мы также могли бы выразить это как >> h2e( inv(T1) * e2h(P) ) ans = 1.7321 -1.0000 где результат находится в евклидовых координатах. Вспомогательная функция e2h преобразует евклидовы координаты в однородные, а h2e выполняет обратное преобразование. 2.1.2.2 Центры вращения Рассмотрим свойство некоммутативности более подробно и проиллюстрируем его на примере чистого вращения. Сначала создадим и построим опорную систему координат {0} и целевую систему координат {X}: >> plotvol([-5 4 -1 5]); >> T0 = eye(3,3); >> trplot2(T0, 'frame', '0'); >> X = transl2(2, 3); >> trplot2(X, 'frame', 'X'); далее выполним поворот на 2 рад (приблизительно 115°) >> R = trot2(2); и построим результаты двух возможных порядков композиции >> trplot2(R*X, 'framelabel', 'RX', 'color', 'r'); >> trplot2(X*R, 'framelabel', 'XR', 'color', 'r'); Результаты показаны в виде красных систем координат на рис. 2.9. Мы видим, что система {RX} была повернута вокруг начала координат опорной системы, а система {XR} – вокруг начала координат {X}. Что, если мы захотим повернуть систему координат вокруг произвольной точки? Прежде всего зададим новую точку C и отобразим ее: >> C = [1 2]'; >> plot_point(C, 'label', ' C', 'solid', 'ko') а затем вычислим преобразование для вращения вокруг точки C >> RC = transl2(C) * R * transl2(-C) RC = Работа в двух измерениях (2D) 71 -0.4161 0.9093 0 -0.9093 -0.4161 0 3.2347 1.9230 1.0000 И, выполнив следующее построение >> trplot2(RC*X, 'framelabel', 'XC', 'color', 'r'); мы видим, что система координат действительно была повер- RC слева умножает X, нута вокруг точки C. Построение необходимого преобразования поэтому первое преобразование, было несколько громоздким и не сразу очевидным. Если читать примененное к X, – последовательность справа налево , мы сначала применяем это transl(-C), сдвиг начала координат – выполняем перенос из C в начало базатем R, затем transl(C). зовой системы, применяем вращение вокруг этого начала, а за- тем применяем обратный сдвиг начала координат – перенос из начала базовой системы обратно в C. Более наглядный способ получить аналогичный результат – использовать вращательное перемещение (twist, кручение). Рис. 2.9. Система {X} поворачивается на 2 рад относительно {0}, чтобы получить систему {RX}, относительно {X}, чтобы получить систему {XR}, и относительно точки C, чтобы получить систему {XC} 2.1.2.3 Кручения в 2D Из операций, показанных в предыдущем разделе, следует тот факт, что для любых двух систем координат существует центр вращения, относительно которого можно повернуть первую систему во вторую. В случае прямолинейного поступательного движения центр вращения будет находиться на бесконечном удалении. Это ключевая идея, лежащая в основе вращательного перемещения. Для краткости будем называть его кручением (twist). 72 Глава 2 · Представление позиции и ориентации Мы можем создать кручение вокруг точки, заданной координатным вектором C: >> tw = Twist('R', C) tw = ( 2 -1; 1 ) и результатом будет объект Twist, который кодирует вектор кручения с двумя компонентами: двухмерным вектором момента и одномерным вектором вращения. Первый аргумент 'R' указывает, что необходимо вычислить поворотное кручение. Этот конкретный поворот является единичным поворотом, поскольку величина поворота, последнего элемента кручения, равна единице. Чтобы создать преобразование SE(2) для поворота на 2 рад через кручение, мы используем метод T: >> tw.T(2) ans = -0.4161 0.9093 0 -0.9093 -0.4161 0 3.2347 1.9230 1.0000 и получаем ту же самую операцию, что и в предыдущем разделе, но более точно определенную с точки зрения центра вращения. Центр также называется полюсом трансформации (transformation pole) и кодируется в кручении: >> tw.pole' ans = 1 2 Если мы хотим выполнить поступательное движение в направлении (1, 1), соответствующее единичное кручение будет следующим: >> tw = Twist('T', [1 1]) tw = ( 0.70711 0.70711; 0 ) а для смещения на 2 в направлении, определяемом этим кручением, преобразование SE(2) будет таким: >> tw.T(sqrt(2)) ans = 1 0 1 0 1 1 0 0 1 как мы видим, оно имеет нулевое вращение и сдвиг 1 в направлениях x и y. В случае единичного поступательного кручения (unittranslational twist) вращение равно нулю, а момент представляет собой единичный вектор. Работа в трех измерениях (3D) 73 Для произвольного плоского преобразования, такого как >> T = transl2(2, 3) * trot2(0.5) T = 0.8776 -0.4794 2.0000 0.4794 0.8776 3.0000 0 0 1.0000 мы можем вычислить вектор кручения > > tw = Twist(T) tw = ( 2.7082 2.4372; 0.5 ) и заметим, что последний элемент, поворот, не равен единице, а является нужным нам углом поворота в 0.5 радиана. Это неединичное кручение. Поэтому, когда мы конвертируем его в трансформацию SE(2), нам не нужно предоставлять второй аргумент, поскольку он неявно указан в кручении: >> tw.T ans = 0.8776 0.4794 0 -0.4794 0.8776 0 2.0000 3.0000 1.0000 И мы восстановили наше первоначальное однородное преобразование. 2.2 Работа в трех измерениях (3D) Трехмерное операционное пространство является расширением двухмерного случая, рассмотренного в предыдущем разделе. Мы добавляем дополнительную ось координат, обычно обозначаемую z, которая ортогональна обеим осям x и y. НаВо всех этих тождествах символы правление оси z подчиняется правилу правой руки и образует слева направо правую систему координат. Единичные векторы, параллельные (через знак равен- осям, обозначаются x̂, ŷ и ẑ так, что ства) представляют собой циклическое вращение последовательности xyz. ẑ = x̂ ´ ŷ, x̂ = ŷ ´ ẑ, ŷ = ẑ ´ x̂. (2.12) Правило правой руки. Правая система координат определяется тремя первыми пальцами правой руки, которые указывают относительные направления осей x, y и z соответственно. Точка P представлена своими координатами по осям x, y и z (x, y, z) или в виде связанного вектора: 74 Глава 2 · Представление позиции и ориентации p = xx̂ + yŷ + zẑ. На рис. 2.10 показана красная система координат {B}, которую мы хотим описать относительно синей базовой системы {A}. Мы видим, что начало координат {B} было смещено вектором t = (x, y, z), а затем каким-то сложным образом повернуто. Так же, как и для двухмерной системы, очень важно, как мы представляем ориентацию. Рис. 2.10. Две системы трехмерных координат {A} и {B}. Система {B} поворачивается и перемещается относительно {A} Наш подход состоит в том, чтобы снова рассмотреть произвольную точку P относительно каждой из систем координат и определить соотношение между Ap и Bp. Мы снова рассмотрим задачу в двух частях: вращении и затем переносе. Вращение удивительно сложно описывается в трехмерных системах, и мы посвятим этому вопросу весь следующий раздел. 2.2.1 Ориентация в трех измерениях Любые две независимые ортонормированные системы координат могут быть связаны последовательностью поворотов (не более трех) вокруг координатных осей, причем никакие два последовательных поворота не могут совершаться вокруг одной и той же оси. Теорема вращения Эйлера (Kuipers, 1999) На рис. 2.10 показана пара правых систем координат с очень разными ориентациями, и нам хотелось бы каким-то образом описать ориентацию одной по отношению к другой. Мы можем представить, что берем систему {A} в руку и поворачиваем ее, пока она не станет такой же, как система {B}. Теорема вращения Эйлера утверждает, что любое вращение можно рассматривать как последовательность вращений вокруг разных осей координат. Работа в трех измерениях (3D) 75 Начнем с рассмотрения вращения вокруг одной координатной оси. На рис. 2.11 показана правая система координат и та же самая система после ее поворота на разные углы вокруг разных осей координат. y х z х y х y z z х Рис. 2.11. Вращение трехмерной системы координат: а) исходная система координат, b–f) системы после различных y поворотов, как указано на рисунке d –π/2 вокруг оси x z b π/2 вокруг оси x a Исходная y c π вокруг оси x z z х х e π/2 вокруг оси y y f π/2 вокруг оси z У вращения в трехмерном пространстве есть свои особенности, которые показаны на рис. 2.12. Здесь изображена последовательность двух вращений, применяемых в разном порядке. Как видите, окончательная ориентация зависит от порядка применения поворотов. Это многозначительное и таинственное свойство трехмерного мира долгое время сбивало с толку математиков. Соответственно, есть трехмерное продолжение алгебры положений, которую мы использовали в этой главе: В трехмерном пространстве вращение не является коммутативным – порядок применения вращений влияет на результат. Математики разработали множество способов представления вращения, и мы обсудим некоторые из них в оставшейся части этого раздела: ортонормированные матрицы вращения, углы Эйлера и Кардана, ось и угол вращения, экспоненциальные координаты и единичные кватернионы. Все они могут быть выражены в виде векторов или матриц, естественных типов данных MATLAB или в виде класса, определенного в Toolbox. Этот класс предоставляет множество функций для преобразования между представлениями, показанными в табл. 2.1 и 2.2. 76 Глава 2 · Представление позиции и ориентации Вращение вокруг вектора. Обхватите правой рукой вектор так, чтобы большой палец указывал в направлении стрелки. Изогнутые пальцы указывают направление увеличения угла. Рис. 2.12. Пример, демонстрирующий некоммутативность вращения. В верхнем ряду система координат поворачивается на π/2 вокруг оси x, а затем на π/2 вокруг оси y. В нижнем ряду порядок вращений был обратным, и результаты явно разные 2.2.1.1 Ортонормированная матрица вращения Так же как и в случае двухмерных систем, мы можем представить ориентацию трехмерной системы координат с по­мощью ее единичных векторов, выраженных через базовую систему координат. Каждый единичный вектор состоит из трех элементов, и они образуют столбцы ортонормированной матрицы ARB 3´3 (2.13) которая преобразует описание вектора, определенного относительно системы {B}, в вектор относительно {A}. Работа в трех измерениях (3D) 77 См. приложение B, в котором можно освежить свои знания о векторах, матрицах и линейной алгебре. Трехмерная матрица вращения XRY обладает некоторыми особыми свойствами: она ортонормирована (также называется ортогональной), поскольку каждый из ее столбцов является единичным вектором, а столбцы ортогональны ; столбцы представляют собой единичные векторы, которые определяют оси повернутой системы координат Y относительно X и по определению имеют единичную длину и являются ортогональными; она принадлежит специальной ортогональной группе размерности 3, т. е. R ∈ SO(3) ⊂ �3´3. Это означает, что произведение любых двух матриц внутри группы также принадлежит группе, как и обращенная матрица; ее определитель равен +1, это означает, что длина вектора не изменилась после преобразования, т. е. ǁYpǁ = ǁXpǁ, ∀θ; обращение совпадает с транспонированием, т. е. R−1 = RT. Матрицы ортонормированного вращения для поворота θ вокруг осей x, y и z равны Toolbox предоставляет функции для вычисления этих элементарных матриц вращения, например, Rx(θ): >> R = rotx(pi/2) R = 1.0000 0 0 0 0.0000 -1.0000 0 1.0000 0.0000 Влияние этой операции на базовую систему координат показано графически на рис. 2.11b. Функции roty и rotz вычисляют Ry(θ) и Rz(θ) соответственно. Если учесть, что матрица вращения представляет положение, то соответствующую систему координат можно отобразить графически: 78 Глава 2 · Представление позиции и ориентации >> trplot(R) как показано на рис. 2.13а. Мы можем получить более мощную визуализацию, используя функцию tranimate Toolbox, которая анимирует вращение >> tranimate(R) показывая, как мировая система вращается в выбранной системе координат. Если у вас есть пара анаглифных стереоочков , вы можете увидеть анимацию в более реалистичном 3D-пред­ ставлении с по­мощью функции >> tranimate(R, '3d') Чтобы проиллюстрировать комбинирование вращений, мы снова повернем систему на рис. 2.13а, на этот раз вокруг оси y >> R = rotx(pi/2) * roty(pi/2) R = 0.0000 0 1.0000 1.0000 0.0000 -0.0000 -0.0000 1.0000 0.0000 >> trplot(R) для получения системы, показанной на рис. 2.13b. В этой системе ось x теперь указывает в направлении мировой оси y. y y x z z z x z х х Некоммутативность вращения можно показать, изменив порядок вращений в предыдущем коде >> roty(pi/2)*rotx(pi/2) ans = 0.0000 1.0000 0.0000 0 0.0000 -1.0000 -1.0000 0.0000 0.0000 что дает совсем другой результат. Рис. 2.13. Системы координат, отображенные с помощью trplot: а) система, повернутая на π/2 вокруг оси x; b) система, повернутая на π/2 вокруг оси y Работа в трех измерениях (3D) 79 Напомним, что теорема вращения Эйлера утверждает, что любое вращение может быть представлено не более чем тремя вращениями вокруг координатных осей. Это означает, что в целом произвольное вращение между системами можно разложить на последовательность трех углов поворота и соответствующих осей вращения – об этом пойдет речь в следующем разделе. Ортонормированная матрица вращения состоит из девяти элементов, но они не являются независимыми. Столбцы имеют Если векторы- единичную величину, что дает три ограничения. Столбцы ортостолбцы равны ci, гональны друг другу, что дает еще три ограничения . Девять i ∈ 1 … 3, то c1 · c2 = c2 · c3 = элементов и шесть ограничений – это фактически три незавиc3 · c1 = 0 и ǁciǁ = 1. симых значения. При чтении ортонормированной матрицы вращения столбцы слева направо сообщают нам направления осей новой системы относительно текущей системы координат. Например, если R = 1.0000 0 0 0 0.0000 1.0000 0 -1.0000 0.0000 новая система имеет ось x в прежнем направлении x (1, 0, 0), ось y в прежнем направлении z (0, 0, 1) и ось z в прежнем отрицательном направлении y (0, −1, 0). В данном случае ось x не изменилась, поскольку вокруг нее происходило вращение. Строки являются обратными – текущие оси системы с точки зрения осей новой системы. 2.2.1.2 Представления на основе трех углов Теорема вращения Эйлера требует последовательного вращения вокруг трех осей таким образом, чтобы никакие два последовательных вращения не совершались вокруг одной и той же оси. Существует два класса последовательности вращения: эйлеров и карданов, названные в честь Эйлера и Кардано соответственно. Эйлеров тип предполагает повторное, но не последовательное вращение вокруг одной конкретной оси: XYX, XZX, YXY, YZY, ZXZ или ZYZ. Карданов тип характеризуется вращением вокруг всех трех осей: XYZ, XZY, YZX, YXZ, ZXY или ZYX. По умолчанию принято считать, что все трехугловые представления относятся к углам Эйлера, но здесь требуется уточнение, поскольку существует 12 различных типов на выбор. Конкретная последовательность углов часто определяется соглашением в определенной технологической области. 80 Глава 2 · Представление позиции и ориентации Последовательность ZYZ R = Rz (ϕ)Ry(θ)Rz (ψ) (2.14) обычно используется в аэронавтике и механических динамических системах, а также в Toolbox. Углы Эйлера – это трехэлементный вектор Г = (ϕ, θ, ψ). Например, чтобы вычислить эквивалентную матрицу вращения для Г = (0.1, 0.2, 0.3), мы используем команду: >> R = rotz(0.1) * roty(0.2) * rotz(0.3); или более удобный вариант: >> R = eul2r(0.1, 0.2, 0.3) R = 0.9021 -0.3836 0.1977 0.3875 0.9216 0.0198 -0.1898 0.0587 0.9801 Обратная задача – найти углы Эйлера, соответствующие заданной матрице вращения: >> gamma = tr2eul(R) gamma = 0.1000 0.2000 0.3000 Однако при отрицательном значении θ >> R = eul2r(0.1 , -0.2, 0.3) R = 0.9021 -0.3836 -0.1977 0.3875 0.9216 -0.0198 0.1898 -0.0587 0.9801 обратная функция >> tr2eul(R) ans = -3.0416 0.2000 -2.8416 возвращает положительное значение для θ и совершенно другие значения для ϕ и ψ. Однако соответствующая матрица вращения >> eul2r(ans) ans = 0.9021 -0.3836 0.3875 0.9216 0.1898 -0.0587 -0.1977 -0.0198 0.9801 одна и та же – два разных набора углов Эйлера соответствуют одной матрице вращения. Преобразование матрицы поворота Работа в трех измерениях (3D) 81 в углы Эйлера не является уникальным, и Toolbox всегда возвращает положительный угол для θ. Леонард Эйлер (1707–1783) – швейцарский математик и физик, фактически возглавивший математическую науку XVIII в. Он был учеником Иоганна Бернулли и применял новые математические методы, такие как исчисление, ко многим задачам механики и оптики. Он также предложил способ записи функций y = f(x), который мы используем сегодня. В робототехнике мы используем его теорему о вращении и его уравнения движения во вращательной динамике. Он был весьма плодовитым ученым, его собрание сочинений составляет 75 томов. Почти половина из них была произведена в течение последних 17 лет его жизни, когда он полностью ослеп. Для случая, когда θ = 0 >> R = eul2r(0.1, 0, 0.3) R = 0.9211 -0.3894 0 0.3894 0.9211 0 0 0 1.0000 обратная функция возвращает >> tr2eul(R) ans = 0 0 0.4000 что явно отличается от исходных значений, но в результате получается та же матрица вращения. Объяснение состоит в том, что если θ = 0, то Ry = I и уравнение 2.14 принимает форму R = Rz (ϕ)Rz (ψ) = Rz (ϕ + ψ), В популярных статьях, таких которая является функцией суммы ϕ + ψ. Поэтому обратная как Siciliano et al. (2008), Spong et al. операция может определить только эту сумму, и по соглашению (2006) и Paul (1981), мы принимаем ϕ = 0. Случай θ = 0 является особым, поэтому используют после- мы обсудим его более подробно в следующем разделе. довательность XYZ. Еще одним повсеместно используемым соглашением являToolbox поддерживает оба формата ются углы Кардано: крен, тангаж и рыскание. Как ни странно, с по­мощью опций широко используются две разные версии. В учебниках после'xyz' и 'zyx'. Порядок ZYX довательность крена-тангажа-рысканья определяется как ZYX используется по или XYZ в зависимости от того, к чему привязана система коумолчанию для ординат: к корпусу мобильного робота или к его манипулятоверсии 10, но для версии 9 по умолча- ру . При описании положения транспортных средств, таких нию был XYZ. как корабли, самолеты и автомобили, принято считать, что ось 82 Глава 2 · Представление позиции и ориентации x направлена вперед, а ось z указывает либо вверх, либо вниз. Интуитивно понятно применять вращения в такой последовательности: рыскание (направление движения), тангаж (возвышение передней части относительно горизонтали) и, наконец, крен (вращение вокруг направленной вперед оси транспортного средства). Это соглашение приводит к последовательности углов ZYX: R = Rz (θy )Ry(θp)Rx(θr). Названы в честь (2.15) Питера Тейта, Последовательность «крен-тангаж-рысканье» также называется углами Тейта–Брайана или морскими углами, а в авиа­ции их можно назвать, соответственно, углом крена (bank), углом положения (attitude) и курсовым углом (heading). шотландского физика и сторонника кватернионов, и Джорджа Брайана, одного из первых валлийских аэродинамиков. Джероламо Кардано (1501–1576) – итальянский математик эпохи Возрождения, врач, астролог и игрок. Он родился в Павии (Италия) и был внебрачным ребенком математически одаренного юриста. Он изучал медицину в Университете Падуи и позже первым описал брюшной тиф. Кардано частично зарабатывал на жизнь азартными играми, а его книга об азартных играх Liber de ludo aleae содержит первое систематическое исследование вероятности, а также эффективных методов мошенничества. Его семейная жизнь была полна проблем: старшего сына казнили за отравление жены, а дочь была проституткой, умершей от сифилиса (о чем он написал трактат). Он вычислил и опубликовал гороскоп Иисуса, был обвинен в ереси и провел некоторое время в тюрьме, пока не отрекся от своего профессорства. Он опубликовал решения уравнений кубической и четвертой степени в своей книге Ars magna в 1545 г., а также изобрел кодовый замок, карданный подвес, состоящий из трех концентрических колец, позволяющих свободно вращаться компасу или гироскопу (рис. 2.15), и вал с карданным шарниром – всем известный карданный вал, используемый сегодня в автомобилях. При описании положения захвата робота, как показано на рис. 2.16, принято считать, что ось z направлена вперед, а ось x либо вверх, либо вниз. Это соответствует последовательности углов XYZ: R = Rx(θy )Ry(θp)Rz(θr). (2.16) Toolbox по умолчанию использует последовательность ZYX, но ее можно переопределить с по­мощью параметра 'xyz', например Работа в трех измерениях (3D) 83 >> R = rpy2r(0.1, 0.2, 0.3) R = 0.9363 -0.2751 0.2184 0.2896 0.9564 -0.0370 -0.1987 0.0978 0.9752 и последующей инверсии: >> gamma = tr2rpy(R) gamma = 0.1000 0.2000 0.3000 Последовательность «крен-тангаж-рыскание» позволяет всем углам иметь произвольный знак и имеет сингулярность, когда θp = ±π/2, что, к счастью, выходит за пределы допустимого диапазона положений для большинства транспортных средств. Toolbox содержит интерактивный графический инструмент >> tripleangle который позволяет экспериментировать с углами Эйлера или углами крена-тангажа-рыскания и наблюдать их влияние на ориентацию тела, как показано на рис. 2.14. Рис. 2.14. Приложение Toolbox tripleangle позволяет вам экспериментировать с углами Эйлера и углами кренатангажа-рыскания и видеть, как изменяется положение тела. 2.2.1.3 Сингулярности и блокировка подвеса Фундаментальной проблемой всех только что описанных трехугловых представлений является сингулярность. Это явление также известно как блокировка подвеса (gimbal lock), термин, получивший известность после фильма «Аполлон-13». Блокировка карданного подвеса происходит, когда ось вращения среднего члена в последовательности становится параллельной оси вращения первого или третьего члена. Механический гироскоп, используемый для навигации космического корабля, показан на рис. 2.15. Внутри находится соб- 84 Глава 2 · Представление позиции и ориентации ственно активный узел – это стабилизированный элемент (stable member, или стабилизированная платформа), который имеет три ортогональных гироскопа, удерживающих его в постоянной ориентации относительно вселенной. Он механически связан с космическим кораблем через шарнирный механизм, который позволяет космическому кораблю двигаться вокруг стабильной платформы, не прикладывая к ней никакого крутящего момента. Положение космического корабля определяется непосредственно путем измерения углов осей подвеса по отношению к стабилизированной платформе, что дает прямое указание углов крена-тангажа-рыскания, которые в этой конструкции представляют собой карданову последовательность YZX . Моментный двигатель / Дуплексное контактное кольцо на шарикоподшипниках (50 контактов) Резольвер ошибки гироскопа (1x) / Дуплексное контактное кольцо на шарикоподшипниках (40 контактов) / Многоскоростной резольвер (1x и 16x) «Система координат LM Body правосторонняя, с осью +x, направленной вверх через ось тяги, осью +y, направленной вправо, если смотреть вперед вдоль оси +z. Матрица преобразования вращения строится с по­мощью последовательности Эйлера 2-3-1, т. е.: тангаж вокруг y, затем крен вокруг z и, наконец, рыскание вокруг x. Положительные вращения – это тангаж вверх, крен вправо, рыскание влево». (Hoag, 1963). LM + ось x Ось OG LM + ось z Внешний карданный подвес Ось MG Средний карданный подвес Стабильный компонент Ось IG Корпус IMU (в разрезе) Дуплексное контактное кольцо на шарикоподшипниках (40 контактов) / многоскоростной резольвер (1x и 16x) LM + ось y Моментный двигатель / Дуплексное контактное кольцо на шарикоподшипниках (40 контактов) Дуплексное контактное кольцо на шарикоподшипниках (50 контактов) / многоскоростной резольвер (1x и 16x) Рис. 2.15. Схема инерциального измерительного блока (inertial measurement unit, IMU) лунного модуля Apollo (Lunar module, LM). В системе координат корабля ось x направлена вверх через ось тяги, ось z – вперед, а ось y – вправо. Начиная со стабилизированной платформы {S} и продвигаясь наружу к корпусу космического корабля {B}, последовательность углов вращения равна YZX. Компоненты, помеченные Xg, Yg и Zg, представляют собой гироскопы по осям x, y и z, а компоненты, помеченные Xa, Ya и Za, – это акселерометры по осям x, y и z (иллюстрация на основе «Руководства по эксплуатации Apollo, LMA790-3-LM») Рассмотрим ситуацию, когда угол поворота среднего подвеса (вращение вокруг оси z космического корабля) составляет 90°, – оси внутреннего и внешнего подвеса совмещены и имеют одну и ту же ось вращения. Вместо первоначальных трех осей вращения, поскольку две из них параллельны, теперь есть только Работа в трех измерениях (3D) 85 Это было сущест­венным экс- две эффективные оси вращения – мы говорим, что одна плуатационным недостатком степень свободы была потеряна . данного конкретного гироскоС математической, а не механической точки зрения па (Hoag, 1963), и его можно было частично скомпенси- эту проб­лему можно разглядеть, используя определение ровать, добавив четвертый системы координат лунного модуля, где вращение неподвес, как это делалось на других космических кораблях. подвижной системы координат космического корабля Четвертый подвес был ис- {B} относительно системы координат стабилизированключен из лунного модуля для ной платформы {S} равно: экономии веса и места. S Вращения подчиняются праRB = Ry(θp)Rz(θr)Rx(θy). вилам циклического вращения: Rx(π/2) Ry(θ) Rx(π/2)T ≡ Rz(θ) Для случая, когда θr = π/2, можно применить тождеRy(π/2) Rz(θ) Ry(π/2)T ≡ Rx(θ) T ство Rz(π/2) Rx(θ) Rz(π/2) ≡ Ry(θ) и правилам ациклического Ry(θ)Rz(π/2) ≡ Rz(π/2)Rx(θ), вращения: Ry(π/2)T Rx(θ) Ry(π/2) ≡ Rz(θ) Rz(π/2)T Ry(θ) Rz(π/2) ≡ Rx(θ). из которого следует уравнение RB = Rz(π/2)Rx(θp)Rx(θy) = Rz(π/2)Rx(θp + θy), S не дающее нам никакой информации о вращении вокруг оси y. Это нехорошо, потому что вращение космического корабля вокруг оси y повернет стабилизированную платформу и, таким образом, нарушит его точную ориентацию по звездам: отсюда беспокойство по поводу Аполлона-13. Потеря степени свободы означает, что математически мы не можем обратить преобразование, мы можем только установить линейную зависимость между двумя углами. В этом случае лучшее, что мы можем сделать, это определить сумму углов тангажа и рыскания. Аналогичные явления с сингулярностью угла Эйлера мы наблюдали ранее. Протокол миссии Аполлон-13, время: 02 08 12 47 – Руководитель полета: «На связи, что у вас?» – Офицер системы навигации: «Он приближается к блокировке подвеса». – Руководитель полета: «Вас понял. Оператор, порекомендуйте ему увеличить тягу двигателей C3, C4, B3, B4, C1 и C2 чтобы максимально приблизиться к блокировке подвеса». – Оператор ЦУП: «Вас понял». «Аполлон-13», запись канала связи с центром управления полетом (Lovell and Kluger 1994, p 131; NASA 1970). Все трехугловые представления положения, будь то эйлеровы или кардановы, страдают этой проблемой блокировки карданного подвеса, когда две последовательные оси совпадают. Для 86 Глава 2 · Представление позиции и ориентации эйлеровых углов ZYZ это происходит, когда θ = kπ, k ∈ �, а для углов крена-тангажа-рыскания – когда тангаж θp =±(2k + 1)π/2. Лучшее, на что можно надеяться, – это то, что сингулярность возникает при положении, которое не встречается при нормальной работе транспортного средства, – это требует разумного выбора последовательности углов и системы координат. Сингулярности – неудачное следствие использования минимального представления. Чтобы устранить эту проблему, нам нужно принять различные представления об ориентации. Члены команды лунного модуля «Аполлон» предпочли бы систему с четырьмя карданами, и ключ к успеху, как мы вскоре увидим в разделе 2.2.1.7, состоит в том, чтобы ввести четвертый параметр. 2.2.1.4 Двухвекторное представление Для роботов манипуляторного типа полезно использовать систему координат {E}, прикрепленную к рабочему органу, как показано на рис. 2.16. По общепринятому соглашению ось инструмента связана с осью z и называется вектором подхода (approach vector), который обозначается как â = (ax, ay, az). Для некоторых приложений удобнее указать вектор подхода, чем углы Эйлера или углы крена-тангажа-рыскания. Однако знания направления оси z недостаточно для описания системы координат – нам также необходимо указать направление осей x и y. Ортогональный вектор, обеспечивающий ориентацию, например, между двумя «пальцами» захвата робота, называется вектором ориентации (orientation vector) ô = (ox, oy, oz). Этих двух единичных векторов достаточно, чтобы полностью определить матрицу вращения (2.17) поскольку оставшийся столбец, вектор нормали (normal vector), можно вычислить с по­мощью уравнения 2.12 как n̂ = ô ´ â. Рассмотрим пример, в котором векторы подхода и ориентации захвата параллельны направлениям x и y мировой системы координат соответственно. С помощью Toolbox это реализуется так: >> a = [1 0 0]'; >> o = [0 1 0]'; >> R = oa2r(o, a) R = Работа в трех измерениях (3D) 87 0 0 -1 0 1 0 1 0 0 Любые два непараллельных вектора достаточны для определения системы координат. Даже если два вектора â и ô не ортогональны, они все равно определяют плоскость, и вычисленное значение n̂ перпендикулярно этой плоскости. В этом случае нам нужно вычислить новое значение для ô¢ = â ´ n̂, которое лежит в плоскости, но ортогонально каждому из â и n̂. Для камеры мы могли бы использовать оптическую ось, по соглашению ось z, и левую сторону камеры, которая по соглашению является осью x. Для мобильного робота мы могли бы использовать вектор гравитационного ускорения (измеренный с по­мощью акселерометров), который по соглашению является осью z, и направление курса (измеренное с по­мощью электронного компаса), которое по соглашению является осью x. Рис. 2.16. Система координат рабочего органа робота определяет положение через вектор подхода â и вектор ориентации ô, из которых можно вычислить n̂. Векторы n̂, ô и â соответствуют осям x, y и z согласно системе координат рабочего органа (изображение любезно предоставлено Kinova Robotics) 2.2.1.5 Вращение вокруг произвольного вектора Две системы координат произвольной ориентации связаны единственным поворотом вокруг некоторой оси в пространстве. Для примера вращения, использованного ранее >> R = rpy2r(0.1 , 0.2, 0.3); мы можем определить такой угол и вектор как >> [theta, v] = tr2angvec(R) th = 0.3655 v = Он не уникален. 0.1886 0.5834 0.7900 Вращение –theta вокруг вектора –v приводит к той же где theta – угол поворота, а v – вектор , вокруг которого проориентации. исходит вращение. 88 Глава 2 · Представление позиции и ориентации Эта информация закодирована в собственных значениях и собственных векторах R. Используя встроенную функцию MATLAB eig, получаем: >> [x,e] = eig(R) x = -0.6944 + 0.0000i -0.6944 + 0.0000i 0.0792 + 0.5688i 0.0792 - 0.5688i 0.1073 - 0.4200i 0.1073 + 0.4200i e = 0.9339 + 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.9339 - 0.3574i 0.0000 + 0.0000i 0.0000 + 0.0000i 0.1886 + 0.0000i 0.5834 + 0.0000i 0.7900 + 0.0000i 0.0000 + 0.0000i 0.0000 + 0.0000i 1.0000 + 0.0000i Собственные значения возвращаются на диагонали матри- Обе матрицы цы e, а соответствующие собственные векторы являются соот- комплексные, но некоторые элеменветствующими столбцами x . ты вещественные Из определения собственных значений и собственных векто- (нулевая мнимая часть). ров мы помним, что Rυ = λυ, где υ – собственный вектор, соответствующий собственному значению λ. Для случая λ = 1 Rυ = υ, откуда следует, что соответствующий собственный вектор υ не меняется при вращении. Такой вектор только один, и вокруг него происходит вращение. В примере третье собственное значение равно единице, поэтому осью вращения является третий столбец x. Олинде Родригес (1795–1850) был французским банкиром и математиком, который много писал о политике, социальных реформах и банковском деле. Он получил докторскую степень по математике в 1816 г. в Парижском университете за работу над своей первой широко известной формулой, связанной с полиномами Лежандра. Названная его именем формула вращения была опубликована в 1840 г. и, возможно, впервые представила вращение как скаляр и вектор. Его формулу иногда необоснованно называют формулой Эйлера–Родригеса. Похоронен на кладбище Пер-Лашез в Париже. Можно также показать, что след Ортонормированная матрица вращения всегда будет иметь матрицы вращения одно действительное собственное значение при λ = 1 и, как tr(R) = 1 + 2cosθ, из правило, комплексную пару λ = cos θ ± i sin θ, где θ – угол пово- которого мы можем вычислить величину рота. Угол поворота в этом случае равен θ, но не его знак. Работа в трех измерениях (3D) 89 >> theta = angle(e(1,1)) theta = 0.3655 Обратная задача преобразования угла и вектора в матрицу вращения достигается с по­мощью формулы вращения Родригеса: R = I3´3 + sin θ[v̂]´ + (1 – cos θ)[v̂]2´, (2.18) где [v̂]´ – кососимметричная матрица. Мы можем использовать эту формулу, чтобы определить вращение π/2 вокруг оси x >> R = angvec2r(pi/2, [1 0 0]) R = 1.0000 0 0 0 0.0000 -1.0000 0 1.0000 0.0000 Интересно отметить, что это представление произвольного поворота параметризуется четырьмя числами: тремя для оси Представьте себе вращения и одним для угла поворота. Это намного меньше, единичную сферу. Все возможные чем девять чисел, необходимых для матрицы вращения. Однаединичные векторы ко направление может быть представлено единичным вектоиз центра можно ром, который имеет только два параметра , а угол может быть описать широтой и долготой точки, закодирован в длине, чтобы дать 3-параметрическое представв которой они каса- ление, такое как υ̂θ, υ̂sin(θ/2), υ̂tan(θ), или вектор Родригеса ются поверхности υ̂tan(θ/2). Хотя эти формы минимальны и эффективны с точки сферы. зрения хранения данных, они проблематичны с аналитической точки зрения и некорректно определены, когда θ = 0. 2.2.1.6 Матричные экспоненты Рассмотрим вращение по оси x, выраженное в виде матрицы вращения > > R = rotx(0.3) R = 1.0000 0 logm отличается от встроенной функ0 0.9553 ции log, которая 0 0.2955 0 -0.2955 0.9553 вычисляет логарифм каждого элемента Как и для двухмерного случая, мы можем вычислить логаматрицы. Логарифм рифм этой матрицы, используя встроенную функцию MATLAB можно вычислить, используя степен- logm ной ряд с матрицей вместо скалярного >> S = logm(R) аргумента. Для S = матрицы логарифм 0 0 0 не уникален, и logm 0 0.0000 -0.3000 вычисляет главный логарифм матрицы. 0 0.3000 0.0000 90 Глава 2 · Представление позиции и ориентации и результатом является разреженная матрица с двумя элементами, имеющими величину 0.3, что является исходным углом поворота. Эта матрица имеет нулевую диагональ и является еще одним примером кососимметричной матрицы, в данном случае 3´3. Применение vex к кососимметричной матрице дает >> vex(S)' ans = 0.3000 0 0 и мы находим исходный угол поворота в первом элементе, со- trlog использует эффективное ответствующем оси x, вокруг которой произошел поворот. Для более аналитическое трехмерного случая применима эквивалентная функция Tool- решение, а также может возвращать box trlog информацию об угле и оси отдельно. >> [th,w] = trlog(R) th = 0.3000 w = 1.0000 0 0 Операцией, обратной логарифму, является возведение в степень и применение встроенной матричной экспоненциальной функции MATLAB expm >> expm(S) ans = 1.0000 0 0 0 0.9553 0.2955 0 -0.2955 0.9553 Таким образом, мы восстановили нашу исходную матрицу вращения. На самом деле команда >> R = rotx(0.3); эквивалентна >> R = expm( skew([1 0 0]) * 0.3 ); где мы указали вращение через угол поворота и ось вращения (как единичный вектор). Эта операция обобщается на вращение вокруг любой оси, и формально мы можем написать R = e[ω̂]´θ ∈ SO(3), где θ – угол поворота, ω̂ – единичный вектор, параллельный оси вращения, а запись [·]´: �3 ↦ �3´3 указывает на отображение expm отличается от встроенной функции exp, которая вычисляет степень каждого элемента матрицы. expm(A) = I + A + A2/2! + А3/3! + ⋯. Работа в трех измерениях (3D) 91 вектора в кососимметричную матрицу. Поскольку [ω]´θ = [ωθ]´, мы можем рассматривать ωθ ∈ �3 как вращательный параметр, называемый экспоненциальными координатами. Для трехмерных систем формула вращения Родригеса (уравнение 2.18) – эффективное в вычислительном отношении средство вычисления матричной экспоненты для особого случая, когда аргумент является кососимметричной матрицей, и она используется функцией trexp Toolbox, которая эквивалентна expm. В трехмерном пространстве кососимметричная матрица представлена в форме которая имеет четкую структуру и всего три уникальных элемента ω ∈ �3. Матрицу можно использовать для реализации векторного произведения υ1 ´ υ2 = [υ1]´υ2. Простой пример поддержки Toolbox для кососимметричных матриц: >> skew([1 2 3]) ans = 0 -3 2 3 0 -1 -2 1 0 а обратная операция выполняется с по­мощью функции vex Toolbox > > vex(ans)' ans = 1 2 3 Обе функции работают для трехмерного случая, показанного здесь, и двухмерного случая, когда вектор является одноэлементным. 2.2.1.7 Единичные кватернионы Кватернионы Гамильтона могут считаться чистейшим злом, которое не принесло ничего хорошего тем, кто работал с ними, включая даже таких гениев, как Клерк Максвелл. Лорд Кельвин, 1892 г. Кватернионы были открыты сэром Уильямом Гамильтоном более 150 лет назад и, хотя научное сообщество приняло их далеко не сразу, сегодня они имеют большое значение для робототехники. Кватернион является расширением комплексного чис- 92 Глава 2 · Представление позиции и ориентации ла – гиперкомплексным числом – и записывается как скаляр плюс вектор: q=s+υ = s + v1i + v2i + v3i, (2.20) где s ∈ �, υ ∈ �3 и ортогональные комплексные числа i, j и k определены так, что i2 = j2 = k2 = ijk = –1, (2.21) и мы обозначаем кватернион как q = s <ν1, ν2, ν3>. В Toolbox кватернионы реализуются классом Quaternion. Кватернионы поддерживают сложение и вычитание, выполняемые поэлементно, умножение на скаляр и умножение q1 ∘ q2 = s1s2 – ν1 · ν2 <s1ν2 + s2ν1 + ν1 ´ ν2>, которое называется произведением кватернионов, или Если мы запишем кватернион в виде 4-элементного вектора произведением Гамильтона . (s, ν1, ν2, ν2), то умножение можно Одной из первых и основных претензий к кватер- выразить как произведение нионам было отсутствие коммутативности умноже- матрицы на вектор, где ния, но, как мы видели выше, это именно то, что нам нужно для поворотов. Несмотря на первоначальное недопонимание, кватернионы элегантны, мощны и просты в вычислительном отношении, и они ши­роко используются в робототехнике, компьютерном зрении, компьютерной графике и аэрокосмических навигационных системах. Для представления вращений мы используем единичные кватернионы, обозначаемые буквой q̊. Это кватерни- Что касается представления оны единичной величины, т. е. те, для которых ||q|| = угол–вектор, то оно не уникально. s2 + v12 + v22 + v32 = 1. Их можно рассматривать как по- Вращение θ вокруг вектора –ν приводит к той же ориентации. вороты θ вокруг единичного вектора υ̂, которые свя- Это называется двойным отобразаны с компонентами кватерниона соотношением жением, или двойным покрытием. (2.22) что схоже с представлением угловой оси из раздела 2.2.1.5. В Toolbox они реализованы классом UnitQuaternion, а конструктор преобразует переданный аргумент, такой как матрица вращения, в единичный кватернион, например: >> q = UnitQuaternion( rpy2tr(0.1, 0.2, 0.3) ) q = 0.98335 < 0.034271, 0.10602, 0.14357 > Работа в трех измерениях (3D) 93 Сэр Уильям Роуэн Гамильтон (1805–1865) – ирландский математик, физик и астроном. Вдобавок он был полиглотом и к 13 годам знал классические и современные европейские языки, а также персидский, арабский, хиндустани, санскрит и малайский. Гамильтон выучил математику в 17 лет и обнаружил ошибку в «Небесной механике» Лапласа. Всю жизнь он проработал в Тринити-колледже в Дублине и был назначен профессором астрономии и королевским астрономом Ирландии, еще будучи студентом. Помимо создания теории кватернионов, он внес свой вклад в развитие оптики, динамики и алгебры. Он также писал стихи и переписывался с Вордсвортом, который посоветовал ему посвятить свою энергию математике. Согласно легенде ключевое уравнение кватерниона (2.21) пришло в голову Гамильтону в 1843 г., когда он шел по Королевскому каналу в Дублине со своей женой, и это событие увековечено мемориальной доской на Брумском (Брогемском) мосту: Проходя здесь 16 октября 1843 года, сэр Уильям Роуэн Гамильтон в озарении гения открыл фундаментальную формулу умножения кватернионов i 2 = j 2 = k 2 = ijk = –1 и вырезал ее на камне этого моста. Эта надпись больше не видна, но мост остается местом паломничества математиков и физиков. Для случая единичных кватернионов наше обобщенное положение представляет собой вращение ξ ~ q̊ ∈ �3 и q̊1 ⨁ q̊2 ↦ q̊1 ∘ q̊2, откуда q̊ ↦ q̊ –1 = s <–υ>, что является кватернионным сопряжением. Нулевое вращение 0 ↦ 1 <0, 0, 0> является тождественным кватернионом. Поворот вектора υ ∈ �3 можно записать как q̊ • υ ↦ q̊ ∘ υ̊ ∘ q̊ –1, где υ̊ = 0 <υ> называется чистым кватернионом (pure quaternion). Композиция двух ортоЭтот класс перегружает ряд стандартных методов и функнормированных матриц ций. Кватернионное умножение вызывается через перевращения требует груженный оператор умножения 27 умножений и 18 сложений. В форме кватернионов для этого нужно >> q = q * q; 16 умножений и 12 сложений. Эта экономия а инверсия (сопряжение единичного кватерниона) равна особенно важна для встраиваемых систем. >> inv(q) ans = 0.93394 < -0.0674, -0.20851, -0.28236 > 94 Глава 2 · Представление позиции и ориентации Умножение кватерниона на обратный кватернион дает тождественный кватернион >> q*inv(q) ans = 1 < 0, 0, 0 > который представляет нулевое вращение, или, более кратко: >> q/q ans = 1 < 0, 0, 0 > Кватернион можно преобразовать в ортонормированную матрицу вращения следующим образом: >> q.R ans = 0.7536 0.5555 -0.3514 -0.4993 0.8315 0.2436 0.4275 -0.0081 0.9040 И мы также можем построить ориентацию, представленную кватернионом >> q.plot() что дает результат, похожий по стилю на показанный на рис. 2.13. Кватернион вращает вектор с использованием перегруженного оператора умножения >> q*[1 0 0]' ans = 0.7536 0.5555 -0.3514 Реализация кватернионной алгебры в Toolbox достаточно полна, и класс UnitQuaternion имеет много методов и свойств, которые полностью описаны в онлайн-документации. 2.2.2 Положение в трех измерениях Вернемся теперь к представлению относительного положения в трех измерениях – изменению положения и ориентации между двумя системами координат, как показано на рис. 2.10. Это так называемое перемещение твердого тела. Мы рассмотрели несколько различных представлений ориентации, и нужно объединить одно из них с перемещением, чтобы создать осязаемое представление относительного положения. Работа в трех измерениях (3D) 95 2.2.2.1 Матрица однородного преобразования Вывод матрицы однородного преобразования аналогичен случаю двухмерных систем в уравнении 2.11, но расширен для учета z-размерности. AtB ∈ �3 – вектор, определяющий начало координат системы {B} по отношению к системе {A}, а ARB – ортонормированная матрица размера 3´3, которая описывает ориентацию осей системы {B} относительно системы {A}: Если точки представлены однородными координатными векторами, то (2.23) и ATB представляет собой матрицу однородного преобразования 4´4. Эта матрица имеет очень специфическую структуру и принадлежит специальной евклидовой группе размерности 3, т. е. T ∈ SE(3) ⊂ �4´4. Именованное представление относительного положения: ξ ~ T ∈ SE(3) и T1 ⨁ T2 ↦ T1T2, что является стандартным умножением матриц (2.24) Одно из правил алгебры положений гласит: ξ ⊕ 0 = ξ. Мы знаем, что для матриц TI = T, где I – матрица тождественности, поэтому для положений 0 – это единичная матрица (0 ↦ I). Другое правило алгебры положений заключается в том, что ξ ⊖ ξ = 0. Мы знаем, что для матриц TT −1 = I, откуда следует, что ⊖T ↦ T −1: (2.25) Однородное преобразование 4´4 очень часто используется в робототехнике, компьютерной графике и компьютерном 96 Глава 2 · Представление позиции и ориентации зрении. Оно поддерживается Toolbox и будет использоваться в этой книге как именованное представление трехмерного положения. Toolbox имеет множество функций для создания однородных преобразований. Например, мы можем продемонстрировать композицию преобразований с по­мощью такого кода: >> T = transl(1, 0, 0) * trotx(pi/2) * transl(0, 1, 0) T = 1.0000 0 0 1.0000 0 0.0000 -1.0000 0.0000 0 1.0000 0.0000 1.0000 0 0 0 1.0000 Функция transl создает относительное положение с конеч- Многие функции ным смещением, но без поворота, в то время как trotx создает Toolbox имеют версии, которые относительное положение, соответствующее вращению на π/2 возвращают ортовокруг оси x с нулевым смещением . Это выражение можно нормированные рассматривать как перемещение вдоль оси x на единичное рас- матрицы вращения или однородные стояние, затем поворот на 90° вокруг оси x и перемещение на преобразования, единичное расстояние вдоль новой оси y, которая раньше была например rotx осью z. Результат, как показано в последнем столбце результи- и trotx, rpy2r и rpy2tr и т. д. рующей матрицы, представляет собой единичное перемеще- Некоторые функции ние по исходной оси x и по исходной оси z. Ориентация конеч- Toolbox принимают ного положения показывает эффект вращения вокруг оси x. Мы ортонормированную матрицу можем построить соответствующую систему координат с по­ вращения или одномощью строки кода родное преобразо>> trplot(T) Компонент вращения – это матрица >> t2r(T) ans = 1.0000 0 0 0 0.0000 1.0000 вание и игнорируют поступательный компонент, например tr2rpy. 0 -1.0000 0.0000 а компонент перемещения представляет собой вектор-столбец >> transl(T)' ans = 1.0000 0.0000 2.2.2.2 1.0000 Пара вектор-кватернион Компактным и практичным представлением является пара из вектора и единичного кватерниона. Она описывает положение Это представление при помощи всего семи чисел, легко составляется и не подвер- не реализовано жена сингулярностям . в Toolbox. Работа в трех измерениях (3D) 97 В векторно-кватернионной паре ξ ~ (t, q̊) компонент t ∈ �3 – это вектор, определяющий начало координат текущей системы относительно базовой системы, а q̊ ∈ �3 – ориентация текущей системы относительно базовой системы. Композиция определяется выражением ξ1 ⨁ ξ2 = (t1 + q̊ 1 • t2, q̊ 1 ∘ q̊ 2), а отрицание выражением ⊖ξ = (–q̊ –1 • t, q̊ –1), и вектор координат точки преобразуется в систему координат с по­мощью p = XξY • Yp = q̊ • Yp + t. X 2.2.2.3 Кручения в 3D В разделе 2.1.2.3 мы ввели понятие кручения для двухмерного случая. Любое движение твердого тела в трехмерном пространЧистый прямолинейный перенос стве эквивалентно винтовому движению (screw motion) – двиможно рассматри- жению вокруг и вдоль некоторой линии в пространстве . Мы вать как вращение представляем винт как пару трехкомпонентных векторов s = вокруг бесконечно 6 удаленной точки. (υ, ω ) ∈ � . Компонент ω вектора кручения представляет собой направление оси винта. Компонент υ называется моментом и кодирует положение линии оси кручения в пространстве, а также шаг винта. Шаг – это отношение расстояния вдоль оси винта к повороту вокруг оси винта. Рассмотрим пример поворота на 0.3 рад вокруг оси x. СначаВращательное ла мы задаем единичное кручение с осью, параллельной оси единичное кручение имеет ǁωǁ = 1. x и проходящей через начало координат >> tw = Twist('R', [1 0 0], [0 0 0]) tw = ( -0 -0 -0; 1 0 0 ) которое мы преобразуем в SE(3)-однородное преобразование для требуемого угла поворота > > tw.T(0.3) ans = 1.0000 0 0 0.9553 0 0.2955 0 0 0 -0.2955 0.9553 0 0 0 0 1.0000 и получаем результат, аналогичный тому, который получили бы, используя trotx(0.3). 98 Глава 2 · Представление позиции и ориентации Для чистого перемещения в направлении y единичное круче- Поступательное единичное кручение ние будет описываться таким кодом: имеет ǁυǁ = 1 >> tw = Twist('T', [0 1 0]) tw = ( 0 1 0; 0 0 0 ) Преобразуем это перемещением в SE(3)-однородное преобразование для требуемого расстояния переноса: >> tw.T(2) ans = 1 0 0 1 0 0 0 0 0 0 1 0 0 2 0 1 Как и ожидалось, оно представляет собой вращательный компонент единичной матрицы (без вращения) и поступательный компонент, равный 2, в направлении y. Чтобы проиллюстрировать базовую винтовую модель, определим систему координат {X} >> X = transl(3, 4, -4); которую мы будем поворачивать на диапазон углов >> angles = [0:0.3:15]; вокруг оси винта, параллельной оси z, в направлении (0, 0, 1), через точку (2, 3, 2) и с шагом 0.5: >> tw = Twist('R', [0 0 1], [2 3 2], 0.5); Следующая строка содержит несколько функций. Мы берем значения θ, полученные последовательно из вектора angles, используем анонимную функцию для оценки кручения для каждого значения θ и применяем его к системе {X}. Эта последовательность анимирована, и каждый кадр в последовательности сохраняется. >> tranimate( @(theta) tw.T(theta) * X, angles, ... 'length', 0.5, 'retain', 'rgb', 'notext'); Результат показан на рис. 2.17. В последовательных положениях смещенной системы отсчета при ее вращении вокруг оси винта ясно просматривается винтовое движение. и ω = 0. Работа в трех измерениях (3D) 99 Ось винта – это прямая >> L = tw.line L = { 3 -2 0; 0 0 1 } описанная в координатах Плюккера. Отобразим ее на графике: >> L.plot('k:', 'LineWidth', 2) Наконец, мы можем преобразовать произвольное однородное преобразование в неединичное кручение > > T = transl(1, 2, 3) * eul2tr(0.3, 0.4, 0.5); >> tw = Twist(T) tw = ( 1.1204 1.6446 3.1778; 0.041006 0.4087 0.78907 ) которое имеет шаг >> tw.pitch ans = 3.2256 а вращение вокруг оси равно >> tw.theta ans = 0.8896 Вот точка, лежащая на оси кручения: >> tw.pole' ans = 0.0011 Рис. 2.17. Система координат {X} отображается для различных значений θ относительно винта, параллельного оси z и проходящего через точку (2, 3, 2). Оси x, y и z обозначены красной, зеленой и синей линиями соответственно 0.8473 -0.4389 100 Глава 2 · Представление позиции и ориентации 2.3 Дополнительные темы 2.3.1 Нормализация Арифметика с плавающей запятой имеет конечную точность Стандарт IEEE для , и последовательные операции будут накапливать ошибку. чисел с плавающей запятой двойной Матрица вращения по определению имеет единичный опреде- точности (стандартный числовой литель: >> R = eye(3,3); >> det(R) - 1 ans = 0 Но если мы несколько раз выполним умножение на допустимую матрицу вращения, результат выполнения кода >> for i=1:100 R = R * rpy2r(0.2, 0.3, 0.4); end >> det(R) - 1 ans = 4.4409e-15 указывает на небольшую ошибку – определитель больше не равен единице, и матрица больше не является правильной ортонормированной матрицей вращения. Чтобы исправить это, нам нужно нормализовать матрицу – процесс, который налагает ограничения на столбцы ci ортонормированной матрицы R = [c1, c2, c3]. Нам нужно предположить, что один столбец имеет правильное направление c¢3 = c3, тогда первый столбец делается ортогональным двум последним: c¢1 = c2 ´ c¢3. Однако последние два столбца, возможно, не были ортогональны, поэтому c¢2 = c¢1 ´ c¢3. Наконец, все столбцы нормализованы к единичной величине: формат MATLAB) имеет точность около 16 знаков после запятой. Дополнительные темы 101 В Toolbox нормализация реализована при помощи следующей функции: > > R = trnorm(R); Эта ошибка И определитель теперь намного ближе к единице теперь находится на пределе ариф- >> det(R) - 1 метики с двойной точностью, ans = -2.2204e-16 которая составляет 2.2204×10−16 и определяется функцией Аналогичная проблема возникает для единичных кватерMATLAB eps. нионов, когда норма или величина единичного кватерниона больше не равна единице. Однако это гораздо легче исправить, поскольку нормализация кватерниона просто включает в себя деление всех элементов на норму которое реализовано в методе unit >> q = q.unit(); Класс UnitQuaternion также поддерживает разновидность умно­жения >> q = q .* q2; которая выполняет явную нормализацию после умножения. Нормализация не должна выполняться после каждого умножения, так как это дорогостоящая операция. Однако для ситуаций, подобных приведенному выше примеру, когда одно преобразование неоднократно обновляется, рекомендуется поступать именно так. 2.3.2 Понятие экспоненциального отображения В этой главе мы заметили некоторую связь между матрицами вращения, кососимметричными матрицами и возведением мат­рицы в степень. В основе этой связи лежит математика групп Ли, описанная в учебниках по алгебраической геометрии и алгебраической топологии. Работа с ней требует глубоких знаний в области продвинутой математики, и многие читатели, начинающие заниматься робототехникой, сочтут содержание таких учебников совершенно недоступным для понимания. Введение в основы этой темы дано в приложении D. В этом разделе мы будем использовать интуитивный подход, основанный 102 Глава 2 · Представление позиции и ориентации на математике уровня инженерного бакалавриата, чтобы прояснить эти взаимосвязи. Рассмотрим точку P, заданную координатным вектором p, которая вращается с угловой скоростью ω. В свою очередь, угловая скорость является вектором, направление которого определяет ось вращения, а величина ||ω|| определяет скорость вращения вокруг оси, проходящей, как мы предполагаем, через начало координат. Нам нужно повернуть точку на угол θ вокруг этой оси, а скорость точки, как известно из механики, равна ṗ = ω ´ p, и мы заменим векторное произведение на кососимметричную матрицу, дающую произведение матрицы на вектор: ṗ = [ω]´ p. (2.26) Мы можем найти решение этого дифференциального уравнения первого порядка по аналогии с простым скалярным случаем ẋ = ax, чье решение имеет вид: x(t) = eatx(0). Это означает, что решение уравнения (2.26) будет следующим: p(t) = e[ω]´tp(0). Если ||ω|| = 1, то через t секунд вектор повернется на t радиан. Нам требуется поворот на θ, поэтому мы можем установить t = θ, чтобы получить уравнение p(θ) = e[ω̂]´θp(0), которое описывает вектор p(0), поворачиваемый к p(θ). Матрица, вращающая вектор, является матрицей вращения, и это означает, что наша экспоненциальная матрица – матрица вращения: R(θ, ω̂) = e[ω̂]´θ ∈ SO(3). Теперь рассмотрим более общий случай вращательного и поступательного движения. Мы можем написать уравнение ṗ = [ω]´ p + υ Дополнительные темы 103 и переписать его в матричном виде После введения однородных координат уравнение принимает вид: где Σ – дополненная кососимметричная матрица размера 4´4. Опять же, по аналогии со скалярным случаем мы можем записать решение в виде: p̃(θ) = eΣθp̃(0). Матрица, которая вращает и переводит точку в однородные координаты, является матрицей однородного преобразования, а это означает, что наша экспоненциальная матрица тоже является матрицей однородного преобразования: где [ω̂]´θ определяет величину и ось вращения, а υ θ – перенос. Степень скаляра может быть вычислена с использованием степенного ряда, а матричный случай аналогичен и относительно прост для вычисления. Функция MATLAB expm использует полиномиальную аппроксимацию для общего матричного случая. Если матрица A является кососимметричной или дополненной кососимметричной, то можно использовать эффективное решение в аналитической форме для матрицы вращения – формулу вращения Родригеса (2.18). Это решение реализовано функцией trexp в Toolbox. 2.3.3 Подробнее о кручениях В этой главе мы ввели и применили кручения, а здесь дадим им более формальное определение. Мы также подчеркнем очень тесную связь между поворотами и однородными матрицами преобразования посредством экспоненциального отображения. Ключевое понятие исходит из теоремы Шаля: «Всякое перемещение тела в пространстве может быть осуществлено посред- 104 Глава 2 · Представление позиции и ориентации ством вращения тела вокруг единственной прямой в пространстве, сопровождаемого перемещением тела параллельно этой прямой». Такая прямая называется осью винта и изображена на рис. 2.18. Математика теории винтов была разработана сэром Робертом Боллом в конце XIX в. для анализа механизмов. В основе теории винтов лежат пары векторов: угловая и линейная скорость; силы и моменты; а также координаты Плюккера (раздел C.1.2.2). Рис. 2.18. Концептуальное изображение винта. Система координат прикреплена к гайке жестким стержнем и вращается вокруг винтовой резьбы. Положение меняется с красной системы на синюю. Следствие заключается в том, что для любых двух систем координат мы можем определить винтовую ось, чтобы повернуть одну систему в другую Общее смещение твердого тела в трехмерном пространстве может быть представлено вектором кручения S = (υ, ω) ∈ �6, где υ ∈ �3 называется моментом и описывает положение линии действия в пространстве и шаг винта, а ω ∈ �3 – направление оси винта. Для вращательного движения, когда ось винта параллельна вектору â и проходит через точку Q, определяемую его координатным вектором q, а шаг винта р есть отношение расстояния вдоль оси винта к повороту вокруг оси, элементы кручения будут следующие: S = (q ´ â + pâ, â), и шаг может быть восстановлен с по­мощью операции p = ŵ Tυ. В случае чистого вращения шаг винта равен нулю, а единичное кручение равно S = (q ´ â, â). Дополнительные темы 105 Мишель Шаль (1793–1880) – французский математик, родившийся в Эперноне. Он учился в Политехнической школе в Париже у Пуассона и в 1814 г. был призван защищать Париж в войне Шестой коалиции. В 1837 г. он опубликовал работу о происхождении и развитии методов в геометрии, которая принесла ему значительную известность, и был назначен профессором Политехнической школы в 1841 г. и Сорбонны в 1846 г. Он был заядлым коллекционером и купил более 27 000 поддельных писем, якобы принадлежащих перу Ньютона, Паскаля и других исторических личностей, – все они были написаны на французском языке! В одном из писем от имени Паскаля утверждалось, что он открыл законы гравитации раньше Ньютона. В 1867 г. Шаль передал письма во Французскую академию наук, но ученые пришли к выводу, что это подделки. В конце концов Шаль признал, что его обманули, и рассказал, что потратил на письма почти 150 000 франков. Он похоронен на кладбище Пер-Лашез в Париже. В случае чисто поступательного движения в направлении, параллельном вектору а, шаг бесконечен, что приводит к нулевой вращательной составляющей, а единичное кручение равно S = (â, 0). Кручение связано со смещением твердого тела в SE(3) уже упомянутым ранее экспоненциальным отображением T(θ, S) = e[S]θ ∈ SE(3), где дополненная кососимметричная матрица относится к алгебре Ли se(3) и является генератором смещения твердого тела. Экспоненциальная матрица имеет эффективную аналитическую форму где R(θ, ω̂) вычисляется по формуле вращения Родригеса (2.18). Для неединичного крутящего момента, когда ||ω|| ≠ 1, θ = ||ω||. 106 Глава 2 · Представление позиции и ориентации Для действительных чисел если x = log X и y = log Y, то Z = XY = e xe y = e x+y, но для матричного случая это верно только в том случае, если матрицы коммутативны. Матрицы вращения не коммутативны, поэтому Z = XY = e xe y ≠ e x+y, если x, y ∈ so(n) или se(n). Суть в том, что нет короткого пути к составным вращениям, и мы должны вычислить z = log(e xe y ), а не просто z = x + y. Toolbox предоставляет множество способов создания кручений и преобразования их в перемещения твердого тела, выраженные в виде однородных преобразований. Теперь, лучше разобравшись в экспоненциальном отображении, мы вернемся к примеру из раздела 2.2.2.3: >> tw = Twist('R', [1 0 0], [0 0 0]) tw = ( -0 -0 -0; 1 0 0 ) который представляет собой единичное кручение, описывающее вращение вокруг оси x в SE(3). Twist имеет ряд свойств >> tw.S' ans = 0 0 >> tw.v' ans = 0 0 >> tw.w' ans = 1 0 0 1 0 0 0 0 Единичное кручение описывает семейство движений, которые имеют один параметр: либо вращение и перемещение вокруг и вдоль некоторой винтовой оси, либо чистое перемещение в каком-либо направлении. Мы можем изобразить его в виде механического винта в пространстве или представить в виде 6-элементного вектора S = (υ, ω), где ||ω|| = 1 для чисто вращательного кручения и ||υ|| = 1, ω = 0 для поступательного закручивания. Конкретное движение твердого тела описывается единичным кручением s и параметром движения θ, который является скаляром, определяющим величину вращения или перемещения. Движение описывается кручением Sθ, которое в общем случае не является единичным. Экспоненциальная форма кручения в матричном формате 4´4 представляет собой матрицу однородного преобразования 4´4, описывающую это конкретное движение твердого тела в SE(3). Дополнительные темы 107 а также различные методы. Мы можем создать se(3) алгебры Ли, используя метод se этого класса >> tw.se ans = 0 0 0 0 0 0 1 0 0 -1 0 0 0 0 0 0 Метод expm является который является дополненной кососимметричной версией S. синонимом, и оба Метод T выполняет возведение в степень , чтобы создать одвызывают функцию нородное преобразование SE(3) для указанного вращения отToolbox treexp. носительно единичного кручения >> tw.T(0.3) ans = 1.0000 0 0 0.9553 0 0.2955 0 0 0 -0.2955 0.9553 0 0 0 0 1.0000 Функции trexp и trlog из Toolbox представляют собой, соответственно, альтернативные аналитические формы expm и logm, когда аргументы находятся в so(3)/se(3) или SO(3)/SE(3). Метод line возвращает объект Plucker, представляющий ось винта в координатах Плюккера. > > tw.line ans = { 0 0 0; 1 0 0 } Наконец, перегруженный оператор умножения для класса Twist соединит два поворота. >> t2 = tw * tw t2 = ( -0 -0 -0; 2 0 0 ) >> tr2angvec(t2.T) Rotation: 2.000000 rad x [1.000000 0.000000 0.000000] И результатом в этом случае является неединичное кручение на две единицы, или 2 рад, вокруг оси x. 2.3.4 Производная положения Существует много способов представить ориентацию системы координат, но наиболее удобной для наших текущих целей является экспоненциальная форма A RB(t) = e[Aω̂(t)]´θ(t) ∈ SO(3), 108 Глава 2 · Представление позиции и ориентации где вращение описывается осью вращения Aω̂(t), определенной относительно системы {A}, и углом поворота θ(t), а [·]´ – кососимметричная матрица. Будем считать, что в момент времени t ось имеет фиксированное направление и система координат вращается вокруг оси. Производная по времени равна A ṘB(t) = [Aω̂(t)]´θ˙e[ ω̂(t)]´θ(t) ∈ �3´3 A = [Aω̂(t)]´θ˙ ARB(t), что можно кратко записать как ṘB = [Aω]´ARB ∈ �3´3, A (2.27) где Aω = Aω̂θ˙ – угловая скорость в системе {A}. Это векторная величина Aω = (ωx, ωy, ωz), определяющая мгновенную ось и скорость вращения. Направление Aω параллельно оси, вокруг которой вращается система координат в конкретный момент времени, а величина || Aω|| – это скорость вращения вокруг этой оси Для кувыркающегося объекта ось . Обратите внимание, что производная матрицы вращения не вращения меняется со временем. является матрицей вращения, это обычная матрица 3´3. Допустим теперь, что угловая скорость выражена в системе {B}, и мы знаем, что ω = ARBBω, A а из тождества [Aυ]´ = A[υ]´ AT следует, что ṘB = ARB[Bω]´ ∈ �3´3. (2.28) q̇ B = ½Aω̊ ∘ Aq̊B = ½Aq̊B ∘ Bω̊ ∈ �, (2.29) A Производная единичного кватерниона, кватернионный эквивалент уравнения (2.27), определяется как A где ω̊ – чистый кватернион, образованный вектором угловой скорости. Они реализуются методами dot и dotb Toolbox соответственно. Производная единичного кватерниона не является единичным кватернионом, это обычный кватернион, который также можно рассматривать как 4-элементный вектор. Производную положения можно определить, выразив положение как однородную матрицу преобразования Дополнительные темы 109 Сэр Роберт Болл (1840–1913) – ирландский астроном, родившийся в Дублине. Он стал профессором прикладной математики в Королевском научном колледже в Дублине в 1867 г., а в 1874 г. – королевским астрономом Ирландии и профессором астрономии в Дублинском университете. В 1892 г. он был назначен профессором астрономии и геометрии в Кембриджском университете и стал директором Кембриджской обсерватории. Он был членом Королевского общества, а в 1900 г. стал первым президентом Общества кватернионов. Наиболее известен своим вкладом в науку о кинематике, описанным в его трактате «Теория винтов» (1876 г.), но также опубликовал «Трактат о сферической астрономии» (1908 г.) и ряд популярных статей по астрономии. Он похоронен в приходе Вознесенского могильника в Кембридже. Взяв производную по времени и подставив уравнение (2.27), мы получаем: Скорость изменения может быть описана с точки зрения текущей ориентации ARB и двух скоростей. Линейная, или поступательная, скорость υ = AṫB – это скорость начала координат {B} относительно {A}. Угловую скорость AωB мы уже ввели. Мы можем объединить эти два вектора скорости, чтобы создать вектор пространственной скорости νB = (AυB, AωB) ∈ �6, A которая является мгновенной скоростью системы координат {B} относительно {A}. Каждая точка тела имеет одинаковую угловую скорость. Зная эту угловую скорость и вектор поступательной скорости любой точки, можно полностью описать мгновенное движение твердого тела. Обычно начало системы координат {B} помещают в центр масс тела. 2.3.5 Преобразование пространственных скоростей Скорость движущегося тела может быть выражена относительно мировой системы координат {A} или системы движущегося 110 Глава 2 · Представление позиции и ориентации тела {B}, как показано на рис. 2.19. Пространственные скорости связаны линейной зависимостью (2.30) где AξB ∼ (ARB, AtB) и AJB(·) – якобиан, или матрица взаимодействия. Например, мы можем определить фиксированную систему координат и пространственную скорость в этой системе: >> TB = SE3(1, 2, 0) * SE3.Rx(pi/2); >> vb = [0.2 0.3 0 0 0 0.5]'; движущееся тело Рис. 2.19. Представление пространственной скорости движущегося тела b относительно различных систем координат. Обратите внимание, что ν является 6-мерным вектором А пространственная скорость в мировой системе координат будет равна >> va = TB.velxform * vb; >> va' ans = 0.2000 0.0000 0.3000 0 -0.5000 0.0000 Для случая, когда система {C} также находится на движущемся теле, преобразование принимает вид и включает сопряженную матрицу относительного положения, которая обсуждается в приложении D. Продолжая пример выше, мы определим дополнительную систему {C} относительно системы {B}: Дополнительные темы 111 >> TBC = SE3(0, 0.4, 0); Чтобы определить скорость в начале этой системы отсчета, мы сначала вычисляем CξB: >> TCB = inv(TBC); а скорость в системе {C} >> vc = TCB.Ad * vb; >> vc' ans = 0 0.3000 0 0 0 0.5000 имеет нулевую составляющую в направлении xC, поскольку компоненты вращательной и поступательной скорости компенсируются. Линч и Парк (2017) используют термин «кручение скорости», а Мюррей и др. (1994) называют это «пространственной скоростью». В некоторых статьях вводится кручение скорости V, которое отличается от пространственной скорости, введенной выше . Кручение скорости неподвижной системы координат {B} равно BV = (Bυ, Bω) и имеет поступательную и вращательную составляющие скорости, но Bυ является скоростью системы координат воображаемой точки, жестко прикрепленной к телу и расположенной в начале мировой системы. Кручения скорости тела и системы отсчета тела и мировой системы связаны сопряженной матрицей, а не уравнением 2.30. Сэр Исаак Ньютон (1642–1727) – английский математик и алхимик. Он был лукасовским профессором математики в Кемб­ридже, магистром Королевского монетного двора и 13-м президентом Королевского общества. В число его главных научных достижений входят три закона движения, математический аппарат гравитационного притяжения, теория движения небесных тел и теория света и цвета (глава 3), а также создание первого телескопа-рефлектора. Многие из этих результатов были опубликованы в 1687 г. в его большом трехтомном труде The Philosophiae Naturalis Principia Mathematica («Математические начала натуральной философии»). В 1704 г. он опубликовал «Оптику», посвященную изучению природы света и цвета и явлениям дифракции. В его честь названа единица силы в системе СИ – ньютон. Похоронен в Вестминстерском аббатстве в Лондоне. 2.3.6 Вращение, задаваемое в приращениях Физический смысл Ṙ интуитивно не очевиден – это просто то, как элементы R изменяются с течением времени. Чтобы разо- 112 Глава 2 · Представление позиции и ориентации браться в этом получше, мы рассмотрим приближение первого Единственным допустимым операпорядка к производной : тором для группы (2.31) Рассмотрим объект, системы координат которого {B} на двух последовательных временных шагах связаны небольшим вращением BR∆, выраженным в системе координат тела: RB〈t + δt〉 = RB〈t〉BRD. SO(n) является композиция ⊕, поэтому результат вычитания не может принадлежать группе. Результатом является матрица 3×3 поэлементных разностей. Группы представлены в приложении D. Мы подставляем уравнение 2.28 в 2.31 и после перестановки получаем выражение RD » δt[Bω]´ + I3´3, B (2.32) которое говорит о том, что бесконечно малое вращение может Это первые два быть аппроксимировано суммой кососимметричной мат­рицы члена формулы вращения Родригеса и единичной матрицы , например: (2.18), когда θ = δ ω. t >> rotx(0.001) ans = 1.0000 0 0 1.0000 0 0.0010 0 -0.0010 1.0000 Уравнение 2.32 напрямую связывает вращение между временными шагами с угловой скоростью. Его перестановка позволяет вычислить приближенный вектор угловой скорости из двух последовательных матриц вращения, где ⋁´(·) – обратный кососимметричный матричный оператор такой, что если S = [υ]´, то υ = ⋁´(S). В качестве альтернативы, если известна угловая скорость в системе координат тела, мы можем приблизительно обновить матрицу вращения RB〈t + δt〉 » RB〈t〉 + δt RB〈t〉[ω]´, (2.33) что обходится дешево в плане вычислений, не требует тригонометрических операций и является ключевым принципом работы инерциальных навигационных систем. Дополнительные темы 113 Единственным допустимым оператором для группы SO(n) является композиция ⊕, поэтому результат сложения не может находиться внутри группы. Результатом является общая матрица 3×3. Прибавление любой ненулевой матрицы к матрице вращения дает матрицу, которая не является матрицей вращения . Однако, если приращение достаточно мало, т. е. угловая скорость и/или шаг расчета малы , результат будет близок к ортонормированному. Мы можем выправить ее, т. е. сделать из нее правильную матрицу вращения, путем нормализации, как обсуждалось в разделе 2.3.1. Это распространенный подход при реализации инерциальных навигационных систем на слабом вычислительном оборудовании. Вот почему инерМы также можем аппроксимировать производную кватернициальные навигационные системы она разностью первого порядка работают с высокой частотой дискретизации, а δt мало. Как и в случае с SO(n), сложение и вычитание не которая в сочетании с уравнением 2.29 дает нам приближение являются операторами для группы единичных кватер(2.34) нионов �3, поэтому результатом будет кватернион q ∈ �, для которого сло- даже более простое в вычислительном отношении, чем подход жение и вычитание с матрицей вращения. Прибавление ненулевого вектора к едиразрешены. Toolbox поддерживает это ничному кватерниону дает неединичный кватернион, но если с по­мощью перегру- угловая скорость и/или шаг расчета малы, то это приближение женных операторов разумно. Нормализация результата для создания единично+ (плюс) и – (минус) и соответствующих го кватерниона в вычислительном отношении дешевле, чем преобразований нормализация матрицы вращения, как было сказано в раздеклассов объектов. ле 2.3.1. 2.3.7 Движение твердого тела, задаваемое в приращениях Рассмотрим два положения ξ1 и ξ2, которые бесконечно мало различаются и связаны соотношением ξ2 = ξ1 ⊕ ξD, где ξD = ⊖ξ1 ⊕ ξ2. В форме матрицы однородного преобразования это записывается так: 114 Глава 2 · Представление позиции и ориентации где tD – приращение смещения, а RD – матрица приращения вращения, которая будет кососимметричной только с тремя уникальными элементами ⋁x(RD − I3´3) плюс единичная матрица. Следовательно, пошаговое движение твердого тела можно описать всего шестью параметрами: D(ξ1, ξ2) ↦ Dξ ∈ �6, где Dξ = (Dt, DR) можно рассматривать как пространственное Это полезно смещение . Тело с постоянной пространственной скоростью в процедурах оптимизации, ν в течение δt секунд испытывает пространственное смещение которые стремятся минимизировать Dξ = δt ν. ошибку между двуОбратный оператор D–1(Dξ) ↦ ξD ∈ SE(3) задан уравнением Оператор пространственного смещения и его инверсия реализуются функциями tr2delta и delta2tr Toolbox соответственно. Эти функции предполагают, что смещения бесконечно малы и становятся все более приближенными с увеличением смещения. 2.4 мя положениями: мы можем выбрать функцию стоимости e = ǁ∆(ξ1, ξ2)ǁ, которая равна нулю, когда ξ1 ≡ ξ2. Это очень приблизительное равенство, когда положения существенно различаются, но оно становится все точнее при ξ1 → ξ2. Использование Toolbox Toolbox поддерживает все представления, обсуждаемые в этой главе, а также преобразования между многими из них. Представления и возможные преобразования показаны в табличной форме в табл. 2.1 и 2.2 для случаев двухмерного и трехмерного пространства соответственно. В этой главе мы в основном использовали нативные матрицы MATLAB для представления вращений и гомогенных преобразований , и исторически это Кватернионы и кручения реализованы было то, с чего начинался Toolbox, – скажем так, классические как классы, а не функции Toolbox. Начиная с версии 10 в Toolbox имеются клас- нативные типы, сы, представляющие повороты и однородные преобразования, но в очень старых версиях Toolbox названные соответственно SO2 и SE2 для двух измерений и SO3 кватернионы преди SE3 для трех измерений. Они обеспечивают реальные преиму- ставляли собой щества с точки зрения удобочитаемости кода и безопасности векторы 1×4. Использование Toolbox 115 типов и могут использоваться почти так же, как и собственные матричные типы. Они также являются полиморфными, т. е. поддерживают многие варианты одних и тех же операций, что позволяет очень легко переключаться между использованием, скажем, матриц вращения и кватернионов или переносом решения из двух измерений в три. Быстрой иллюстрацией новой функциональности является пример из раздела 2.1.2.1, который принимает вид >> T1 = SE2(1, 2, 30, 'deg'); Размер объекта >> about T1 в байтах, указанный в скобках, зависит T1 [SE2] : 1x1 (176 bytes) от версии MATLAB и типа компьютера. и дает нам объект класса SE2, а не матрицу 3´3 . Однако, если : Если у вас установ- мы отобразим его, он будет выглядеть как матрица 3´3 лен пакет cprintf из MATLAB File >> T1 Exchange, под- T1 = матрица поворота 0.8660 -0.5000 1 будет окрашена 0.5000 0.8660 2 в красный цвет. 0 0 1 Матрица инкапсулирована внутри объекта, и мы можем легко извлечь ее, если это необходимо: >> T1.T ans = 0.8660 -0.5000 1.0000 0.5000 0.8660 2.0000 0 0 1.0000 >> about ans ans [double] : 3x3 (72 bytes) Возвращаясь к предыдущему примеру, мы можем просто преобразовать вектор >> inv(T1) * P ans = 1.7321 -1.0000 и класс возьмет на себя детали преобразования вектора между евклидовой и однородной формами. Эта новая функциональность также описана в табл. 2.1 и 2.2, а табл. 2.3 отражает соответствие между классической и новой функциональностью, знание которого поможет вам в применении Toolbox. С этого момента в книге будет использоваться смесь классических функций и новых классов. 116 Глава 2 · Представление позиции и ориентации Таблица 2.1. Поддерживаемые Toolbox типы данных для представления 2D-положения: конструкторы и преобразования Тип выхода Тип входа t θ t (2-вектор) θ (скаляр) R (матрица 2×2) transl2 T (матрица 3×3) Вектор кручения (1- или 3-мерный) Twist .theta SO2 .t .theta SE2 R T transl2 trot2 r2t rot2 t2r trexp2 trexp2 .R .R .T .T .T Вектор Twist Twist Twist('T') Twist('R') Twist() Twist() .S .log .log SO2 SO2() SO2() SO2.exp() SE2 SE2() SE2() SE2() SE2() SE3.exp() .SE .SE2 .Twist .SO2 Темно-серые прямоугольники означают невозможность преобразования. Светло-серые прямоугольники – возможные преобразования, но в Toolbox нет прямого преобразования, вам нужно выполнять преобразование через промежуточный тип. Зеленый текст указывает на классические функции Robotics Toolbox, которые работают с собственными векторами и матрицами MATLAB®. Жирный текст указывает на класс Toolbox. Class.type() указывает на статический фабричный метод, который создает объект класса из входных данных этого типа. Функции, начинающиеся с точки, являются методами класса, соответствующего этой строке. Таблица 2.2. Поддерживаемые Toolbox типы данных для представления 3D-положения: конструкторы и преобразования Тип входа Тип выхода t Euler RPY θ, υ R T Вектор Twist Twist UnitQuaternion SO3 SE3 t (3-вектор) Euler (3-вектор eul2r eul2tr UnitQuaternion. SO3.eul() SE3.eul() eul() RPY (3-вектор) rpy2r rpy2tr UnitQuaternion. SO3.rpy() SE3.rpy() rpy() transl angvec2r angvec2tr θ, υ (скаляр + 3-вектор) tr2eul tr2rpy tr2angvec r2t trlog R (матрица 3×3) trlog T (матрица 4×4) transl tr2eul tr2rpy tr2angvec t2r trexp trexp Вектор Twist (3- или 6-вектор) .T .S Twist .toeul .torpy .toangvec .R .T Unit-Quaternion .toeul .torpy .toangvec .R .T .log SO3 .t .toeul .torpy .toangvec .R .T .log SE3 Twist('T') Twist() SE3() UnitQuaternion. SO3. angvec() angvec() SE3. angvec() UnitQuaternion() SO3() SE3() UnitQuaternion() SO3() SE3() Twist() SO3.exp() SE3.exp() .SE .SO3 UnitQuaternion .Twist UnitQuaternion .SE3 .SE3 .SO3 Темно-серые прямоугольники означают невозможность преобразования. Светло-серые прямоугольники – возможные преобразования, но в Toolbox нет прямого преобразования, вам нужно вам нужно выполнять преобразование через промежуточный тип. Зеленый текст указывает на классические функции Robotics Toolbox, которые работают с собственными векторами и матрицами MATLAB®. Class.type() указывает на статический фабричный метод, который создает объект класса из входных данных этого типа. Функции, начинающиеся с точки, являются методами класса, соответствующего этой строке. Подведение итогов 117 Таблица 2.3. Таблица замен классических функций Toolbox, которые работают с матрицей и возвращают ее, на соответствующие новые классы и методы Ориентация Классические rot2 Новые SO2 trplo2 rotx, roty, rotz .plot SO3.Rx, SO3.Ry, SO3.Rz eul2r, rpy2r angvec2r oa2r SO3.eul, SO3.rpy SO3.angvec SO3.oa tr2eul, tr2rpy tr2angvec trexp trlog trplot .toeul, .torpy .toangvec SO3.exp .log .plot Положение Классические trot2 transl2 trplot2 trotx, troty, trotz T = transl(v) eul2tr, rpy2tr angvec2tr oa2tr v = transl(T) tr2eul, tr2rpy tr2angvec trexp trlog trplot Новые SE2 SE2 .plot SE3.Rx, SE3.ry, SE3.Rz SE3(v) SE3.eul, SE3.rpy SE3.angvec SE3.oa .t, .transl .toeul, .torpy .toangvec SE3.exp .log .plot Функции, начинающиеся с точки, являются методами новых объектов. Вы можете использовать их в функциональной форме toeul(R) или в точечной форме R.toeul() или R.toeul. Это вопрос личных предпочтений. Замыкающие круглые скобки не требуются, если аргументы не передаются, но это полезное соглашение и напоминание о том, что вы вызываете метод, не считывая свойство. Старая функция transl появляется дважды, так как она отображает вектор в матрицу, а также инверсию. 2.5 Подведение итогов В этой главе вы научились представлять точки и положения в двух- и трехмерных мирах. Точки представлены векторами координат относительно начала системы координат. Набор точек, принадлежащих твердому объекту, может быть описан системой координат, а составляющие его точки описываются постоянными векторами в системе координат объекта. Положение и ориентация любой системы координат могут быть описаны относительно другой системы координат посредством ее относительного положения ξ. Мы можем рассматривать относительное положение как движение – движение твердого тела, – и эти движения могут применяться последовательно. Важно помнить, что композиция некоммутативна – порядок, в котором применяются относительные положения, имеет значение. В этой главе было показано, как относительные положения могут быть выражены в виде графа положения или описаны алгебраическим выражением. Мы также можем использовать относительное положение для преобразования вектора из одной системы координат в другую. Простое графическое представление ключевых понятий дано на рис. 2.20. 118 Глава 2 · Представление позиции и ориентации Отображает координатный вектор из системы {B} в {A} произносится «кси» Положение {B} относительно системы {A} Относительное движение из системы {A} в систему {B} Мы обсудили различные математические объекты, позволяющие наглядно представлять положение. Мы использовали ортонормированные матрицы вращения для двух- и трехмерного случая для представления ориентации и показали, как они могут вращать вектор координат точек из одной системы координат в другую. Их расширенный вариант, матрицы однородного преобразования, можно использовать для представления как ориентации, так и перемещения, и мы показали, как они могут вращать и перемещать точку, выраженную в однородных координатах, из одной системы в другую. Вращение в трех измерениях имеет свои тонкости и сложности, поэтому мы рассмотрели различные способы параметризации, такие как углы Эйлера, углы крена-тангажа-рысканья и единичные кватернионы. Используя теорию групп Ли, мы показали, что матрицы вращения из группы SO(2) или SO(3) являются результатом возведения в степень кососимметричных порождающих матриц. Точно так же однородные матрицы преобразования из группы SE(2) или SE(3) являются результатом возведения в степень дополненных кососимметричных порождающих матриц. Мы также ввели понятие кручения как краткий способ описания относительного положения через вращение вокруг оси винта – понятие, которое пришло к нам из теории винтов, и эти кручения являются уникальными элементами порождающих матриц. Из этой главы можно извлечь два важных урока. Во-первых, существует много математических объектов, которые можно использовать для представления положения, и они сведены в табл. 2.4. Нет правильного или неправильного способа – у каждого есть сильные и слабые стороны, и мы обычно выбираем представление, подходящее для рассматриваемой задачи. Иногда нам нужно векторное представление, возможно, для интер- Рис. 2.20. Все, что вам нужно знать о положении Подведение итогов 119 поляции, и в этом случае могут быть подходящими (x, y, θ) или (x, y, z, Γ ), но такое представление не может быть легко составлено. Иногда нам может понадобиться описать только трехмерное вращение, и в этом случае подходит Γ или q̊. Переход между представлениями не вызывает труда и выполняется, как показано в табл. 2.1 и 2.2. Второй урок заключается в том, что системы координат – большое благо. Важным первым шагом во многих задачах машинного зрения и робототехники является присвоение координатных систем всем интересующим объектам, указание относительных положений в виде ориентированного графа и запись уравнений для петель. На рис. 2.21 показано, как изготовить из бумаги систему координат, которую можно вращать в руках, что делает операции с координатами более осязаемыми. Не стесняйтесь, возьмите систему координат и поиграйте с ней. b z x y x z y Рис. 2.21. Создайте a свою собственную систему координат: a) загрузите файл PDF по адресу http://www. petercorke. com/axes.pdf; b) вырежьте его, согните по пунктирным линиям и скрепите степлером или клеем. Готово! Теперь у нас есть прочная основа для движения вперед. Обозначения определены и проиллюстрированы, и мы приступили к практической работе с MATLAB. Таблица 2.4. Краткое изложение различных конкретных представлений положения ξ, представленных в этой главе Позиция Ориентация Положение 2D 2-вектор Угол матрица вращения 2×2 Композиция + + * (угол, 2-вектор) матрица преобразования 3×3 * 3D 3-вектор 3-угловые Г: Эйлерова, RPY, … 2-векторные: oA (угол, вектор) Единичный кватернион q̊ матрица вращения 3×3 (3 угла, 3-вектор) (3-вектор, единич.кватернион) матрица преобразования 4×4 Композиция + * * * Операторы композиции Toolbox показаны синим цветом. Операторы, обозначенные символом , сложны для реализации, символом – менее сложны. 120 Глава 2 · Представление позиции и ориентации Дополнительное чтение Материал этой главы основан на гибриде математического и графического подходов, охватывающих случаи 2D и 3D с по­ мощью абстрактных представлений и операторов, которые постепенно обретают более осязаемые очертания. Стандартные учебники по робототехнике, такие как Kelly (2013), Siciliano et al. (2009), Spong et al. (2006), Craig (2005) и Paul (1981) вводят однородные матрицы преобразования для трехмерного случая, но различаются в своих подходах. В этих книгах также хорошо обсуждаются другие представления, такие как угловой вектор и трехугольное представление. В учебнике Spong et al. (2006, раздел 2.5.1) хорошо обсуждают сингулярности. В книге Lynch, Park (2017) рассматриваются стандартные матричные подходы, но также вводятся кручения и винты. Siegwart et al. (2011) детально описывают случай 2D в контексте мобильной робототехники. Кватернионы обсуждаются в Kelly (2013) и кратко в Siciliano et al. (2009). Книга Kuipers (1999) представляет собой очень доступное и исчерпывающее введение в кватернионы. Интерполяция кватернионов широко используется в компьютерной графике и анимации, и классическая статья Shoemake (1985) является очень популярным и легко читаемым введением в эту тему. Первой публикацией о кватернионах для робототехники, вероятно, является статья Taylor (1979), за которой последовали последующие работы Funda et al. (1990). В учебниках и научных статьях вы встретите множество различных обозначений поворотов и преобразований. В этой книге запись ATB используется для обозначения преобразования, задающего положение системы {B} относительно системы {A}. Часто встречается альтернативное обозначение TBA или даже BAT. Для обозначения точек в этой книге используется запись ApB, соответствующая вектору от начала системы координат {A} до точки B, тогда как другие авторы используют pBA или даже CpBA для обозначения вектора от начала системы координат {A} до точки B, но относительно системы координат {C}. Кручения могут быть записаны либо как (υ, ω), как в этой книге, либо как (ω, υ). Исторические обзоры. Гамильтон и его сторонники, включая Питера Тейта, энергично защищали первенство Гамильтона в изобретении кватернионов и выступали против концепции векторов, которые тогда только начинали понимать и использовать. Родригес разработал названную его именем формулу в 1840 г., хотя Гаусс открыл ее в 1819 г., но, как обычно, не опубликовал. Его труд был опубликован лишь в 1900 г. У кватернионов было бурное начало. Статья Альтманна (Altmann, 1989) представляет Подведение итогов 121 собой интересное описание этой борьбы идей, и кватернионы даже были вплетены в художественную литературу (Pynchon, 2006). Упражнения 1. Изучите набор параметров функции trplot. 2. Анимируйте вращающийся куб. a. Напишите функцию для построения ребер куба с центром в начале координат. b. Измените функцию, чтобы она принимала аргумент, являющийся однородным преобразованием, которое применяется к вершинам куба перед построением графика. c. Анимируйте вращение вокруг оси x. d. Анимируйте вращение вокруг всех осей. 3. Создайте вектор-кватернионный класс для описания положения, который поддерживает композицию, обратное и точечное преобразование. 4. Создайте 2D-матрицу вращения. Визуализируйте вращение с по­мощью trplot2. Используйте матрицу для преобразования вектора. Инвертируйте ее и умножьте на исходную матрицу; что получилось? Обратите порядок умножения; что получилось? Что такое определитель матрицы и обратная матрица? 5. Создайте 3D-матрицу вращения. Визуализируйте вращение с по­мощью trplot или tranimate. Используйте матрицу для преобразования вектора. Инвертируйте ее и умножьте на исходную матрицу; что получилось? Обратите порядок умножения; что получилось? Что такое определитель матрицы и обратная матрица? 6. Вычислите матричную экспоненту, используя степенной ряд. Сколько членов ряда требуется, чтобы результат соответствовал стандартной точности MATLAB? 7. Сгенерируйте последовательность графиков, показанную на рис. 2.12. 8. Для трехмерного вращения вокруг вектора [2, 3, 4] на 0.5 рад вычислите матрицу вращения SO(3), используя: матричные экспоненциальные функции expm и trexp, формулу вращения Родригеса (напишите для нее код самостоятельно) и функцию Toolbox angvec2tr. Вычислите эквивалентный единичный кватернион. 9. Создайте две разные матрицы поворота в 2D или 3D, представляющие системы {A} и {B}. Определите матрицы вращения ARB и BRA. Выразите их как ось вращения и угол и сравните результаты. Выразите их как кручение. 122 Глава 2 · Представление позиции и ориентации 10. Создайте матрицу однородного преобразования в 2D или 3D. Визуализируйте смещение твердого тела с по­мощью tranimate. Используйте матрицу для преобразования вектора. Инвертируйте ее и умножьте на исходную матрицу; что получится в результате? Обратите порядок умножения; что получилось? 11. Создайте три символьные переменные для представления углов крена, тангажа и рыскания, а затем используйте их для вычисления матрицы вращения с по­мощью rpy2r. Вы можете применить к результату функцию simplify. Используйте ее, чтобы преобразовать единичный вектор в z-направлении. Глядя на элементы матрицы вращения, разработайте алгоритм для определения углов крена, тангажа и рыскания. Совет – сначала определите угол тангажа. 12. Поэкспериментируйте с приложением tripleangle в Toolbox. Исследуйте движения по крену, тангажу и рысканию относительно номинального положения и сингулярностей. 13. Если у вас есть iPhone или iPad, загрузите из App Store бесплатное приложение Euler Angles от École de Technologie Supérieure и поэкспериментируйте с ним. 14. Используя уравнение 2.24 покажите, что TT −1 = I. 15. Совпадает ли обратная матрица однородной матрицы преобразования с результатом ее транспонирования? 16. В разделе 2.1.2.2 мы вращали систему координат вокруг произвольной точки. Выведите выражение для вычисления RC, которое было дано в готовом виде. 17. Изучите влияние отрицательных углов крена, тангажа или рыскания. Дает ли преобразование из углов RPY к матрице вращения, а затем обратно к углам RPY результат, отличный от начального значения, как и для углов Эйлера? 18. Вернитесь к разделу 2.3.3 и покажите, что e xe y ≠ e x+y для случая матриц. Подсказка: разложите первые несколько членов степенного ряда. 19. Ось z камеры параллельна вектору [0, 1, 0] в мировой системе координат, а ось y параллельна вектору [0, 0, −1]. Как выглядит позиция камеры по отношению к мировой системе координат, выраженная в виде матрицы вращения и единичного кватерниона? Часть IIКомпьютерное зрение Глава 3 Глава 4 Глава 5 Свет и цвет Изображения и их обработка Извлечение признаков изображения Часть II Компьютерное зрение Зрительное восприятие – это процесс определения по образам, что именно присутствует в окружающем мире и где именно оно находится. Дэвид Марр В этой части книги мы обсудим процесс ви́дения (зрительного восприятия) от начала до конца: свойства света, падающего на сцену, как он отражается от объектов, как его захватывает камера и превращает в цифровое изображение. Мы обрабатываем это изображение, используя различные алгоритмы, чтобы извлечь из него краткую информацию, пригодную для достаточно скромных зрительных способностей робота. Мы начинаем главу 3 с обсуждения света и, в частности, цвета, потому что это очень важная характеристика мира, который мы воспринимаем. Хотя мы изучаем цвет в детском саду, это сложная тема, которую часто плохо понимают. Получение изображений и основные алгоритмы обработки изображений рассматриваются в главе 4; на них основаны алгоритмы извлечения признаков, обсуждаемые в главе 5. Извлечение признаков – это задача сокращения данных, извлечения сущности сцены из огромного количества пикселей. Например, чтобы определить координаты и размер круглого красного объекта, нам необходимо каким-то образом получить всего четыре байта из миллионов байтов, составляющих изображение. Чтобы решить эту задачу, мы должны ответить на множество важных промежуточных вопросов, таких как «что такое красный цвет?», «как мы можем отличить красные пиксели от не красных?», «как мы описываем форму красных пикселей?», «что, если красные пиксели принадлежат более, чем одному красному объекту?» и т. д. Глава 3 Свет и цвет Я не могу притворяться, что беспристрастен к разным цветам. Я радуюсь ярким вещам и искренне сочувствую коричневым беднягам. Уинстон Черчилль В древности считалось, что глаз излучает конусообразный зрительный поток, который соприкасается с видимыми объектами мира, создавая у наблюдателя ощущение, подобное осязанию, но на расстоянии, – это теория экстрамиссии. Сегодня мы считаем, что часть света, падающего на сцену от источника, отражается в глаза наблюдателя, чтобы создать представление об этой сцене. Свет, достигающий глаза или камеры, является функцией от количества света, падающего на сцену, и свойства материала сцены, называемого отражательной способностью. Эта глава посвящена самому свету и нашему восприятию света с точки зрения яркости и цвета. Раздел 3.1 описывает свет с точки зрения электромагнитного излучения и смесей света в виде непрерывных спектров. Раздел 3.2 представляет собой краткое введение в колориметрию – науку о восприятии цвета, трехцветном восприятии цвета человеком и о том, как цвета могут быть представлены в различных цветовых пространствах. Раздел 3.3 охватывает ряд дополнительных тем, таких как постоянство цвета, гамма-коррекция и баланс белого. В разделе 3.4 приведены два рабочих примера приложений, предназначенных для различения цветных объектов на изображении и удаления теней с изображения. 3.1 Спектральное представление света Примерно в 1670 г. сэр Исаак Ньютон обнаружил, что белый свет представляет собой смесь разных цветов. Теперь мы знаем, что каждый из этих цветов соответствует одной частоте или 126 Глава 3 · Свет и цвет длине волны электромагнитного излучения. Мы воспринимаем длины волн от 400 до 700 нм как разные цвета, как показано на рис. 3.1. Длина волны (нм) Рис. 3.1. Спектр видимых цветов как функция длины волны в нанометрах. Видимый диапазон зависит от условий просмотра и человека, но обычно принимается равным 400–700 нм. Длины волн более 700 нм называются инфракрасными, а менее 400 нм – ультрафиолетовыми В большинстве случаев свет, который мы наблюдаем, представляет собой смесь волн различной длины и может быть представлен в виде функции E(λ), описывающей интенсивность как функцию длины волны λ. Монохроматический свет, например испускаемый лазером, содержит строго одну длину волны, и в этом случае Е является спектральным импульсом. Наиболее распространенным источником света является лампа накаливания, которая работает по принципу излучения света от горячего тела, такого как Солнце или нить накала традиционной лампочки. В физике это явление моделируется как излучающее черное тело (blackbody radiator), или планковский источник. Излучаемая мощность как функция длины волны λ определяется формулой излучения Планка: (3.1) c = 2.998×108 м/с. где T – абсолютная температура (K) источника, h – постоянная h = 6.626×10–34 Дж·с. Планка, k – постоянная Больцмана и c – скорость света . Это k = 1.381×10–23 Дж/К. мощность, излучаемая на стерадиан на единицу площади на Телесный угол измеряется в стераединицу длины волны. дианах (ср), полная Мы можем построить спектры излучения абсолютно черного сфера равна 4π ср. тела при разных температурах. Сначала определим диапазон длин волн: >> lambda = [300:10:1000]*1e-9; Спектр света. Во время эпидемии чумы 1665–1666 гг. Исаак Ньютон разработал свою теорию света и цвета. Он показал, что призма может разложить белый свет на спектр цветов, а линза и вторая призма могут преобразовать многоцветный спектр в белый свет (набросок Ньютона слева). Ньютон обнаружил еще один важный факт: цвет света не меняется при отражении от разных объектов, из чего он сделал вывод, что цвет является внутренним свойством света, а не объекта. a Нормализованная E(λ) E(λ) (W ср–1 м–2 м–1) 1013 Спектральное представление света 127 Длина волны (нм) b Вольфрамовая нить лампы (2600К) Солнце (5778 K) Чувствительность глаза Длина волны (нм) Рис. 3.2. Спектры черного тела: a) спектры излучения черного тела для температур от 3000 до 6000 K; b) излучение черного тела для температуры Солнца (5778 K), вольфрамовой нити лампы (2600 K) и кривая чувствительности человеческого глаза – все значения нормализованы к единице для наглядности в данном случае от 300 до 1000 нм, а затем вычислим спектры абсолютно черного тела >> for T=3000:1000:6000 >> plot( lambda, blackbody(lambda, T)); hold all >> end как показано на рис. 3.2а. Мы можем видеть, что по мере увеличения температуры максимальное количество мощности увеличивается, а длина волны, на которой возникает пик, уменьшается. Общее количество излучаемой мощности (на единицу площади) представляет собой площадь под кривой абсолютно черного тела и определяется законом Стефана–Больцмана: а длина волны, соответствующая пику кривой черного тела, определяется законом смещения Вина: Инфракрасное излучение было открыто в 1800 г. Уильямом Гершелем (1738–1822), британским астрономом немецкого происхождения. Он был придворным астрономом Георга III; построил серию больших телескопов; со своей сестрой Кэролайн провел первый обзор неба, обнаружив двойные звезды, туманности и планету Уран; и изучал спектры звезд. Используя призму и термометры для измерения количества тепла в различных цветах солнечного света, он заметил, что температура увеличивалась от синего до красного и еще больше повышалась за пределами красного, где не было видимого света (изображение из рукописи Гершеля 1800 г.). 128 Глава 3 · Свет и цвет Длина волны пика уменьшается по мере по- Начальное красное каление 770–820 К, вышения температуры, и мы можем наблюдать темно-красное каление 920–1020 К, ярко-красное каление 1120–1220 К, это явление, нагревая объект. Он начинает све- желтовато-красное каление 1320–1420 К, титься слабо красным при температуре около начальное белое каление 1520–1620 К, 800 К и переходит от оранжевого и желтого к бе- белое каление 1720–1820 К. лому по мере повышения температуры . Вольфрамовая нить лампы накаливания имеет температуру 2600 К и раскаляется добела. Солнце имеет температуру поверхности 5778 К. Спектры этих источников >> lamp = blackbody(lambda, 2600); >> sun = blackbody(lambda, 5778); >> plot(lambda, [lamp/max(lamp) sun/max(sun)]) сравниваются на рис. 3.2b. Кривая вольфрамовой нити намного ниже по величине, но увеличена (в 56 раз) для наглядности. Пик интенсивности излучения Солнца приходится на длину волны около 500 нм, и оно излучает значительную мощность в видимой части спектра. Пик излучения вольфрамовой лампы приходится на гораздо большую длину волны, и большая часть ее мощности приходится на инфракрасный диапазон, который мы воспринимаем как тепло, а не свет. Сэр Хемфри Дэви продемонстрировал первую электрическую лампу накаливания с использованием платиновой нити в 1802 г. Затем в 1850 г. сэр Джозеф Свон продемонстрировал свои первые электрические лампочки с использованием нити накаливания из углеродистой бумаги. Однако только после появления в 1865 г. мощных вакуумных насосов такие лампы начали служить достаточно долго, чтобы найти массовое применение. Свон запатентовал карбонизированную хлопковую нить в 1878 г. и карбонизированную целлюлозную нить в 1881 г. Его лампы стали широко применяться после 1880 г., а театр «Савой» в Лондоне был полностью освещен электричеством в 1881 г. В США Томас Эдисон не начинал исследования ламп накаливания до 1878 г., но в следующем году он запатентовал долговечную карбонизированную бамбуковую нить и смог начать их массовое производство. Компании Свона и Эдисона объединились в 1883 г. Впоследствии лампа накаливания стала доминирующим источником света на планете, но в настоящее время от нее отказываются изза низкой энергоэффективности. (Фото Дугласа Брэкетта, Inv., Edisonian.com.) Спектральное представление света 129 3.1.1 Поглощение Спектр Солнца на поверхности Земли измерен и сведен в таб­ лицу: >> sun_ground = loadspectrum(lambda, 'solar'); >> plot(lambda, sun_ground) График спектральной интенсивности показан на рис. 3.3а. Он заметно отличается от графика излучения идеального черного тела при аналогичной температуре, поскольку некоторые длины волн поглощаются атмосферой больше, чем другие. В ходе эволюции пиковая чувствительность нашего глаза максимально приблизилась к пику спектра солнечного света, прошедшего через атмосферу. a T(λ) E(λ) (W ср–1 м–2 м–1) 108 Солнце на пов.земли Солнце (абс. черн. тело) Чувств. глаза человека Длина волны (нм) b Длина волны (нм) Рис. 3.3. a) Модифицированный солнечный спектр на уровне земли (синяя линия). Провалы в солнечном спектре соответствуют различным полосам поглощения воды. СО2 поглощает излучение в инфракрасной области, а озон О3 сильно поглощает в ультрафиолетовой области. Спектр черного тела с температурой Солнца показан синим пунктиром, а чувствительность человеческого глаза показана красным. b) Прохождение света через 5 м воды. Более длинные волны (красные) были сильно ослаблены Коэффициент пропускания T является обратной величиной коэффициента поглощения и представляет собой долю прошедшего света в зависимости от длины волны и пройденного расстояния. Он описывается законом Бера: T = 10–Ad, (3.2) где A – коэффициент поглощения в единицах м–1, который является функцией длины волны, а d – длина оптического пути. Спектр поглощения A(λ) для воды мы можем получить из табличных данных >> [A, lambda] = loadspectrum([400:10:700]*1e-9, 'water'); 130 Глава 3 · Свет и цвет а пропускание через 5 м воды равно: >> d = 5; >> T = 10.^(-A*d); >> plot(lambda, T); Результат изображен на рис. 3.3b. Мы видим, что красный свет сильно ослаблен, что делает объект более синим. Дифференциальное поглощение длин волн является серьезной проб­ лемой при съемке под водой, и мы вернемся к этой теме в разделе 3.3.4. 3.1.2 Отражение Поверхности отражают падающий свет. Отражение может быть зеркальным (например, блики от воды) или ламбертовым (рассеянное отражение от матовой поверхности). Доля отраженного света R ∈ [0, 1] представляет собой отражательную способность, коэффициент отражения (альбедо) поверхности и зависит от длины волны. Белая бумага, например, имеет отражательную способность около 70 %. Спектры отражения многих материалов были измерены и сведены в таблицы . Рассмотрим, к при- http://speclib.jpl. nasa.gov/, меру, отражательную способность красного кирпича: выветрившийся красный кирпич (0412UUUBRK). >> [R, lambda] = loadspectrum([100:10:10000]*1e-9, 'redbrick'); >> plot(lambda, R); a R(λ) R(λ) График на рис. 3.4 показывает, что он отражает красный свет больше, чем синий. Длина волны (мкм) b Длина волны (нм) Рис. 3.4. Отражение света от выветренного красного строительного кирпича (данные ASTER, Baldridge et al. 2009): a) полный диапазон измерений составляет от 300 нм в видимом диапазоне до 10 000 нм (в инфракрасном диапазоне); b) крупный план видимой части спектра Спектральное представление света 131 3.1.3 Яркость Если говорить о свете, отраженном от поверхности, его яркость имеет спектр, определяемый выражением (3.3) L(λ) = E(λ)R(λ) W м–2, где E – падающее освещение, а R – коэффициент отражения. Освещенность от прямого излучения Солнца в видимой области равна >> lambda = [400:700]*1e-9; >> E = loadspectrum(lambda, 'solar'); на уровне земли. Отражательная способность кирпича: >> R = loadspectrum(lambda, 'redbrick'); а свет, отраженный от кирпича: >> L = E .* R; >> plot(lambda, L); W ср–1 м–2 м–1 108 что показано на рис. 3.5. Именно этот спектр интерпретируется нашими глазами как красный цвет. Рис. 3.5. Яркость обветренного красного кирпича дома при солнечном освещении на уровне земли, по данным рис. 3.3a и 3.4b Длина волны (нм) 132 Глава 3 · Свет и цвет 3.2 Цвет Цвет – это совокупное название всех ощущений, возникающих в результате деятельности сетчатки глаза и связанных с ней нервных механизмов, причем эта активность почти во всех случаях у нормального человека является специфической реакцией на лучистую энергию с определенной длиной волны и интенсивностью. Т. Л. Троланд, отчет комитета Оптического общества Америки по колориметрии 1920–1921 гг. Мы описали спектр света с точки зрения мощности как функции длины волны, но наше собственное восприятие света основано на субъективных величинах, таких как яркость и цвет. Свет, видимый человеку, находится в диапазоне длин волн от 400 нм (фиолетовый) до 700 нм (красный) с синим, зеленым, желтым и оранжевым цветом между ними, как показано на рис. 3.1. Яркость, которую мы связываем с определенной длиной Это фотопический волны, задается функцией светимости (luminosity, фототопи- отклик светоадаптированного глаза ческая яркость). Для нашего дневного (фотопического) зрения с использованием яркость как функция длины волны была экспериментально из- колбочковых фотомерена, сведена в таблицу и легла в основу стандарта CIE 1931 г., рецепторных клеток. Адаптированный который описывает восприятие среднего человека-наблюдате- к темноте, или скотопический, отклик ля . В Toolbox имеется функция фотопической яркости: с использованием монохроматических стержневых фоторецепторных клеток глаза отличается Ее график показан на рис. 3.7а. Возьмем два источника света, и достигает макизлучающие одинаковую мощность (в ваттах), но один из них симума при длине имеет длину волны 550 нм (зеленый), а другой – 450 нм (синий). волны около 510 нм. >> human = luminos(lambda); >> plot(lambda, human) Воспринимаемая яркость этих двух источников света совершенно различна, и синий свет выглядит на 3.8 % ярче зеленого: >> luminos(450e-9) / luminos(550e-9) ans = 0.0382 Кремниевые датчики, используемые в цифровых камерах, обладают высокой чувствительностью в красной и инфракрасной частях спектра . Светодиод на инфракрасном пульте дистанционного управления в большинстве цифровых камер выглядит как источник яркого света – попробуйте посветить в камеру мобильного телефона пультом от телевизора. Некоторые камеры для охранных систем обеспечивают инфракрасную подсветку сцены для скрытого наблюдения в ночное время. Имейте в виду, что некоторые камеры оснащены инфракрасными фильтрами, чтобы предотвратить насыщение (засветку) сенсора инфракрасным излучением. Цвет 133 Радиометрические и фотометрические величины. При обсуждении света используются два совершенно разных набора единиц: радиометрические и фотометрические. Радиометрические единицы используются в разделе 3.1 и основаны на таких величинах, как мощность, которые выражаются в привычных единицах СИ, таких как ватты. Фотометрические единицы являются аналогами радиометрических единиц, но учитывают зрительные ощущения наблюдателя. Световая мощность или световой поток – это воспринимаемая мощность источника света, измеряемая в люменах (лм), а не в ваттах. Монохроматический источник света мощ­ностью 1 Вт на длине волны 555 нм, соответствующей пиковому отклику человеческого глаза, по определению излучает световой поток 683 лм. Напротив, источник света мощностью 1 Вт на длине волны 800 нм излучает световой поток 0 лм – он вообще не вызывает визуальных ощущений. Однако лампа накаливания мощностью 1 Вт создает воспринимаемое визуальное ощущение менее 15 лм или светоотдачу 15 лм/Вт. Люминесцентные лампы достигают эффективности до 100 лм/Вт, а белые светодиоды до 150 лм/Вт. 3.2.1 Человеческий глаз Наши глаза содержат два типа светочувствительных клеток, как показано на рис. 3.6. Палочки гораздо более чувствительны, чем колбочки, но реагируют только на интенсивность света и используются ночью. В нормальных условиях дневного света наши фоторецепторы колбочек активны и чувствительны к цвету. Люди являются трихроматами и имеют три типа колбочек, которые реагируют на разные части спектра. Они условно называются длинными (L, long), средними (M, medium) и короткими (S, short) в зависимости от длины волны их пикового Рис. 3.6. Цветная микрофотография палочек (белые объекты) и колбочек (желтые объекты) в человеческом глазу, сделанная сканирующим электронным микроскопом. Диаметр клеток находится в пределах 0.5–4 мкм. Клетки содержат различные типы светочувствительных белков – опсинов. Удивительно, но палочки и колбочки находятся не на поверхности сетчатки, а за ее поверхностью, которая представляет собой сеть нервов и кровеносных сосудов 134 Глава 3 · Свет и цвет отклика или, чаще, как красные, зеленые и синие. Спектральная реакция палочек и колбочек была тщательно изучена, и реакция клеток колбочек человека может быть загружена из готовой таблицы при помощи кода >> cones = loadspectrum(lambda, 'cones'); >> plot(lambda, cones) где cones имеет три столбца, соответствующие откликам колбо- Разные спектральные характеристики чек L, M и S, и каждая строка соответствует длине волны в lamb- обусловлены разda. Спектральный отклик колбочек L(λ), M(λ) и S(λ) показан на ными фотопсинами в колбочках. рис. 3.7b . Сетчатка человеческого глаза имеет центральную, или фовеальную, область диаметром всего 0.6 мм, имеет поле зрения 5° и содержит большую часть из 6 млн колбочек: 65 % воспринимают красный цвет, 33 % – зеленый и только 2 % – синий. Мы бессознательно сканируем нашей «зрительной ямкой высокого разрешения» весь видимый мир вокруг себя, чтобы создать крупномасштабный мысленный образ окружающей обстановки. Кроме того, по сетчатке распределено 120 млн палочек, которые также чувствительны к движению. Сенсор в цифровой камере аналогичен сетчатке, но вместо Если точнее, выходной сигнал палочек и колбочек на кремниевом чипе находится упорядо- пропорционален ченный массив светочувствительных фотоячеек (или пикселей). общему количеству Каждая фотоячейка имеет площадь порядка 1–10 мкм и выдает фотонов, захваченных фотоячейкой сигнал, пропорциональный интенсивности света, падающего с момента последна ее поверхность . В цветной камере фотоячейки прикрыты него считывания. цветными фильтрами, которые пропускают красный, зеленый Опсины – это молекулы фоторецепторов в основе зрительных систем всех животных. Они принадлежат к классу рецепторов, связанных G-белком (GPCR), и состоят из семи спиралей, проходящих через клеточную мембрану. Они меняют форму в ответ на определенные молекулы вне клетки и инициируют каскад химических сигнальных событий внутри клетки, что приводит к изменению состояния клетки. Опсины содержат хромофор – светочувствительную тело клетки молекулу, называемую ретиналем и получаемую из витамина А, которая проходит через опсин. Когда сетчатка поглощает фотон, молекула ретиналя меняет свою форму, тем самым деформирует опсин и активирует сигнальный путь клетки. Основой любого зрения является случайная генетическая мутация 700 млн лет назад, которая сделала химический чувствительный рецептор светочувствительным. В животном мире существует множество вариантов опсинов: наши палочки содержат родопсин, а колбочки – фотопсины. Американский биохимик Джордж Уолд (1906–1997) получил Нобелевскую премию по медицине 1967 г. за открытие сетчатки и характеристику спектрального поглощения фотопсинов. (Изображение d-пирана из «Википедии», хромофор указан стрелкой.) Цвет 135 Трехкомпонентная теория цветового зрения предполагает, что наши глаза имеют три дискретных типа рецепторов, которые при стимуляции производят ощущения красного, зеленого и синего цветов, и что все цветовые ощущения представляют собой «психологические смеси» этих основных цветов. Впервые она была предложена английским ученым Томасом Янгом (1773–1829) в 1802 г., но не получила большого признания. Позже ее отстаивали Гельмгольц и Максвелл. На рисунке слева показано, как смешиваются лучи красного, зеленого и синего света. Гельм­ гольц (1821–1894) был плодовитым немецким врачом и физиком. Он изобрел офтальмоскоп для исследования сетчатки в 1851 г., а в 1856 г. опубликовал Handbuch der physiologischen Optik («Справочник по физиологической оптике»), в котором содержались теории и экспериментальные данные, касающиеся восприятия глубины, цветового зрения и восприятия движения. Максвелл (1831–1879) был шотландским ученым и в основном известен как автор уравнений электромагнитного поля, но также изучал цветовосприятие, дальтонизм и теорию цвета. Его статья 1860 г. «О теории цветового зрения» получила медаль Румфорда, а в 1861 г. он продемонстрировал цветную фотографию в лекции Королевского института. лм/Вт–1 Отклик колбочки красная (L) колбочка зеленая (M) колбочка синяя (S) колбочка a Длина волны (нм) b Длина волны (нм) Рис. 3.7. a) Кривая светимости для обычного человека-наблюдателя. Пик отклика составляет 683 лм/Вт при 555 нм (зеленый). b) Спектральный отклик колбочек человека (нормированный) Теория противоположных цветов утверждает, что цвета воспринимаются по двум осям: «красный–зеленый» и «синий–желтый». Одна подсказка исходит от цветных остаточных изображений – если долго смотреть на красный квадрат, а затем перевести взгляд на белую поверхность, то мы ощутим зеленое остаточное изображение. Еще одна подсказка исходит из языка – мы комбинируем слова для описания оттенков, например красновато-синего, но никогда не описываем красновато-зеленый или синевато-желтый. Эта теория была впервые выдвинута немецким писателем Иоганном Вольфгангом фон Гёте (1749–1832) в его «Теории цвета» 1810 г., но позже нашла сильного сторонника в лице Карла Эвальда Геринга (1834–1918), немецкого физиолога, который также изучал бинокулярное зрение и движения глаз. Он был сторонником теории противоположных цветов, а не трехкомпонентной теории и вел острые дебаты с Гельмгольцем по этой теме. На самом деле справедливы обе теории. В наших глазах есть три типа цветочувствительных клеток, но начальная обработка в ганглиозном слое сетчатки, по-видимому, преобразует эти сигналы в представление противоположных цветов. 136 Глава 3 · Свет и цвет или синий цвет на нужные фотоячейки. Спектральный отклик фильтров является функциональным эквивалентом отклика колбочек M(λ), показанного на рис. 3.7b. Очень распространенной схемой расположения цветовых фильтров является шаблон Байера, показанный на рис. 3.8. Он использует периодический шаблон 2´2, состоящий из двух зеленых фильтров, одного красного и одного синего . Отдельный пиксель не может обеспечить независимые измерения интенсивности красного, зеленого и синего, но их можно оценить. Например, количество красного в пикселе, чувствительном к синему, получается интерполяцией значений его соседей, чувствительных к красному. Более дорогие камеры типа «3 CCD» могут выполнять независимые измерения для каждого пикселя, поскольку свет разделяется набором призм, фильтруется и подается на отдельную матрицу CCD для каждого основного цвета. Файлы необработанных изображений цифровой камеры (raw-файлы) содержат фактические значения фотоячеек после фильтра Байера. Массивы фильтров 3×3 или 4×4 позволяют создавать множество интересных конструкций камер. Использование более трех различных цветовых фильтров позволяет создавать мультиспектральные камеры с лучшим цветовым разрешением, ряд фильтров нейтральной цветовой плотности (серых) приводит к созданию камеры с расширенным динамическим диапазоном, или эти различные фильтры можно смешивать, чтобы получить камеру с лучшим динамическим диапазоном и цветовым разрешением. Этот подход называется смешанным набором пикселей. Рис. 3.8. Структура фильтра Байера. Серые блоки представляют собой массив светочувствительных кремниевых фотоячеек, над которыми находится массив красных, зеленых и синих фильтров. Изобретен Брайсом Байером из Eastman Kodak, патент США № 3971065 3.2.2 Измерение цвета Путь света, попадающего в глаз, показан на рис. 3.9а. Спектр яркости L(λ) является функцией источника света и коэффициента отражения объекта, как показано в уравнении (3.3). Отклик каждого из трех типов колбочек будет следующим: ρ = òλ L(λ)Mr(λ)d λ; γ = òλ L(λ)Mq(λ)d λ; (3.4) β = òλ L(λ)Mb(λ)d λ, где Mr(λ), Mg(λ) и Mb(λ) – спектральные характеристики красных, зеленых и синих колбочек соответственно, как показано на рис. 3.7b. Отклик представляет собой трехкомпонентный вектор (ρ, γ, β), который в колориметрии известен как тристимулус (tristimulus). Для красного кирпича интегралы соответствуют площадям областей сплошного цвета на рис. 3.9b. Мы можем вычислить Цвет 137 тристимулус, аппроксимируя интегралы уравнения (3.4) как суммирование с dλ = 1 нм: >> sum( (L*ones(1,3)) .* cones * 1e-9) ans = 16.3571 10.0665 2.8225 Доминирующий отклик исходит от колбочек L, что неудивительно, поскольку мы знаем, что кирпич красный. Произвольный непрерывный спектр является вектором бесконечной размерности и не может быть однозначно представлен всего тремя параметрами, но их явно достаточно для нашего вида, и тристимулус позволяет нам прекрасно ориентироваться в различных природных средах. Следствием такоОсновные цвета не являются фундамен- го выбора представления является то, что один и тот же витальным свой- зуальный стимул будет производиться многими различными ством света – они спектрами, которые называются метамерами. Более важным являются фундаментальным свойством является следствие – произвольный визуальный стимул может наблюдателя. Три быть сгенерирован комбинацией всего трех монохроматичеосновных цвета ских стимулов. Это три основных цвета, о которых мы знаем существуют только потому, что у нас, с детства . Не существует уникального набора основных цвекак у трихроматов, тов – подойдут любые три, если ни один из них не может быть три типа колбочек. сопоставлен комбинацией других. CIE определил набор моноУ птиц будет четыре основных цвета, хроматических основных цветов, а их длины волн приведены а у собак – два. в табл. 3.1. Таблица 3.1. Основные цвета CIE 1976 (Commission Internationale de L’Éclairage 1987) представляют собой спектральные цвета, соответствующие эмиссионным линиям в парах ртути λ, нм красный 700.0 зеленый 546.1 синий 435.8 Экспонометры, освещенность и яркость. Фотографический экспонометр измеряет световой поток, который измеряется в лм·м−2 или люксах (лк). Сила света I точечного источника света представляет собой световой поток на единицу телесного угла, измеряемый в лм·ср−1 или канделах (кд). Освещенность Е, падающая нормально на поверхность, равна где d – расстояние между источником и поверхностью. Наружная освещенность в яркий солнечный день составляет примерно 10 000 лк. Уровни освещения в офисе обычно составляют около 1000 лк, а лунный свет дает освещенность около 0.1 лк. Яркость или светимость ламбертовой поверхности равна: Ls = Ei cos θ нт. Единицей измерения является кд·м–2 или нит (нт), где Ei – падающая освещенность под углом θ к нормали к поверхности. 138 Глава 3 · Свет и цвет отражение Яркость яркость освещенность 3.2.3 отклик Отклик колбочек источник света Освещенность Дальтонизм, или цветовая слепота, – это неспособность различать некоторые цвета, которые могут различать другие. Протанопия, дейтеранопия, тританопия обозначают отсутствие колбочек L, M и S соответственно. Более распространенными состояниями являются протаномалия, дейтераномалия и тританомалия, при которых мутируют пигменты колбочек и изменяется пиковая час­ тота ответа. Чаще всего это генетическое заболевание, поскольку красный и зеленый фотопсины закодированы в Х-хромосоме. Наиболее распространенной формой (встречающейся у 6 % мужчин, включая автора) является дейтераномалия, при которой реакция М-колбочек смещена в сторону красного конца спектра, что приводит к снижению чувствительности к зеленому цвету и плохому различению оттенков красного, оранжевого, желтого цвета и зеленой области спектра. Английский ученый Джон Дальтон (1766–1844) не отличал алый от зеленого, а розовый от голубого. Он предположил, что стекловидное тело в его глазах было окрашено в синий цвет, и приказал проверить его глаза после его смерти. Исследование установило, что стекловидное тело было совершенно чистым, но ДНК, недавно извлеченная из его сохранившегося глаза, показала, что он был дейтеранопом. Цветовую слепоту в обиходе часто называют дальтонизмом. Длина волны, нм Воспроизведение цветов Компьютерный или телевизионный дисплей способен воспроизводить переменное количество каждого из трех основных цветов в каждом пикселе. Основные цвета в электронно-лучевой трубке (cathode ray tube, CRT) создаются путем возбуждения люминофоров на задней стороне экрана с по­мощью управляемого электронного луча. В жидкокристаллическом дисплее (liquid crystal display, LCD) цвета получаются путем цветофильт­ Рис. 3.9. Принцип тристимулуса: a) путь света от источника света к глазу; b) внутри глаза присутствует три фильтра, и общий выход этих фильтров, области, показанные сплошным цветом, представляют собой значение тристимулуса Цвет 139 рации и ослабления белого света, излучаемого задней подсветкой, а OLED-дисплей содержит набор красных, зеленых и синих светодиодов в каждом пикселе. Важная проблема состоит в том, чтобы определить, какая часть каждого первичного сигнала требуется для соответствия заданному трехкомпонентному сигналу. Начнем с рассмотрения монохроматического компонента с длиной волны λS, который определяется как Реакция колбочек на этот компонент определяется уравнением (3.4), но, поскольку L(·) является импульсом, мы можем отбросить интеграл, чтобы получить три компонента: ρ = Lλ Mr(λS); γ = Lλ Mq(λS); (3.5) β = Lλ Mb(λS). Единицы выбираютРассмотрим следующие три монохроматических первичных ся таким образом, источника света, обозначенных R, G и B, с длинами волн λr, λg чтобы одинаковое количество основ- и λb и интенсивностью R, G и B соответственно . Три цветовых ных цветов выгляде- компонента этого источника света будут следующими: ло белым. ρ = RMr(λ r) + RMr(λ q) + RMr(λ b); γ = RMq(λ r) + RMq(λ q) + RMq(λ b); (3.6) β = RMb(λ r) + RMb(λ q) + RMb(λ b). Понятие основных цветов очень старо, но их количество (от двух до шести) и их цвет были предметом многочисленных споров. Большая часть путаницы возникла из-за использования аддитивных основных цветов (красный, зеленый и синий), которые используются при смешивании света, и субтрактивных основных цветов (голубой, пурпурный, желтый), используемых при смешивании красок или чернил. Также обсуждался вопрос о том, являются ли черный и белый основными цветами. Чтобы воспринимаемый цвет сочетания этих трех источников света соответствовал цвету монохроматического стимула, два тристимулуса должны быть равными. Приравняем уравнение (3.5) и уравнение (3.6) и компактно запишем в матричной форме как 140 Глава 3 · Свет и цвет а затем решим для необходимого количества основных цветов: (3.7) Этот тристимулус имеет спектр, состоящий из трех импульсов (по одному на первичный цвет), но выглядит точно так же, как исходный цвет непрерывного спектра, – это основа трихроматического баланса. Матрица 3´3 постоянна, но зависит от спектрального отклика колбочек на выбранные основные цвета (λr, λg, λb). Правая часть уравнения (3.7) – это просто функция от λS, которую мы можем записать в еще более компактной форме (3.8) – где – r (λ), g–(λ), b(λ) обозначают функции цветового баланса. Эти функции были эмпирически определены у подопытных людей и сведены в таблицу для стандартных основных параметров CIE, перечисленных в табл. 3.1. Их можно загрузить с по­мощью функции cmfrgb: >> lambda = [400:700]*1e-9; >> cmf = cmfrgb(lambda); >> plot(lambda, cmf); Полученный график показан на рис. 3.10. Каждая кривая показывает, какая часть соответствующего основного компонента требуется для визуального совпадения с монохроматическим светом с длиной волны λ. Например, чтобы создать ощущение света с длиной волны 500 нм (зеленого цвета), нам понадобятся следующие компоненты: >> green = cmfrgb(500e-9) green = -0.0714 0.0854 0.0478 Цвет 141 Функция цветового баланса CIE красн. CIE зелен. CIE син. Рис. 3.10. Функции цветового баланса 1931 г. для стандартного наблюдателя на основе стандартных основных цветов CIE 1976 г. Длина волны (нм) Удивительно, но для этого требуется значительное отрицательное количество красного основного цвета, и это проблематично, поскольку источник света не может иметь отрицательную яркость. Мы решаем проблему, добавляя немного белого света (R = G = B = w, см. раздел 3.2.8), чтобы все три компонента были положительными. Например: Эксперименты по балансу цветов выполняются с использованием источника света, состоящего из трех регулируемых ламп, соответствующих основным цветам, интенсивность которых можно регулировать индивидуально. Свет смешивается, рассеивается и сравнивается с некоторым тестовым цветом. Основные цвета, три лампы, обозначаются R, G и B, а их интенсивность – R, G и B соответственно. Интенсивности свечения трех ламп регулируются человеком-оператором до тех пор, пока они не будут соответствовать тестовому цвету. Совпадение обозначается выражением C ≡ RR + GG + BB, которое читается так: визуальный стимул C (тестовый цвет) совпадает или выглядит так же, как смесь трех основных цветов с яркостью R, G и B. Обозначение RR можно рассматривать как лампу R с интенсивностью R. Эксперименты показывают, что сопоставление цветов подчиняется алгебраическим правилам аддитивности и линейности, известным как законы Грассмана. Например, два световых стимула С1 и С2 C1 ≡ R1R + G1G + B1B C2 ≡ R2R + G2G + B2B при смешивании будут давать следующий баланс: С1 + С2 ≡ (R1 + R2)R + (G1 + G2)G + (B1 + B2)B. 142 Глава 3 · Свет и цвет >> white = -min(green) * [1 1 1] white = 0.0714 0.0714 0.0714 >> feasible_green = green + white feasible_green = 0 0.1567 0.1191 Если вы сравните этот цвет с желаемым зеленым цветом 500 нм, то наверняка скажете, что сгенерированный цвет имеет правильный оттенок, но не такой насыщенный. Насыщенность обозначает чистоту цвета. Цвета спектра полностью насыщены, но становятся менее насыщенными (более пастельными) по мере добавления большего количества белого. В данном случае мы подмешали компонент светло-серого (7 %) цвета. Это приводит нас к очень важному моменту в отношении цветопередачи: невозможно воспроизвести все существующие цвета, используя только три основных цвета. Это интуитивно понятно, поскольку натуральный цвет представлен как бесконечномерная спектральная функция, а трехкомпонентный вектор может только аппроксимировать ее. Для более полного понимания нам нужно рассмотреть цветовые пространства. Функция cmfrgb Toolbox также может вычислять трехкомпонентное представление CIE для произвольного спектра. Спектр яркости красного кирпича, освещенного солнечным светом на уровне земли, был рассчитан ранее, а трехкомпонентная форма выглядит так: >> RGB_brick = cmfrgb(lambda, L) RGB_brick = 0.0155 0.0066 0.0031 Это соответствующие количества трех основных цветов CIE, сочетание которых воспринимается средним человеком как имеющее тот же цвет, что и натуральный кирпич при данных условиях освещения. 3.2.4 Цветовое пространство Трехкомпонентное представление описывает не только яркость, но и цвет. Относительные трехкомпонентные значения получаются путем нормализации абсолютных значений: (3.9) что даем нам координаты цветности r, g и b, которые инвариантны к общей яркости. По определению r + g + b = 1, поэтому Цвет 143 одна координата избыточна, и обычно учитываются только r и g. Поскольку влияние интенсивности было устранено, двухмерная величина (r, g) представляет цвет. Мы можем нанести геометрическое место (локус) спектральных цветов – цветов радуги – на диаграмму цветности, используя вариант функций цветового баланса: >> [r,g] = lambda2rg( [400:700]*1e-9 ); >> plot(r, g) >> rg_addticks и получим подковообразную кривую, показанную на рис. 3.11. Функция Toolbox lambda2rg вычисляет функцию цветового баланса (рис. 3.10) для заданной длины волны, а затем преобразует трехцветное значение в цветовые координаты, используя уравнения (3.9). Можно также нанести на график основные цвета CIE, перечисленные в табл. 3.1: >> primaries = lambda2rg( cie_primaries() ); >> plot(primaries(:,1), primaries(:,2), 'o') Они показаны на рис. 3.11 большими кружками. Рис. 3.11. Спектральный локус цветности на плоскости r–g. Монохроматические стимулы лежат на локусе, а рядом с ними подписаны длины волн в нм. Прямая линия, соединяющая крайние точки, является фиолетовой границей и местом насыщенного пурпурного цвета. Все возможные цвета лежат на этом локусе или внутри него. Стандартные основные цвета CIE отмечены большими кружками, а пунктирная линия указывает палитру цветов, которые могут быть представлены этими основными цветами Закон центра тяжести Грассмана гласит, что смесь двух цветов лежит вдоль линии между этими двумя цветами на плоскости цветности. Смесь N цветов лежит в области, ограниченной этими цветами. Если принимать во внимание рис. 3.11, это имеет важные последствия. Во-первых, поскольку все цветовые стимулы представляют собой комбинации спектральных стимулов, все реальные цветовые стимулы должны лежать на спектральном локусе или внутри него. Во-вторых, любые цвета, 144 Глава 3 · Свет и цвет Колориметрические стандарты. Колориметрия – сложная тема, и для нее очень важно иметь стандарты. Ведущую роль в этой области играют две организации – CIE и ITU. Международная комиссия по освещению (Commission Internationale de l’Eclairage, CIE) основана в 1913 г. и является независимой некоммерческой организацией, занимающейся международным сотрудничеством и обменом информацией по всем вопросам, касающимся науки и искусства света, цвета и зрения, а также технологий изображения. Восьмая сессия CIE была проведена в Кембридже, Великобритания, в 1931 г. На ней было принято международное соглашение по колориметрическим спецификациям и формализовано цветовое пространство XYZ. CIE признана ISO в качестве международного органа по стандартизации. Посетите сайт http://www.cie.co.at для получения дополнительной информации и наборов данных CIE. Международный союз электросвязи (International Telecommunication Union, ITU, МСЭ) является агентством Организации Объединенных Наций и создан для стандартизации и регулирования международной радиосвязи и телекоммуникаций. Он был основан как Международный телеграфный союз в Париже 17 мая 1865 г. Международный консультативный комитет по радио, или МККР (Comité Consultatif International des Radiocommunications, CCIR), в 1992 г. стал Бюро радиосвязи, или ITU-R. Он публикует стандарты и рекомендации, относящиеся к колориметрии, в своей серии BT (broadcasting service of television, вещательная служба телевидения). Посетите сайт http://www.itu.int для более подробной информации. которые мы получаем путем смешивания трех основных цветов, могут лежать только внутри треугольника, ограниченного основными цветами – цветовой палитрой. Из рис. 3.11 видно, что основные цвета CIE определяют лишь небольшое подмно- Мы могли бы увелижество всех возможных цветов – внутри пунктирного треу- чить гамму, выбрав другие основные гольника. Очень многие реальные цвета не могут быть созда- цвета; возможно, ны с использованием этих основных цветов, в частности цвета использование радуги, лежащие в спектральном локусе от 460 до 545 нм. На другого зеленого основного цвета самом деле, независимо от расположения основных цветов, не увеличило бы гамму, все возможные цвета могут быть воспроизведены . С точки но существует зрения геометрии внутри гаммы нет трех точек, образующих практическое ограничение поиска треугольник, включающий всю гамму. В-третьих, мы наблюда- источника света ем, что большая часть локуса требует отрицательного количе- (светодиода или люства красного основного цвета и не может быть представлена. минофора), который может эффективно Вспомним проблему, связанную с отображением зеленого воспроизводить этот цвета с длиной волны 500 нм. На рис. 3.12 показана цветность цвет. спектрального зеленого цвета >> green_cc = lambda2rg(500e-9) green_cc = -1.1558 1.3823 >> plot2(green_cc, 's') как маркер в виде звезды. Белый по определению соответствует условию R = G = B = 1, и его цветность Цвет 145 >> white_cc = tristim2cc([1 1 1]) white_cc = 0.3333 0.3333 >> plot2(white_cc, 'o') показана неокрашенным кружком. По закону Грассмана смесь нужного нам зеленого и белого должна лежать вдоль зеленой линии, соединяющей эти цвета. Цветность допустимого зеленого, вычисленная ранее, обозначена квадратом, но находится за пределами отображаемой палитры нестандартных основных цветов, используемых в этом примере. Наименее насыщенный отображаемый зеленый цвет находится на пересечении зеленой линии и границы палитры и обозначается треугольным маркером. Яркость здесь Ранее мы говорили, что в палитре нет трех точек, образуюимеет другое щих треугольник, включающий всю палитру. Поэтому в 1931 г. значение, чем то, что определено CIE предложила систему воображаемых нефизических основв разделе 3.1.3, ных цветов X, Y и Z, которые полностью охватывают спектральи может считаться здесь синонимом ный локус на рис. 3.11. X и Z имеют нулевую яркость – она полосвещенности. ностью зависит от Y . Таким образом, всем реальным цветам может соответствовать положительное количество этих трех Единицы выбраны основных цветов . Соответствующие трехцветные значения таким образом, что обозначаются как (X, Y, Z). для соответствия белому стимулу равной энергии требуется равное количество основных цветов. Рис. 3.12. Диаграмма цветности, показывающая цветовую палитру для нестандартных основных цветов при 600, 555 и 450 нм. Зеленый 500 нм (звезда), белый с равной энергией (пустой круг), допустимый зеленый (квадрат) и отображаемый зеленый (треугольник). Геометрическое место зеленых оттенков различной насыщенности показано зеленой линией Функции цветового баланса XYZ, определенные CIE >> cmf = cmfxyz(lambda); >> plot(lambda, cmf); графически представлены на рис. 3.13а. Графики показывают количество каждого основного цвета CIE XYZ, которое требуется для соответствия спектральному цвету, и мы отмечаем, что 146 Глава 3 · Свет и цвет эти кривые никогда не бывают отрицательными. Соответствующие координаты цветности: (3.10) Напомню, что x + y + z = 1, поэтому требуется только два параметра – по соглашению диаграмму цветности строят как функцию y от x. Спектральный локус может быть построен так же, как и раньше: >> [x,y] = lambda2xy(lambda); >> plot(x, y); Можно создать более сложный график, показывающий цвета Цвета, изображенные на рис. 3.1 в пределах спектрального локуса: >> showcolorspace('xy') как показано на рис. 3.13b . Эти координаты являются стандартным способом представления цвета для графики, печати и других целей. Например, координаты цветности зеленого пика (550 нм) равны >> lambda2xy(550e-9) ans = 0.3016 0.6923 а координаты цветности стандартного источника света с вольфрамовой нитью при 2600 К равны Функция цветового баланса >> lamp = blackbody(lambda, 2600); >> lambda2xy(lambda, lamp) ans = 0.4677 0.4127 и 3.13b, могут только приблизительно соответствовать истинным цветам из-за ограничения палитры технологии, которую вы используете для просмотра книги: чернил, используемых для печати страницы, или дисплея вашего компьютера. Ни одна технология отображения не имеет достаточно большой цветовой охват, чтобы обеспечить точное представление цветности в каждой точке. a Длина волны (нм) b Рис. 3.13. a) Функции цветового баланса для стандартного наблюдателя, основанные на воображаемых основных цветах X, Y (интенсивность) и Z, сведены в таблицу CIE; b) цвета на xy-хроматической плоскости Цвет 147 3.2.5 Названия цветов Цветовые координаты обеспечивают количественный способ описания и сравнения цветов, однако людям удобнее называть цвета по имени. Многие компьютерные операционные систеВ большинстве си- мы содержат базу данных или файл , который сопоставляет стем на основе Unix понятные человеку названия цветов с соответствующими им файл называется /etc/rgb.txt. трехкомпонентными значениями (R, G, B). Toolbox предоставляет копию такого файла и интерфейсную функцию colorname. Например, мы можем запросить название цвета, которое включает определенную подстроку: >> colorname('?burnt') ans = 'burntsienna' 'burntumber' Трехцветное значение RGB цвета «сиена жженая» составляет >> colorname('burntsienna') ans = 0.5412 0.2118 0.0588 со значениями, нормированными к интервалу [0, 1]. Мы также можем запросить xy-координаты цветности >> bs = colorname('burntsienna', 'xy') bs = 0.5568 0.3783 Обращаясь к рис. 3.13, мы видим, что эта точка находится в красно-коричневой части цветового пространства и не слишком далеко от цвета шоколада. Цвета важны для человека, и в английском языке есть более 4000 слов, связанных с цветом. У древних греков были только слова для черного, белого, красного и желтовато-зеленого. Во всех языках есть слова для обозначения черного и белого, и слово «красный» является следующим по частоте названием цвета в языке, за которым следуют желтый, зеленый, синий и т. д. Мы также связываем цвета с эмоциями, например красный – гнев, а синий – грусть, но в разных культурах ассоциации различаются. В Азии оранжевый обычно является положительным цветом, тогда как на Западе это цвет бульдозеров и опасностей на дороге. Химия и технологии за последние 700 лет подарили нам широчайший выбор новых красителей, но с этим выбором возникает путаница в отношении названий цветов – люди не всегда согласны с лингвистическим тегом, который присвоен определенному цвету. (Облако слов от tagxedo.com с использованием данных Steinvall, 2002.) 148 Глава 3 · Свет и цвет >> colorname('chocolate', 'xy') ans = 0.5318 0.3988 Мы также можем решить обратную задачу. Имея трехцветное значение >> colorname([0.2 0.3 0.4]) ans = darkslateblue получаем название ближайшего цвета в евклидовых координатах. 3.2.6 Другие цветовые и хроматические пространства Цветовое пространство – это трехмерное пространство, содержащее все возможные трехцветные значения – все цвета и все уровни яркости. Если рассматривать его с точки зрения систем координат, как обсуждалось в разделе 2.2, то существует бесконечное число вариантов декартовой системы отсчета, с по­ мощью которых можно определять цвета. Мы уже обсуждали два разных декартовых цветовых пространства: RGB и XYZ. Однако мы могли бы также использовать полярные, сферические или гибридные системы координат. Двухмерные пространства цветности r–g или x–y не учитывают яркость – мы нормализовали ее в уравнениях (3.9) и (3.10). Яркость обозначается буквой Y и, согласно определению из Рекомендации МСЭ 709, Y 709 = 0.2126R + 0.7152G + 0.0722B (3.11) представляет собой взвешенную сумму трех компонентов значений RGB и отражает высокую чувствительность глаза к зеленому цвету и низкую чувствительность к синему. Цветность плюс яркость дают трехмерные пространства цвета и интенсивности, такие как rgY или xyY. Людям более свойственно рассматривать цветность с точки зрения двух характеристик: оттенка и насыщенности. Оттенок (hue) – это доминирующий цвет, ближайший спектральный цвет, а насыщенность (saturation) обозначает отсутствие примеси белого. Стимулы на спектральном локусе полностью насыщены, а те, что ближе к его центроиду, менее насыщены. Геометрический смысл понятий оттенка и насыщенности показан на рис. 3.14. Цветовые пространства, которые мы обсуждали, не имеют простой интерпретации с точки зрения оттенка и насыщен- Цвет 149 L* является нелиней- ности, поэтому были предложены альтернативные цветовые ной функцией отнопространства. Двумя наиболее известными являются HSV и CIE сительной яркости и аппроксимирует L*C*h. В обозначениях цветового пространства H – это оттенок, нелинейную реак- S – это насыщенность, которая также известна как C, или цветцию человеческого ность (chroma). Измерение интенсивности называется либо V глаза. Значение определяется как (value, значение), либо L (lightness, светлость), но они вычисляV = 1/2(min R, G, B + ются совершенно по-разному . max R, G, B). свет спектра цвет оттенок ь ност щен насы Рис. 3.14. Оттенок и насыщенность. Линия продолжается от точки белого через рассматриваемую цветность до точки спектрального локуса. Угол относительно этой линии – оттенок, а насыщенность – длина вектора, нормализованная по отношению к расстоянию до локуса белый красный Эта функция предДля перехода между различными цветовыми пространстваполагает, что значеми можно использовать функцию colorspace. Например, оттения RGB закодиронок, насыщенность и интенсивность для каждого из чистых ваны с по­мощью гамма-кодирования красных, зеленых и синих значений трехкомпонентной систе(γ = 0.45), как мы RGB равны: сказано в разделе 3.3.6. Конкретные числовые значения, >> colorspace('RGB->HSV', [1, 0, 0]) выбранные здесь, ans = не зависят от 0 1 1 гамма-кодирования. >> colorspace('RGB->HSV', [0, 1, 0]) Встроенная функция ans = MATLAB rgb2hsv не 120 1 1 предполагает коди>> colorspace('RGB->HSV', [0, 0, 1]) рованные значения гаммы и пред- ans = ставляет оттенок 240 1 1 в разных единицах измерения. В каждом случае насыщенность равна 1, цвета чистые, а интенсивность равна 1. Как показано на рис. 3.14, оттенок представлен в виде угла в диапазоне [0, 360)° с красным при 0°, который увеличивается при проходе по спектральным цветам в направлении уменьшения длины волны (оранжевый, желтый, зеленый, синий, фиолетовый). Если мы уменьшим количество зеленого компонента 150 Глава 3 · Свет и цвет >> colorspace('RGB->HSV', [0, 0.5, 0]) ans = 120.0000 1.0000 0.5000 то увидим, что интенсивность падает, но оттенок и насыщенность остаются неизменными . Для средне-серого В случае очень темных цветов погрешности вычисления малых чисел приводят к неточным координатам оттенка и насыщенности. >> colorspace('RGB->HSV', [0.4, 0.4, 0.4]) ans = 240.0000 0 0.4000 насыщенность равна нулю, это всего лишь вариант белого, а оттенок не имеет значения, так как нет цвета. Если мы добавим зеленый к серому >> colorspace('RGB->HSV', [0, 0.5, 0] + [0.4, 0.4, 0.4]) ans = 120.0000 0.5556 0.9000 у нас получится зеленый оттенок и среднее значение насыщенности. Функцию colorspace также можно применять к цветному изобра­жению: >> flowers = iread('f lowers4.png', 'double'); >> about f lowers flowers [double] : 426x640x3 (6.5 MB) Пример показан на рис. 3.15а и состоит из нескольких разных цветов и зелени на заднем плане. Изображение flowers имеет три измерения, где третье – это цветовая плоскость, на которой выбраны красные, зеленые или синие пиксели. a b c d e f Рис. 3.15. Пример цветной сцены: a) исходное цветное изображение; b) оттенок изображения; c) насыщенность изображения. Обратите внимание, что белые цветы имеют низкую насыщенность (они кажутся темными); d) карта интенсивности или монохромное изображение; e) изображение a* (от зеленого до красного); f) изображение b* (от синего до желтого) Цвет 151 Преобразовать изображение в значения оттенка, насыщенности и яркости можно следующим образом: >> hsv = colorspace('RGB->HSV', f lowers); >> about hsv hsv [double] : 426x640x3 (6.5 MB) и в результате получается еще одна трехмерная матрица, но на этот раз цветовые плоскости представляют оттенок, насыщенность и яркость. Мы можем показать эти плоскости >> idisp( hsv(:,:,1) ) >> idisp( hsv(:,:,2) ) >> idisp( hsv(:,:,3) ) в виде изображений, которые показаны на рис. 3.15b, c и d соответственно. На представлении в виде оттенков темный цвет соответствует красному, а яркий белый – фиолетовому. Красные цветы выглядят как очень маленький угол оттенка (темный) и как очень большой угол, близкий к 360°. Желтые цветы и зеленый фон можно рассматривать как различные значения оттенка. Изображение в виде насыщенности показывает, что красные и желтые цветы имеют высокую насыщенность, а зеленые листья и стебли – менее насыщенные. Белые цветы имеют очень низкую насыщенность, так как по определению белый цвет содержит много белого и мало цвета. Недостаток многих цветовых пространств заключается в том, что воспринимаемая человеческим глазом цветовая разница между двумя точками не связана напрямую с евклидовым расстоянием между ними. В некоторых частях цветового пространства две удаленные точки могут казаться совершенно одинаковыми, тогда как в другой области две близкие – совершенно разными. Это привело к развитию перцептивно однородных цветовых пространств, таких как пространства CIE L*u*v* (CIELUV) и L*a*b*. Функция colorspace может выполнять преобразования между 13 различными цветовыми пространствами, включая L*a*b*, L*u*v*, YUV и YCBCR. Преобразование этого изображения в цветовое пространство L*a*b* выполняется по тому же принципу: >> Lab = colorspace('RGB->Lab', f lowers); >> about Lab Относительно Lab [double] : 426x640x3 (6.5 MB) белого источника света, который эта что снова дает изображение с тремя измерениями. Цветность функция рассмат­ ривает как CIE D65 кодируется в плоскостях a* и b* с Y = 1, цвета a*b* не инвариантны >> idisp( Lab(:,:,2) ) к общей яркости. >> idisp( Lab(:,:,3) ) 152 Глава 3 · Свет и цвет и они показаны на рис. 3.15e и f соответственно. L*a*b* – оппозитное цветовое пространство, где a* охватывает цвета от зеленого (черного) до красного (белого), а b* – от синего (черного) до желтого (белого), с белым в начале координат, где a* = b * = 0. 3.2.7 реобразование между различными основными П цветами Стандарты CIE были определены в 1931 г., задолго до появления цветного телевидения в 1950-х гг. Основные цвета CIE в табл. 3.1 основаны на линиях излучения ртутной лампы, которые хорошо повторяются и подходят для лабораторного использования. В ранних телевизионных приемниках использовались ЭЛТ-мониторы, где основные цвета генерировались люминофорами, излучающими свет при бомбардировке электронами. Используемые люминофоры и их оттенки свечения менялись со временем в погоне за более яркими дисплеями. Международное соглашение, рекомендация МСЭ 709, определяет основные частоты спектра для телевидения высокой четкости (ТВЧ), и они перечислены в табл. 3.2. Таблица 3.2. xyz-цветность стандартных основных и белых цветов. Основные цвета CIE из табл. 3.1 и более поздняя рекомендация ITU 709, определенные для HDTV. D65 – это белый цвет излучателя абсолютно черного тела при температуре 6500 К, а E – белый цвет равной энергии x y z RCIE 0.7347 0.2653 0.0000 GCIE 0.2738 0.7174 0.0088 BCIE 0.1666 0.0089 0.8245 R709 0.640 0.330 0.030 G709 0.300 0.600 0.100 B709 0.150 0.060 0.790 D65 0.3127 0.3290 0.3582 E 0.3333 0.3333 0.3333 Отсюда вытекает задача преобразования трехкомпонентных значений из одного набора основных цветов в другой. Допустим, мы хотим отобразить изображение, представленное по трехкомпонентной схеме CIE, на экране, который исполь- Коэффициенты зует ITU 709. Используя обозначения, которые мы ввели ранее, могут быть отрицательными, поэтому определяем два набора основных цветов: P1, P2, P3 с трехком- новые базовые понентными значениями (S1, S2, S3) и P¢1, P¢2, P¢3 с трехкомпо- цвета не обязательдолжны лежать нентными значениями (S¢1, S¢2, S¢3). Мы всегда можем выразить но в пределах гаммы один набор основных цветов как линейную комбинацию старых. других: (3.12) Цвет 153 И поскольку два трехкомпонентных цвета совпадают, то мы можем записать: (3.13) Подставляя уравнение 3.12, приравнивая цветовые тройки и затем транспонируя, получаем (3.14) что представляет собой просто линейное преобразование трехцветных значений. Рассмотрим конкретную задачу преобразования основных цветов CIE в трехкомпонентные значения XYZ. Из табл. 3.2 мы знаем соответствие между основными цветами CIE и основными цветами XYZ >> C = [ 0.7347, 0.2653, 0; 0.2738, 0.7174, 0.0088; 0.1666, 0.0089, 0.8245]' C = 0.7347 0.2738 0.1666 0.2653 0.7174 0.0089 0 0.0088 0.8245 что соответствует первым трем столбцам табл. 3.2. Таким образом, мы приходим к преобразованию Вспомним, что яркость полностью зависит от основного цвета Y. Обычно применяется ограничение, согласно которому единичные значения R, G, B дают единичную яркость Y и белый цвет с заданной цветностью. Мы выберем белый цвет D65, цветность которого указана в табл. 3.2 и который будем обозначать (xw, yw, zw). Теперь можно записать уравнение 154 Глава 3 · Свет и цвет где левая часть имеет Y = 1. Кроме того, мы ввели диагональную матрицу J, которая масштабирует яркость основных цветов. Мы можем решить уравнение и найти элементы J: Подставляя реальные значения, получаем: >> J = inv(C) * [0.3127 0.3290 0.3582]' * (1/0.3290) J = 0.5609 1.1703 1.3080 >> C * diag(J) ans = 0.4121 0.3204 0.2179 0.1488 0.8395 0.0116 0 0.0103 1.0785 Средняя строка этой матрицы представляет собой коэффициенты яркости Y = 0.1488R + 0.8395G + 0.0116B аналогично уравнению (3.11). Небольшое отклонение связано с использованием разных основных цветов – в данном случае CIE вместо Rec. 709 в случае уравнения (3.11). Трехкомпонентное значение RGB красного кирпича было вычислено ранее, и мы можем определить его тройку компонентов XYZ: >> XYZ_brick = C * diag(J) * RGB_brick'; ans = 0.0092 0.0079 0.0034 которую мы преобразуем в координаты цветности согласно уравнению (3.10) >> tristim2cc(XYZ_brick') xybrick = 0.4483 0.3859 Возвращаясь к рис. 3.13b, мы видим, что эта ху-цветность лежит в красной области и называется >> colorname(ans, 'xy') ans = sandybrown Дополнительные темы 155 sandy brown (рыже-коричневый), что вполне соответствует объекту «выветренный красный кирпич». 3.2.8 Что такое белый цвет? В предыдущем разделе мы коснулись темы белого цвета. Он необычен тем, что это одновременно и отсутствие цвета, и сумма всех цветов. Одним из определений белого цвета является стандартный дневной свет, который наблюдается от полуденного солнца в Западной/Северной Европе и занесен в таблицу CIE как источник света D65. Он может быть близко аппроксимирован излучением абсолютно черного тела при температуре 6500 K >> d65 = blackbody(lambda, 6500); >> lambda2xy(lambda, d65) ans = 0.3136 0.3243 которое, как мы видим, близко к цветности D65, приведенной в табл. 3.2. Другое определение основано на том, что белый свет представляет собой равную смесь всех спектральных цветов. Это представление однородного спектра >> ee = ones(size(lambda)); известное также как стимул равной энергии, имеющее цветность >> lambda2xy(lambda, ee) ans = 0.3334 0.3340 что близко к определенному значению (1/3, 1/3). 3.3 Дополнительные темы Цвет – это большая и сложная тема, и в этом разделе мы кратко раскроем несколько оставшихся важных аспектов. Распространенным способом описания спектра источника света является цветовая температура, а влияние цвета освещения на видимый цвет объекта представляет собой проблему постоянства цвета, которая очень актуальна для робота, использующего цветовые сигналы в среде с естественным освещением. Одним из способов решить эту проблему является корректировка баланса белого. Другим источником изменения цвета в таких средах, как вода, является поглощение определенных длин волн. Большин- 156 Глава 3 · Свет и цвет ство камер на самом деле реализуют нелинейную зависимость, называемую гамма-коррекцией, между фактической яркостью сцены и выходными значениями трехцветного изображения. Наконец, мы рассмотрим более реалистичную модель отражения света от поверхности, которая имеет как зеркальную, так и диффузную составляющую, у каждой из которых свои спект­ ральные характеристики. 3.3.1 Цветовая температура Фотографы часто упоминают цветовую температуру источника света – температуру черного тела, спектр которого, согласно уравнению (3.1), наиболее похож на источник света. Цветовая температура для ряда распространенных условий освещения указана в табл. 3.3. Освещение с низкой цветовой температурой мы описываем как теплое – оно кажется нам красно-оранжевым. Свет с высокой цветовой температурой более жесткий – он кажется нам ярко-белым, возможно, с оттенком синего. Источник света Свеча Рассветное/закатное небо Обычная лампа накаливания 40 Вт Обычная лампа накаливания 100 Вт Галогенная лампа 100 Вт Прямой солнечный свет Пасмурное небо Стандартный дневной свет (солнце + голубое небо) Белесоватое небо Чистое голубое небо Цветовая температура, К 1900 2000 2600 2850 3200 5800 6000–7000 6500 8000 10 000–30 000 Таблица 3.3. Цветовые температуры некоторых распространенных источников света Яркость сцены является произведением освещенности и отражательной способности, но ключ к пониманию сцены – отражательная способность, поскольку ее можно использовать в качестве косвенного показателя типа материала. Освещенность может различаться по интенсивности и цвету в сцене, что усложняет понимание изображения. К сожалению, разделение яркости на освещенность и отражательную способность является некорректной постановкой задачи, но человеческий мозг делает это весьма неплохо, хотя и не всегда правильно, как иллюстрирует иллюзия справа – квадраты, обозначенные A и B, имеют одинаковый уровень серого. Американский изобретатель и основатель корпорации Polaroid Эдвард Лэнд (1909–1991) предложил теорию ретинекса (retinex = retina (сетчатка) + cortex (кора)), чтобы объяснить, как зрительная система человека отделяет отражение от яркости. (Изображение с иллюзией тени на шахматной доске предоставлено Эдвардом Адельсоном, http://persci.mit.edu/gallery.) Дополнительные темы 157 3.3.2 Постоянство цвета Исследования показывают, что человеческое восприятие белого является адаптивным и обладает замечательной способностью исключать эффект освещения сцены, так что белые объекМы адаптируем ты всегда кажутся белыми . Например, ночью при желтоватом наше восприятие свете слабой лампы накаливания страницы книги остаются цвета таким образом, чтобы интеграл, для нас белыми, но на фотографии этой сцены, просмотренили среднее, по ной позже при других условиях освещения, они будут казатьвсей сцене был сеся слегка желтыми. Все это создает серьезные проблемы для рым. Этот механизм хорошо работает робота, использующего цвет для понимания сцены, поскольку в диапазоне цве- наблюдаемая цветность меняется в зависимости от освещения. товой температуры 5000–6500 K. На открытом воздухе роботу приходится бороться с широкими перепадами освещенности, зависящими от времени суток и облачности, а также с цветными отражениями от зданий и деревьев. Разные факторы окружающей обстановки влияют на яркость и видимый цвет объекта. Чтобы проиллюстрировать эту проблему, мы вернемся к красному кирпичу >> lambda = [400:10:700]*1e-9; >> R = loadspectrum(lambda, 'redbrick'); при двух разных условиях освещения Солнцем на уровне земли >> sun = loadspectrum(lambda, 'solar'); и лампой накаливания >> lamp = blackbody(lambda, 2600); и вычислим xy-цветность для каждого случая: >> xy_sun = lambda2xy(lambda, sun .* R) xy_sun = 0.4760 0.3784 >> xy_lamp = lambda2xy(lambda, lamp .* R) xy_lamp = 0.5724 0.3877 Мы наблюдаем значительное изменение цветности или видимого цвета. Эти значения нанесены на диаграмму цветности на рис. 3.16. 3.3.3 Баланс белого Фотографы хорошо знают об эффекте цветовой температуры освещения. Лампа накаливания кажется более желтой, чем дневной свет, поэтому фотограф должен поместить на камеру 158 Глава 3 · Свет и цвет Солнце Вольфрам Под водой Рис. 3.16. Цветность красного кирпича при разном освещении синий фильтр, чтобы ослабить красную часть спектра и компенсировать смещение баланса белого. Мы можем получить аналогичную функцию, выбрав матрицу J для регулировки усиления цветовых каналов . Например, уси- Обычно принимают ление JB компенсирует недостаток синего цвета при освещении JG = 1, а JR и JB корректируют. вольфрамовой нитью накала. Это процесс балансировки белого – обеспечение совпадения с цветностью объектов, которые, как нам известно, являются белыми (или серыми). Некоторые камеры позволяют пользователю устанавливать цветовую температуру освещения через меню, как правило, с заранее настроенными параметрами для ламп накаливания, люминесцентных ламп, дневного света и вспышки, которые заданы различными предустановленными значениями J. При ручной балансировке белого камеру направляют на серый или белый объект и нажимают кнопку запуска настройки. Камера регулирует усиление своего канала J так, чтобы были получены равные значения трехцветного изображения R¢ = G¢ = B¢, что, как мы помним, дает желаемую цветность белого. Для цветов, отличных от белого, эти исправления вносят некоторое цветовое искажение, но тем не менее изображение выглядит приемлемо для человеческого глаза. Часто применяется автоматическая балансировка белого, основанная на эвристических методах оценки цветовой температуры источника света, но ее можно обмануть сценами с преобладанием определенного цвета. Дополнительные темы 159 Наиболее практичным решением является использование трехцветных значений трех объектов с известной цветностью в сцене. Это позволяет напрямую вычислить матрицу C в уравнении (3.14), отображая значения трехцветного стимула от датчика в координаты XYZ, которые являются абсолютным (независимым от освещения) представлением отражательной способности поверхности. Отсюда можно также оценить цветность освещения. Этот подход используется в панорамной камере марсохода, где калибровочная цель, показанная на рис. 3.17, периодически появляется перед камерой для обновления баланса белого при изменении марсианского освещения. Рис. 3.17. Калибровочная мишень, используемая для камеры PanCam марсохода. Области известного коэффициента отражения и цветности (красный, желтый, зеленый, синий и оттенки серого) используются для установки баланса белого камеры. Центральный стержень имеет очень низкую отражательную способность и также служит солнечными часами. В лучших традициях солнечных часов на них нанесен девиз «Два мира – одно солнце» (фото предоставлено NASA/JPL/Cornell/Jim Bell) 3.3.4 Изменение цвета из-за поглощения Последний и весьма экстремальный пример – искажение цвета, возникающее под водой. Допустим, наш робот пытается найти док-станцию, обозначенную цветными мишенями. Как упоминалось ранее в разделе 3.1.1, вода действует как фильтр, который поглощает красный свет сильнее, чем синий. В случае объекта, находящегося под водой, эта фильтрация влияет как на освещение, падающее на объект, так и на отраженный свет по пути к камере. Рассмотрим снова красный кирпич >> [R,lambda] = loadspectrum([400:5:700]*1e-9, 'redbrick'); который погружен на 1 м под воду, а камера расположена на расстоянии 1 м от кирпича. Освещенность поверхности воды такая же, как у солнечного света на уровне земли: >> sun = loadspectrum(lambda, 'solar'); 160 Глава 3 · Свет и цвет Спектр поглощения воды >> A = loadspectrum(lambda, 'water'); а полная длина оптического пути через воду равна >> d = 2; Передача T определяется законом Бера (уравнение 3.2): >> T = 10 .^ (-d*A); и результирующая яркость кирпича будет равна >> L = sun .* R .* T; что показано на рис. 3.18. Мы видим, что более длинные волны, красные, сильно ослаблены. Видимый цвет кирпича: >> xy_water = lambda2xy(lambda, L) xy_water = 0.3738 0.3814 что также изображено на диаграмме цветности рис. 3.16. Кирпич выглядит гораздо более синим, чем раньше. В действительности подводная съемка еще более сложна из-за рассеяния света крошечными взвешенными частицами, которые отражают окружающий свет в камеру, не давая ему достигнуть цели. Яркость (λ) Под водой В воздухе Длина волны (нм) 3.3.5 Рис. 3.18. Спектр яркости красного кирпича, оказавшегося под водой. Спектр без поглощения водой показан красным Двухцветное отражение Простая модель отражения, представленная в разделе 3.1.3 подходит для объектов с матовой поверхностью (например, бумага, Дополнительные темы 161 Ламбертово отражение. Незеркальная, или матовая, поверхность является диффузным отражателем, и количество света, отраженного под определенным углом от нормали к поверхности, пропорционально косинусу угла отражения θr. Это явление называется ламбертовым отражением в честь швейцарского математика и физика Иоганна Генриха Ламберта (1728–1777). Следствием этого явления является то, что объект имеет одинаковую видимую яркость при всех углах обзора. Ярким примером этого является луна, которая выглядит как диск равномерной яркости, несмотря на то что это сфера с изогнутой в сторону от нас поверхностью; см. также зеркальное отражение в разделе 6.3. (Изображение Луны предоставлено НАСА.) необработанное дерево), но, если поверхность частично блестящая, свет, отраженный от объекта, будет иметь две составляющие. Это модель дихроматического отражения, показанная на рис. 3.19а. Одним компонентом является свет источника, зеркально отраженный от поверхности без изменения спектра, – это граничное, или френелевское, отражение. Другой компонент – это свет, который взаимодействует с поверхностью: проникает, рассеивается, подвергается селективному спектральному поглощению и переизлучается во всех направлениях в соответствии с ламбертовской моделью отражения. Соотношение этих двух компонентов зависит от материала и геометрии источника света, положения наблюдателя и нормали к поверхности. нормаль к поверхности ие па да a ющ ие лу чи ламбертово отражение ое н ль н же ра от а рк зе широкий отраженный луч внутреннее рассеяние b Рис. 3.19. Двухцветное отражение: a) часть падающего света подвергается зеркальному отражению от поверхности, в то время как другая часть проникающего через нее света рассеивается, фильтруется и переизлучается во всех направлениях в соответствии с ламбертовской моделью отражения; b) отражение от зеркальной поверхности отчетливо видно в не красных светлых областях на двух помидорах, это отражения потолочных светильников (снимок любезно предоставлен проектом Distributed Robot Garden, Массачусетский технологический институт) 162 Глава 3 · Свет и цвет Хороший пример двухцветного отражения можно увидеть на рис. 3.19b. Оба помидора выглядят красными из-за рассеивания света, когда свет взаимодействует с поверхностью плода. Однако у каждого фрукта есть область зеркального отражения, которая кажется белой, т. е. имеет цвет источника света, а не поверхности фрукта. Реальный мир еще более сложен из-за взаимоотражений. Например, зеленый свет, отраженный от листьев, попадет на красные плоды и рассеется. Часть этого света будет снова отражаться от зеленых листьев и т. д. – близлежащие объекты сложным образом влияют на цвет друг друга. Для достижения фотореалистичных результатов в компьютерной графике все эти эффекты необходимо моделировать на основе детального знания отражающих свойств и геометрии всех поверхностей. В робототехнике мы редко располагаем такой информацией, поэтому нам необходимо разработать алгоритмы, устойчивые к этим эффектам. 3.3.6 Гамма Когда-то ЭЛТ-мониторы были широко распространены, и яркость, создаваемая на экране дисплея, была нелинейно связана с управляющим напряжением V в соответствии с формулой L = V γ, (3.15) где γ » 2.2. Чтобы устранить эффект нелинейности, первые видеокамеры применяли обратную нелинейность V = L1/γ к вы- У некоторых камер ходному сигналу, в результате чего видеоканал был линейным есть возможность выбрать гамму 1 или от начала до конца . Оба преобразования обычно называют 0.45 (= 1/2.2). гамма-коррекцией, хотя более точно операция на стороне камеры представляет собой гамма-кодирование, а операция на сто- Гамма-кодирование и декодирование роне дисплея – гамма-декодирование . часто называют ЖК-дисплеи имеют более сильную нелинейность, чем ЭЛТ, гамма-компресно в дисплее применяется коррекция, чтобы он соответствовал сией и гаммадекомпрессией стандартному поведению γ = 2.2 устаревшей ЭЛТ. соответственно, Чтобы показать эффект гаммы дисплея, создадим простой поскольку операция компрессии сжиматестовый код: ет диапазон сигнала, а декомпрессия распаковывает его. Компьютеры Macintosh являются Результат показан на рис. 3.20 и похож на градационный оп- исключением, и до тический клин, который применяют фотографы. Если мы ото- MacOS 10.6 использначение бразим его на экране нашего компьютера, он будет выглядеть зовалось γ = 1.8, что делало иначе, чем напечатанный в книге. Скорее всего, мы будем на- цвета более яркими блюдать большое изменение яркости между вторым и третьим и сочными. >> wedge = [0:0.1:1]; >> idisp(wedge) Дополнительные темы 163 блоком – эффект нелинейности гамма-декодирования (уравнение 3.15) на дисплее вашего компьютера. Рис. 3.20. Клин линейной интенсивности Если применить гамма-кодирование >> idisp( wedge .^ (1/2.2) ) изменения интенсивности будут выглядеть более линейными и ближе к тому, что напечатано в книге. Координаты цветности уравнений (3.9) и (3.10) вычисляются как отношения трехкомпонентных значений, которые линейно связаны с яркостью сцены. Нелинейность, применяемая к выходу камеры, должна быть скорректирована путем гамма-декодирования перед любыми колориметрическими операциями. Эту операцию выполняет функция igamm Toolbox. Гамма-декодирование также может быть выполнено, когда изображение загружается с использованием параметра 'gamma' функции iread. Заголовок файла Сегодня большинство цифровых камер кодирует изображеJPEG (формат файла ния в формате sRGB (стандарт IEC 61966-2-1), в котором испольJFIF) имеет тег Color Space, для кото- зуются базовые цвета ITU 709 и функция гамма-кодирования рого установлено значение sRGB или Uncalibrated (не калибровано), если гамма или цветовая модель неизвестны (см. окончание которая применяет линейную функцию для малых значений раздела 4.1.1). и степенной закон для больших. Общая гамма составляет при- мерно 2.2. Важным свойством цветовых пространств, таких как HSV или xyY, является то, что координаты цветности инвариантны к изменениям интенсивности. Многие цифровые видеокамеры обеспечивают вывод в формате YUV или YCBCR, который имеет компонент яркости Y и два других компонента, которые часто ошибочно принимают за цветовые координаты – это не так! На самом деле они представляют собой цветоразностные сигналы такие, что U, CB ∝ B¢ − Y¢ и V, CR ∝ R¢ − Y¢, где R¢, B¢ представляют собой гаммакодированные трехкомпонентные значения, а Y¢ – гамма-кодированную интенсивность. Гамма-нелинейность означает, что UV или CBCR не будут постоянными при изменении общего уровня освещения. Трехкомпонентные значения, поступающие с камеры, необходимо сначала преобразовать в линейные трехкомпонентные значения, применив соответствующее гамма-декодирование, а затем вычислив цветность. Простого пути нет. 164 Глава 3 · Свет и цвет 3.4 Применение: цветное изображение 3.4.1 С равнение цветовых пространств [examples/colorspaces] В этом разделе мы объединяем многие концепции и инструменты, представленные в данной главе. Мы сравним координаты цветности цветных квадратов (квадраты 1–18) таблицы Color Checker, показанной на рис. 3.21, используя цветовые пространства xy и L*a*b*. Вычислим цветность, используя информацию о спектральном коэффициенте отражения для каждого квадрата, полученную с по­мощью Toolbox: >> lambda = [400:5:700]*1e-9; >> macbeth = loadspectrum(lambda, 'macbeth'); Рис. 3.21. Плашка Color Checker фирмы Gretag Macbeth представляет собой набор из 24 печатных цветных квадратов (пронумерованных слева направо и сверху вниз), которые включают различные оттенки серого и цвета, а также спектральные модели кожи, неба, листвы и т. д. С Toolbox предоставляются спектральные данные для квадратов Всего будет 24 столбца, по одному на квадрат тестовой диаграммы. Загружаем спектр относительной мощности стандартного белого источника света D65: >> d65 = loadspectrum(lambda, 'D65') * 3e9; и масштабируем его до яркости, сравнимой с солнечным светом, как показано на рис. 3.3а. Тогда для каждого не серого квад­рата 1 2 3 4 5 6 7 8 >> for i=1:18 L = macbeth(:,i) .* d65; tristim = max(cmfrgb(lambda, L), 0); RGB = igamm(tristim, 0.45); XYZ(i,:) = colorspace('XYZ<-RGB', RGB); Lab(i,:) = colorspace('Lab<-RGB', RGB); end мы вычисляем спектр яркости (строка 2), используем функции балансировки цветов CIE для определения трехкомпонентного отклика глаза и устанавливаем пределы гаммы (строка 3), а затем применяем гамма-кодирование (строка 4), поскольку функ- Применение: цветное изображение 165 ция colorspace ожидает гамма-кодированные данные RGB. Они преобразуются в цветовое пространство XYZ (строка 6) и цветовое пространство L*a*b* (строка 7). Затем мы преобразуем XYZ в xy, разделив X и Y на X + Y + Z и извлекая столбцы a*b*: >> xy = XYZ(:,1:2) ./ (sum(XYZ,2)*[1 1]); >> ab = Lab(:,2:3); что дает две матрицы 18´2 с одной строкой на цветной квадрат. Наконец, мы наносим эти точки на соответствующие цветные плоскости. >> showcolorspace(xy', 'xy'); >> showcolorspace(ab', 'Lab'); Результаты показаны на рис. 3.22. Мы видим, например, что квадрат 15 ближе к 9 и дальше от 7 на плоскости a*b*. Цветовое пространство L*a*b* было разработано таким образом, чтобы евклидово расстояние между точками было пропорционально разности цветов, воспринимаемой людьми. Если мы используем алгоритмы для различения объектов по цвету, тогда L*a*b* будет предпочтительнее, чем RGB или XYZ. a Рис. 3.22. Диаграммы цветности плашки Color Checker: a) ху-пространство; b) увеличенный участок xy-пространства; c) a*b*-пространство; d) увеличенный участок a*b*-пространства c b d 166 Глава 3 · Свет и цвет 3.4.2 Удаление теней [examples/shadow] Как видно на рис. 3.23а, для системы технического зрения робота, работающей вне помещения, тени представляют собой серьезную проблему. Из-за теней поверхности одного и того же типа выглядят совершенно по-разному, и роботу, который пытается использовать зрение, чтобы понять сцену и спланировать, куда двигаться, это доставляет большие проблемы. Еще более проблематичным является то, что этот эффект не является постоянным, он меняется в зависимости от времени суток и состояния облачности. На изображении на рис. 3.23b были удалены эффекты затенения, и теперь мы можем очень четко видеть различные типы местности – траву и гравий. Ключом к удалению теней является тот факт, что яркие части сцены освещаются непосредственно солнцем, а более темные затененные области освещаются небом. И солнце, и небо можно смоделировать как излучатели абсолютно черного тела с цветовыми температурами, указанными в табл. 3.3. Таким образом, у теней есть две определяющие характеристики: они темные и имеют легкий голубой оттенок. Мы моделируем камеру, используя уравнение (3.4), но спект­ ральную характеристику цветовых датчиков камеры смоделируем как функции Дирака Mx(λ) = δ(λ − λx), что позволяет исключить интегралы: R = E(λR)R(λR)MR(λR); G = E(λG)R(λG)MG(λG); B = E(λB)R(λB)MB(λB). Для каждого пикселя мы вычисляем цветовые координаты r = R/G и b = B/G, которые инвариантны к изменению величины освещенности: Для дальнейшего упрощения мы применяем приближение Вина, исключая член –1, что является разумным приближением для цветовых температур в рассматриваемом диапазоне, и теперь мы можем написать Применение: цветное изображение 167 что является функцией цветовой температуры T и различных констант: физических констант c, h и k; длины волны отклика датчика λx и величины Mx(λx), а также свойств материала R(λx). Логарифмируя, получаем очень простую форму: (3.16) И, повторяя процесс для синей цветности, мы можем написать: (3.17) Каждому цветовому пикселю (R, G, B) ∈ �3 можно сопоставить точку (log r, log b) ∈ �2, и при изменении цветовой температуры все точки будут двигаться вдоль линий с наклоном c¢2 /c2. Следовательно, проекция на ортогональное направление, линия с наклоном c2 /c¢2 , дает одномерную величину s = –c2 log r + c¢2 log b, которая не зависит от цветовой температуры источника света. Мы можем вычислить эту величину для каждого пикселя изоРис. 3.23. Тени бражения: создают смешанные эффекты >> im = iread('parks.jpg', 'gamma', 'sRGB'); в изображениях: >> gs = invariant(im, 0.7, 'noexp'); a) вид на парк >> idisp(gs) с сильными тенями; b) инвариантное Результат показан на рис. 3.23b. Пиксели имеют значения к теням шкалы серого, которые представляют собой сложную функцию изображение, в котором отражательной способности материала и свойств сенсора камепеременчивость ры. Аргументами функции являются цветное изображение, наосвещения почти полностью клон линии в радианах и флаг, возвращающий логарифм s, а не устранена (Corke et его показатель степени. al. 2013) a b 168 Глава 3 · Свет и цвет Для достижения этого результата мы сделали некоторые приближения и ряд достаточно сильных допущений: камера дает линейный отклик на яркость сцены в трехцветных значениях RGB, цветовые каналы камеры имеют неперекрывающийся спектральный отклик, сцена освещена светом источника абсолютно черного тела. Первое предположение означает, что нам нужно использовать камеру с γ = 1 или применить гамма-декодирование к изображению, прежде чем продолжить. Второе далеко не так, особенно для красного и зеленого каналов цветной камеры, но на практике метод работает хорошо. Самый большой эффект заключается в том, что точки перемещаются по линии с наклоном, отличным от c¢2 /c2, но мы можем оценить наклон эмпирически, рассмотрев набор затененных и незатененных пикселей, соответствующих одному и тому же материалу в сцене >> theta = esttheta(im) который предложит вам выбрать область и вернет угол, который можно передать в invariant. Последнее допущение означает, что этот метод не будет работать для источников света, отличных от ламп накаливания, или там, где сцена частично освещена отражениями от цветных поверхностей. Более подробная информация представлена в исходном коде функции MATLAB. 3.5 Подведение итогов Вы узнали, что видимый свет представляет собой электромагнитное излучение со смесью длин волн, с непрерывным спектром, который изменяется за счет отражения и поглощения. Спектр вызывает отклик глаза, который мы интерпретируем как цвет. Для человека этот отклик представляет собой трехмерный вектор, представляющий собой выходные сигналы трех различных типов колбочек в нашем глазу. Цифровая цветная камера функционально эквивалентна глазу. Трехкомпонентный цвет можно рассматривать как одномерную координату яркости и двухмерную координату цветности, что позволяет отображать цвета на плоскости. Спектральные цвета образуют локус на этой плоскости, и все реальные цвета лежат внутри этого локуса. Любые три основных цвета образуют на этой плоскости треугольник, который является палитрой этих основных цветов. Любой цвет внутри треугольника может быть сопоставлен соответствующей смесью этих основных цветов. Никакой набор основных цветов не может определить палитру, содержащую все цвета. Альтернативный набор воображаемых Подведение итогов 169 Инфракрасные камеры. Бытовые камеры функционально эквивалентны человеческому глазу и чувствительны к видимому спектру. Также существуют камеры, чувствительные к инфракрасному излучению, и CIE определяет несколько инфракрасных диапазонов: IR-A (700–1400 нм), IR-B (1400–3000 нм) и IR-С (3000 нм – 1000 мкм). В обиходе IR-A и IR-B известны как ближний инфракрасный (NIR) и коротковолновый инфракрасный (SWIR) соответственно, а поддиапазон IR-C охватывает средние (MWIR, 3000–8000 нм) и длинные (LWIR, 8000–15 000 нм) волны. Камеры LWIR также называют тепловизионными или термографическими камерами. Ультрафиолетовые камеры обычно работают в ближнем ультрафиолетовом диапазоне (NUV, 200–380 нм) и используются в промышленных приложениях, таких как обнаружение коронного разряда в высоковольтных электрических системах. Гиперспектральные камеры имеют более трех классов фоторецепторов, они измеряют входящий спектр во многих точках, обычно от инфракрасного до ультрафиолетового, и с десятками или даже сотнями спектральных диапазонов. Гиперспектральные камеры используются для таких приложений, как аэрофотосъемка, классификация землепользования и определение минерального состава горных пород. основных цветов, система CIE XYZ, содержит все реальные цвета и является стандартным способом описания цветов. К трехкомпонентным значениям можно применить линейные преобразования для перехода к другим наборам основных цветов. Нелинейные преобразования можно использовать для описания трехкомпонентных значений с точки зрения качеств, ориентированных на человеческое восприятие, таких как оттенок и насыщенность. Мы также обсудили определение белого цвета, цветовую температуру, постоянство цвета, проблему балансировки белого, нелинейный отклик устройств отображения и то, как это влияет на обычное представление изображений и видео. Мы узнали, что воспринимаемые нами цвета и яркость зависят от источника света и свойств поверхности объекта. Несмотря на то что люди вполне способны «учитывать» изменения освещения, это остается серьезной проблемой для роботизированных систем технического зрения. Глава заканчивается примером удаления тени на цветном изображении вне помещения. Дополнительное чтение На первый взгляд цвет – это простое понятие, которое мы изуча­ ем в детском саду, но по мере углубления обнаруживаем, что это увлекательная и сложная тема, о которой написано огромное количество литературы. В этой главе мы только начали поверхностное изучение фотометрии и колориметрии. Фотометрия – это часть науки о радиометрии, связанная с измерением видимого света. Это сложная задача для инженеров и програм- 170 Глава 3 · Свет и цвет мистов, поскольку в ней используются необычные единицы измерения, такие как люмен, стерадиан, нит, кандела и люкс. Одним из источников сложности является то, что такие слова, как «интенсивность» и «яркость» (а иногда и освещенность), являются синонимами в повседневной речи, но имеют очень специфическое значение в фотометрии. Колориметрия – это наука о восприятии цвета, а также большая и сложная область, поскольку человеческое восприятие цвета зависит от индивидуального наблюдателя, окружающего освещения и даже поля зрения. Однако колориметрия имеет решающее значение при проектировании камер, компьютерных дисплеев, видеооборудования и принтеров. Всеобъемлющая онлайн-информация о компьютерном зрении доступна по адресу http://homepages. inf.ed.ac.uk/rbf/CVonline, а материал этой главы посвящен разделу «Физика изображения». В учебниках по компьютерному зрению Гонсалеса и Вудса (Gonzalez and Woods, 2008 г.) и Форсайта и Понсе (Forsyth and Ponce, 2011 г.) обсуждается цвет и цветовые пространства. В последнем также обсуждаются эффекты затенения и взаимоотражения. Книга Геверса и др. (Gevers et al., 2012) представляет собой серьезное введение в теорию цветового зрения и подробно описывает модель дихроматического отражения. Она также охватывает алгоритмы компьютерного зрения, которые решают проблемы постоянства цвета. Теория ретинекса описана в работе Лэнда и Макканна (Land and McCann, 1971), а реализации MATLAB можно найти по адресу http://www.cs.sfu.ca/~colour/code. Другие ресурсы, связанные с постоянством цветовосприятия, можно найти на http://colorconstancy.com. К легко читаемым и исчерпывающим книгам по науке о цвете относятся учебники Кёндеринка (Koenderink, 2010), Ханта (Hunt, 1987) и Бенсона (Benson, 1986), раскрывающие тему с телевизионной или инженерной точки зрения. Хантер и Гарольд (Hunter and Harold, 1987) используют более доступный язык и охватывают также другие аспекты внешнего вида, такие как блеск и глянец. Стандарт CIE (Commission Internationale de l’Éclairage 1987) является истиной в последней инстанции, но, как и любой стандарт, весьма труден для чтения. Работа CIE продолжается, и его стандарты периодически обновляются на сайте www.cie.co.at. Функции цветового баланса были впервые представлены в виде таблицы в 1931 г. и пересмотрены в 1964 г. Чарльз Пойнтон (Charles Poynton) в течение долгого времени поддерживает превосходные онлайн-учебники по цветовым пространствам и палитрам на сайте http://www.poynton.com. Его книга (Poynton, 2012) представляет собой отличное и легко читаемое введение в эти темы, а также очень подробно обсуждает цифровые видеосистемы. Подведение итогов 171 Общее развитие. Кроун (Crone, 1999) рассматривает историю теорий человеческого зрения и цвета. Как работает зрительная система человека, от глаза до восприятия, описано в двух очень легко читаемых книгах Стоуна (Stone, 2012) и Грегори (Gregory, 1997). Лэнд и Нильссон (Land and Nilsson, 2002) описывают устройство глаз животных и оптимизацию для разных видов таких характеристик, как острота зрения, поле зрения и способность работать в условиях низкой освещенности. Источники данных Toolbox содержит ряд файлов данных, описывающих различные спектры, которые сведены в табл. 3.4. Каждый файл содержит в качестве первого столбца длину волны в метрах. Файлы имеют разные диапазоны длин волн и интервалы, но вспомогательная функция loadspectrum интерполирует данные в указанный пользователем диапазон и интервал выборки. Несколько интернет-сайтов содержит спектральные данные в табличном формате, ссылка на которые есть на веб-сайте книги. Сюда входят данные об отражательной способности для более чем 2000 материалов, предоставленных онлайновой спектральной библиотекой НАСА ASTER 2.0 (Baldridge et al., 2009 г.) по адресу http://speclib.jpl.nasa.gov и спектральной базой данных Лаборатории исследования цвета Университета Восточной Финляндии на сайте http://uef.fi/en/spectral. Данные о реакции колбочек и функциях цветового баланса CIE доступны в Исследовательской лаборатории цвета и зрения Университетского колледжа Лондона по адресу http://cvrl.org. Данные CIE также доступны в интернете по адресу http://cie.co.at. Таблица 3.4. Toolbox содержит данные о различных спектрах. Значения относительной светимости лежат в интервале [0, 1], а относительное спектральное распределение мощности (spectral power distribution, SPD) нормировано к значению 1.0 на 550 нм. Эти файлы можно загрузить с помощью функции loadspectrum Toolbox Имя файла cones bb2 photopic scotopic redbrick macbeth solar water D65 Единицы измерения Описание Отн. яркость Спектральный отклик колбочек человека Отн. яркость Спектральный отклик сенсора Sony ICX 204AK, применяемого в камере Point Grey BumbleBee Отн. яркость Фотопический отклик CIE 1924 Отн. яркость Скотопический отклик CIE 1951 Отр. способность Отраженный спектр выветренного красного кирпича Отр. способность Отражательная способность плашки Gretag-Macbeth Color Checker (24 квадрата, рис. 10.21) Вт·м–2·м–1 Спектр солнечного света на уровне земли 1 м–1 Спектр светопоглощения воды Отн. SPD Источник света по стандарту CIA D65 172 Глава 3 · Свет и цвет Упражнения 1. Представьте, что вы излучатель в виде черного тела. Постройте спектр своего излучения. Какова пиковая частота вашего излучения? Какая это часть спектра? Сенсор какого типа вы посоветуете использовать, чтобы обнаружить ваше излучение? 2. Рассмотрим сенсор, который измеряет количество излучаемой мощности P1 и P2 на длинах волн λ1 и λ2 соответственно. Напишите уравнение для вычисления температуры Т черного тела через эти величины. 3. Используя закон Стефана–Больцмана, рассчитайте мощность, излучаемую на квадратный метр поверхности Солнца. Вычислите полную выходную мощность Солнца. 4. С помощью численного интегрирования вычислите мощность, излучаемую в видимом диапазоне 400–700 нм на квадратный метр поверхности Солнца. 5. Почему пиковая яркость определяется как 683 лм/Вт? 6. Используя типичную наружную освещенность из раздела 3.2.2, определите силу света Солнца. 7. Из падающей мощности излучения солнечного света на уровне земли определите процентные доли инфракрасного, видимого и ультрафиолетового света. 8. Используя численное интегрирование, вычислите мощность, излучаемую в видимом диапазоне 400−700 нм на м2 для вольфрамовой лампы при температуре 2600 К. Какова эта доля от общей излучаемой мощности? 9. Постройте и сравните фотопический и скотопический спектральные отклики глаза человека. А. Сравните кривые отклика колбочек человека и каналов RGB цветной камеры. Используйте файлы данных cones.dat и bb2.dat. 10. Можете ли вы найти метамер для красного кирпича? 11. Докажите закон центра тяжести Грассмана, упомянутый в разделе 3.2.3. 12. На цветовой плоскости x–y начертите геометрическое место (локус) излучения абсолютно черного тела с температурами в диапазоне 1000–10 000 К. 13. Нанесите основные цвета XYZ на rg-плоскость. 14. Для рис. 3.12 определите цветность допустимого зеленого цвета. 15. Определите значения трехкомпонентного цветового сигнала для красного кирпича, используя базовые цвета стандарта 709. 16. Сфотографируйте белый предмет, освещенный лампой накаливания. Определите среднее трехцветное значение RGB Подведение итогов 173 и вычислите xy-цветность. Насколько она далека от белого? Определите матрицу цветового баланса J, чтобы скорректировать цветность. Что такое цветность освещения? 17. Как называется цвет красного кирпича под водой? 18. Изобразите цель, как на рис. 3.17, с тремя цветными пятнами известной цветности. По их наблюдаемой цветности определяют преобразование наблюдаемых трехцветных значений в Rec. 709 праймериз. Что такое цветность освещения? 19. Пусть наша визуальная сцена расположена под водой, где цель на глубине d метров под поверхностью наблюдается через m метров воды, а поверхность воды освещается солнечным светом. Можно ли по наблюдаемой цветности определить истинную цветность цели? Насколько чувствительна эта оценка к неправильным оценкам m и d? Если бы вы знали истинную цветность цели, могли бы вы определить расстояние до нее? 20. Возможно ли, чтобы два разных цвета выглядели одинаково при определенном освещении? Можете ли вы предложить пример цветов и освещения, которые реализуют это явление? 21. Используйте одно из ваших собственных изображений и подход из раздела 3.4.1. Сможете ли вы различить разные предметы на изображении? 22. Покажите аналитически или численно, что масштабирование трехкомпонентного значения не влияет на цветность. Что произойдет, если цветность вычисляется на основе трехкомпонентных гамма-кодированных значений? 23. Создайте интерактивный инструмент с ползунковыми регуляторами для R, G и B, которые изменяют цвет отображаемого фрагмента. Теперь измените этот инструмент таким образом, чтобы ползунки регулировали компоненты X, Y и Z или x, y и Y. 24. Создайте цветное изображение и определите, как оно будет выглядеть на глубине 1, 5 и 10 м. 25. Определите названия цветов в таблице цветов Gretag-Macbeth. 26. Постройте компоненты функции цветового баланса, показанные на рис. 3.10, в виде трехмерной кривой. Поверните ее, чтобы увидеть локус, как показано на рис. 3.11. Глава 4 Изображения и их обработка Обработка изображений – это вычислительный процесс, направленный на преобразование одного или нескольких входных изображений в выходное. Обработка изображений часто используется для улучшения изображения и последующего просмотра или интерпретации человеком, например для повышения контрастности. С другой стороны – и это важнее с точки зрения робототехники, – это основа процесса извлечения признаков, который будет рассмотрен более подробно в следующей главе. Изображение представляет собой прямоугольный массив элементов (пикселей), поэтому для представления изображения в рабочей области мы будем использовать матрицу MATLAB. Это позволяет нам использовать мощный и эффективный арсенал матричных операторов и функций MATLAB. Мы начинаем в разделе 4.1 с описания загрузки изображений в MATLAB из таких источников, как файлы (изображения и видеоролики), камеры и интернет. Далее, в разделе 4.2 мы вводим понятие гистограмм изображения, предоставляющих полезную информацию о распределении значений пикселей. Затем обсудим различные классы алгоритмов обработки изображений. Эти алгоритмы работают попиксельно с одним изображением, парой изображений или с локальными группами пикселей в изображении, и мы называем их монадическими, диадическими и пространственными операциями соответственно. Монадические и диадические операции рассматриваются в разделах 4.3 и 4.4. Пространственные операторы описаны в разделе 4.5 и включают в себя такие операции, как сглаживание, обнаружение краев и сопоставление с шаблоном. С ними тесно связан метод фильтрации по форме или математическая морфология, описанная в разделе 4.6. Наконец, в разделе 4.7 мы обсуждаем операции изменения формы, такие как Получение изображения 175 обрезка, сжатие, расширение, а также более сложные операции, такие как вращение и деформация изображения. Роботы всегда будут получать несовершенные изображения мира из-за шума, теней, отражений и неравномерного освещения. В этой главе мы обсудим некоторые фундаментальные инструменты и «уловки», которые можно применить к изображениям реального мира. 4.1 Получение изображения Сегодня цифровые изображения встречаются повсеместно, поскольку камеры встроены в наши цифровые устройства, а создание и распространение изображений почти ничего не стоит. У каждого из нас есть постоянно растущие личные коллекции и доступ к огромным онлайн-коллекциям цифровых изображений, таким как Google Images, Picasa или Flickr. У нас также есть доступ к потоковым изображениям с чужих камер – десятки тысяч веб-камер по всему миру снимают изображения и транслируют их в интернет, – а также изображения вида Земли из космоса, Луны и Марса. 4.1.1 Изображения из файлов Начнем с изображений, хранящихся в файлах, так как весьма вероятно, что на вашем компьютере уже хранится много изобра­жений. В этой главе мы будем работать с некоторыми изображениями, поставляемыми в составе пакета Toolbox, но вы можете легко заменить их другими изображениями со своего компьютера. Для начала импортируем изображение в рабочее пространство MATLAB с по­мощью функции iread Toolbox >> street = iread('street.png'); которая возвращает матрицу Гамма-кодирование и гамма-декодиро- >> about(street) вание обсуждаются street [uint8] : 851x1280 (1.1 MB) в разделе 3.3.6. Используйте параметр принадлежащую классу uint8 – элементы матрицы представ'gamma' для iread, чтобы выполнить ляют собой беззнаковые 8-битные целые числа в интервале гамма-декодиро- [0, 255]. Элементы изображения называются значениями пиквание и получить селей, или значениями серого, и представляют собой гамма-козначения пикселей, пропорциональные дированную яркость этой точки в исходной сцене. Для этого яркости сцены. 8-битного изображения значения пикселей варьируются от 0 v (пиксели) v (пиксели) 176 Глава 4 · Изображения и их обработка u (пиксели) u (пиксели) а b Рис. 4.1. Окно просмотра изображений idisp. В правом верхнем углу показаны координаты и значение последнего пикселя, на который нажали на изображении. Кнопки в левом верхнем углу позволяют отображать значения пикселей вдоль линии, отображать гистограмму или увеличивать изображение; a) изображение в оттенках серого; b) цветное изображение (самый темный) до 255 (самый яркий). Изображение показано на рис. 4.1а. Матрица имеет 851 строку и 1280 столбцов. Обычно мы описываем размеры изображения в формате (ширина ´ высота), так что мы имеем изображение размером 1280´851 пикселей. В главе 6 мы будем записывать координаты пикселя как значения (u, v), которые являются горизонтальной и вертикальной координатой соответственно. В MATLAB это матричный элемент (v, u) – обратите внимание на перестановку координат. Обратите также внимание, что в MATLAB координаты верхнего левого пикселя равны (1, 1), а не (0, 0). Например, значение пикселя с координатой (300, 200) равно >> street(200,300) ans = 42 что довольно темно – пиксель соответствует точке в ближайшем дверном проеме. Есть некоторые тонкости при работе со значениями uint8 в MATLAB, которые мы можем продемонстрировать, определив два значения uint8: >> a = uint8(100) a = 100 >> b = uint8(200) b = 200 Получение изображения 177 Арифметические действия с uint8 подчиняются правилам целочисленной беззнаковой арифметики: >> a+b ans = 255 >> a-b ans = 0 поэтому значения результата обрезаются до интервала от 0 до 255. При делении >> a/b ans = 1 результат округлен до целого числа. Для некоторых операций обработки изображений, которые мы рассмотрим позже, полезно рассматривать значения пикселей как числа с плавающей запятой, для которых применяются более привычные арифметические правила. В этом случае каждый пиксель представляет собой 8-байтовое число двойной точности MATLAB в диапазоне [0, 1], и мы можем указать соответствующую опцию при загрузке изображения >> streetd = iread('street.png', 'double'); >> about streetd streetd [double] : 851x1280 (8.7 MB) или применив функцию idouble к изображению с целочисленными значениями пикселей. Существует очень большое количество форматов файлов изображений, которые подробно каталогизированы на http://en.wikipedia.org/wiki/Image_file_formats. Наиболее популярным является JPEG, использующийся в цифровых камерах и веб-камерах. TIFF распространен во многих компьютерных системах и часто используется для сканеров. PNG и GIF широко применяются в интернете. Внутренний формат этих файлов сложен, но существует большое количество высококачественного программного обеспечения с открытым исходным кодом на различных языках для чтения и записи таких файлов. MATLAB может читать многие из этих форматов файлов изображений. Намного более простой набор форматов, широко используемых в системах Linux, – это PBM, PGM и PPM (обычно PNM), которые представляют изображения без сжатия и иногда в виде текстового файла ASCII. Множество инструментов с открытым исходным кодом, таких как ImageMagick, обеспечивают преобразование форматов и манипулирование изображениями в Linux, MacOS X и Windows (рисунок справа получен от tagxedo.com). 178 Глава 4 · Изображения и их обработка Изображение было считано из файла street.png в форма- «Без потерь» что сжатое те переносимой сетевой графики (portable network graphics, означает, изображение после PNG) – формате сжатия без потерь , широко используемом распаковки будет в интернете. Функция iread ищет изображение в текущей пап- точно таким же, как ке, а затем в каждой папке по вашему пути MATLAB . Это кон- исходное изображение. кретное изображение не имеет цветов, оно представлено в отПримеры изображетенках серого, т. е. монохроматическое. ний хранятся в папВ этой части книги мы будем часто использовать функцию ке images дистрибутива Machine Vision idisp: >> idisp(street) Toolbox, которую автоматически ищет функция iread. которая отображает матрицу в виде изображения и предоставляет возможность интерактивного просмотра значений пикселей, как показано на рис. 4.1. Щелчок по пикселю отобразит координату пикселя и его значение серого – целое или с плавающей запятой – в правом верхнем углу окна. Изображение может быть увеличено (и уменьшено), мы можем отобразить гистограмму или профиль интенсивности вдоль линии между любыми двумя выбранными точками или изменить цветовую Цветовая карта сопоставкарту . Функция имеет множество опций, которые описаны управляет лением значений в онлайн-документации. пикселей с отображаемой интенсивноМы можем так же легко загрузить цветное изображение стью или цветом. >> f lowers = iread('f lowers8.png'); >> about(f lowers) f lowers [uint8] : 426x640x3 (817920 bytes) которое представляет собой матрицу значений uint8 размером 426´640´3, как показано на рис. 4.1b. Его можно рассматривать как матрицу 426´640 трехкомпонентных значений RGB, каждое из которых является трехэлементным вектором. Например, пиксель с координатами (318, 276) >> pix = f lowers(276,318,:) ans(:,:,1) = 57 ans(:,:,2) = 91 ans(:,:,3) = 198 имеет трехкомпонентное значение (57, 91, 198), но отображается в MATLAB необычным и некомпактным способом. Это связано с тем, что значение пикселя >> about(pix) pix [uint8] : 1x1x3 (3 bytes) само является матрицей 1´1´3. Первые два измерения называются одноэлементными измерениями (синглетонами), и мы можем их исключить: Получение изображения 179 >> squeeze(pix)' ans = 57 91 198 что дает нам более знакомый трехмерный вектор. Этот пиксель принадлежит одному из маленьких синих цветков и имеет большую синюю составляющую. Мы можем отобразить изображение и просмотреть его в интерактивном режиме с по­мощью idisp, и щелчок по пикселю отобразит его трехцветное значение. Трехкомпонентные значения имеют тип uint8 в диапазоне [0, 255], но изображение может быть преобразовано в значения двойной точности в диапазоне [0, 1] при помощи добавления опции 'double' к вызову функции iread или применения функции idouble к целочисленному цветному изображению аналогично тому, как это делается для изображений в оттенках серого. Изображение представляет собой матрицу с тремя измерениями, и третье измерение, показанное на рис. 4.2, называется индексом цветовой плоскости. Например >> idisp( flowers(:,:,1) ) будет отображать плоскость красного цвета как изображение в оттенках серого, которое показывает красный стимул в каждом пикселе. Индекс 2 или 3 будет выбирать зеленую или синюю плоскость соответственно. Рис. 4.2. Цветное изображение, представленное в виде структуры с тремя измерениями: строкой, столбцом и цветовой плоскостью высота столбец синяя плоскость ширина зеленая плоскость красная плоскость Используя стандарт 709 по умолчанию (см. также (3.11) Параметр «серый» обеспечивает возврат изображения в оти монадическую функцию imono тенках серого независимо от того, содержит ли файл цветное Toolbox). изображение . Параметр «гамма» выполняет гамма-декоди- 180 Глава 4 · Изображения и их обработка рование и возвращает линейное изображение, в котором уровни серого или трехцветные значения пропорциональны яркости исходной сцены. Функция iread также может принимать имена файлов с подстановочными знаками, что позволяет ей загружать последовательность файлов. Например, код >> seq = iread('seq/*.png'); >> about(seq) seq [uint8] : 512x512x9 (2.4 MB) загружает девять изображений в формате PNG из папки seq. Результатом является матрица H´W´N, а последний индекс представляет номер изображения в последовательности. То есть seq(:,:,k) является k-м изображением в последовательности и представляет собой изображение в оттенках серого 512´512. С точки зрения рис. 4.2 изображения в последовательности простираются в направлении p. Если бы изображения были цветными, то результатом была бы матрица H´W´3´N, где последний индекс представляет номер изображения в последовательности, а третий индекс – цветовую плоскость. Формат JPEG основан на алгоритме сжатия с потерями для уменьшения размера файла. В отличие от обычного сжатия файлов (например, zip, rar и т. д.), распакованный образ не совпадает с исходным изображением, что позволяет использовать гораздо более высокие уровни сжатия. Сжатие JPEG использует ограничения человеческого глаза и отбрасывает незаметную информацию, такую как очень небольшие изменения цвета (которые воспринимаются менее точно, чем небольшие изменения яркости) и мелкую текстуру. Очень важно помнить, что JPEG предназначен для сжатия изображений, которые будут просматривать люди. Потеря цветовых деталей и тонкой текстуры может стать проблемой для компьютерных алгоритмов, анализирующих изображения. JPEG был создан, чтобы качественно сжимать естественные сцены, но он хуже справляется с надписями и штриховыми рисунками, в которых много элементов с высокой пространственной частотой. Величину потерь можно варьировать, регулируя степень сжатия, что позволяет найти компромисс между качеством изображения и размером файла. JPEG можно использовать как для цветных изображений, так и для оттенков серого. То, что обычно называют файлом JPEG, часто с расширением .jpg или .jpeg, более правильно называть файлом JPEG JFIF. JFIF – это формат файла, который также содержит изображение, сжатое в формате JPEG как метаданные. Формат файла EXIF (Exchangeable Image File Format) является стандартом для метаданных, связанных с камерой, таких как настройки камеры, время, местоположение и т. д. Эти метаданные можно получить в качестве второго выходного аргумента для iread в виде массива ячеек или с по­мощью утилиты командной строки, такой как exiftool (http://www.sno.phy.queensu.ca/~phil/exiftool). Подробную информацию о формате можно найти на веб-сайте независимой группы JPEG http://www. ijg.org. Получение изображения 181 Если iread вызывается без аргументов, появляется всплывающее окно просмотра файлов, позволяющее перемещаться по файловой системе для поиска изображения. Функция также принимает URL-адрес, позволяющий загружать изображение (но не последовательность) из интернета. Эта функция может читать наиболее распространенные форматы файлов изображений, включая JPEG, TIFF, GIF, PNG, PGM, PPM, PNM. Многие форматы файлов изображений также содержат обширные метаданные – «данные о данных» текущего файла. Файлы JPEG, созданные большинством цифровых камер, содержат особенно полные метаданные, которые могут быть извлечены путем предоставления второго выходного аргумента для iread: >> [im,md]=iread('church.jpg'); >> md md = ... Width: 1280 Height: 851 Make: 'Panasonic' Model: 'DMC-FZ30' Orientation: 1 DigitalCamera: [1x1 struct] А вложенная структура DigitalCamera содержит дополнительные сведения о настройках камеры для конкретного изображения: >> md.DigitalCamera ans = ... ExposureTime: 0.0025 FNumber: 8 ISOSpeedRatings: 80 Flash: 'Flash did not fire ...' FocalLength: 7.4000 Более подробно доступная информация и параметры iread описаны в онлайн-документации. 4.1.2 Изображения с подключенной камеры Toolbox предо- Большинство портативных компьютеров сегодня имеет встроставляет простой енную камеру для видеоконференций. К компьютерам без интерфейс для камеры для MacOS, встроенной камеры можно легко подключить внешнюю камеру Linux и Windows, но через соединение USB или FireWire. Способ доступа к камере задля более общей висит от операционной системы . Список всех подключенных поддержки требуется Image Acquisition камер и их разрешения можно получить при помощи функции Toolbox. >> VideoCamera('?') 182 Глава 4 · Изображения и их обработка Открываем конкретную камеру: >> cam = VideoCamera('name') Функция возвращает экземпляр объекта VideoCamera, который является подклассом класса ImageSource. Если имя не указано, используется первая найденная камера. Конструктор принимает ряд дополнительных аргументов, таких как 'grey', который гарантирует, что возвращаемое изображение будет полутоновым независимо от типа камеры, 'gamma' для применения гамма-декодирования и 'framerate', который задает количество кадров, снятых в секунду. Преобразование количества фотонов в значения пикселей. Внутри камеры происходит много разных интересных вещей. Количество фотонов, падающих на фотоячейку за фиксированный интервал времени, подчиняется распределению Пуассона. Среднее число фотонов и дисперсия пропорциональны яркости – эта дисперсия проявляется как дробовой шум в значении пикселя. Часть этих фотонов преобразуется в электроны – это квантовая эффективность сенсора, – и они накапливаются в зарядовом колодце (charge well) фотоячейки. Количество захваченных фотонов пропорционально площади поверхности, но не вся фотоячейка чувствительна к свету из-за наличия транзисторов и других элементов – доля чувствительной площади фотоячейки называется коэффициентом заполнения. Для КМОП-сенсоров она может быть менее 50 %, но этот параметр можно улучшить, изготовив микролинзы над каждой фотоячейкой. Заряд также хорошо аккумулирует термически генерируемые электроны – темновой ток, который пропорционален температуре и является источником шума, поэтому камеры, работающие при экстремально слабом освещении, дополнительно охлаждаются. Другим источником шума является неравномерность пикселей из-за того, что соседние пиксели имеют разное усиление или смещение, поэтому однородное освещение дает пиксели с разными значениями, что является аддитивным шумом. Зарядовый колодец имеет ограниченную емкость, и при чрезмерном освещении избыточные электроны могут перетечь в соседние колодцы, что приведет к засветке и обесцвечиванию изображения. Накопленный заряд, состоящий из тепловых и фотоэлектронов, считывается в конце интервала экспозиции. В недорогих КМОП-сенсорах зарядовые колодцы последовательно подключаются через коммутатор к одному или нескольким аналого-цифровым преобразователям на кристалле. Это так называемый механизм скользящего затвора, который при съемке высокоскоростного относительного движения приводит к разрывам движе- Получение изображения 183 ния или эффекту желе, как показано справа. Более дорогие датчики CMOS и CCD имеют глобальный затвор – они делают моментальный промежуточный снимок заряда в буфере, который затем последовательно оцифровывается. Экспозиция сенсора описывается выражением где L – яркость сцены (в нитах), T – время экспозиции, N – это f-число (обратный диаметр диафрагмы), а q » 0.7 – функция фокусного расстояния, качества объектива и виньетирования. Время экспозиции T имеет верхнюю границу, равную обратной частоте кадров. Чтобы избежать размытия при движении, требуется короткое время экспозиции, что приводит к более темным и шумным изображениям. Целочисленное значение пикселя равно x = kH, где k – усиление, связанное с настройкамиa) ISO камеры. Для получения изображения sRGB со средним значением 118b) требуемая экспозиция составляет где SSOS – это рейтинг ISO, стандартная выходная чувствительность (standard output sensitivity, SOS) цифровой камеры. Чем выше значение ISO, тем выше яркость изображения за счет большего усиления измеренного заряда, но также усиливаются различные источники шума, что приводит к увеличению шума изображения в виде зернистости. В фотографии настройки камеры, управляющие яркостью изображения, могут быть объединены в значение экспозиции (exposure value, EV) , и все комбинации f-числа и скорости затвора с одинаковым значением EV дают одинаковую экспозицию. Это позволяет найти компромисс между апертурой (глубина резкости) и временем экспозиции (размытие в движении). В большинстве недорогих камер диафрагма фиксирована, и камера управляет экспозицией с по­мощью T вместо того, чтобы использовать дорогую и медленную механическую диафрагму. Разница в 1 EV – это двукратное изменение экспозиции, которое фотографы называют остановкой (stop) или ступенью. Увеличение EV приводит к более темному изображению – большинство цифровых зеркальных камер позволяет вам вручную регулировать EV относительно того, что определил экспонометр камеры. a) Которые обратно совместимы с историческими шкалами (ASA, DIN, ISO), разработанными для отражения чувствительности химических пленок для фотоаппаратов – большее число отражало более чувствительную, или «быструю», пленку. b) Насыщенность 18 %, средний серый цвет, 8-битные пиксели с гаммой 2.2. 184 Глава 4 · Изображения и их обработка Размеры изображения, возвращаемого камерой, задаются Поскольку кадры генерируются со методом size: скоростью R в се>> cam.size() а изображение получается методом grab: >> im = cam.grab(); который ожидает, пока следующий кадр не станет доступным . Без выходных аргументов полученное изображение отображается с по­мощью idisp. кунду, как указано в параметре 'framerate', то ожидание в наихудшем случае равномерно распределяется в интервале [0,1/R). Незахваченные изображения не накапливаются, они отбрасываются. Динамический диапазон сенсора – это отношение его наибольшего значения к наименьшему. Для изображений полезно использовать log2 этого отношения, что делает его эквивалентным значениям экспозиции. Каждая фотоячейка содержит зарядовый колодец, в котором генерируемые фотонами электроны накапливаются в течение периода экспонирования. Зарядовый колодец имеет конечную емкость до насыщения фотоячейки, и это определяет максимальное значение. Минимальное число электронов не равно нулю, а является конечным числом термически генерируемых электронов. 8-битное изображение имеет динамический диапазон около 8, 10-битная камера высокого класса имеет диапазон 10, а фотопленка может обеспечить диапазон 10–12, но она довольно нелинейна. В определенном состоянии адаптации человеческий глаз имеет динамический диапазон в 10 ступеней, но общий диапазон адаптации составляет впечатляющие 20 ступеней. Это достигается за счет использования радужной оболочки и более медленной (десятки минут) химической адаптации чувствительности палочек. Темновая адаптация к слабому освещению медленная, тогда как адаптация от темноты к яркому происходит быстрее, но иногда болезненна. Форматы видеофайлов. Так же как и для файлов изображений, существует большое количество различных форматов видеофайлов. Наиболее распространенными форматами являются MPEG и AVI. Важно четко понимать разницу между форматом файла (контейнера) и типом сжатия (кодеком), используемым для изображений в файле. Файлы форматов MPEG и AVI можно преобразовать в последовательность кадров в виде отдельных файлов с по­ мощью таких инструментов, как FFmpeg и convert из пакета ImageMagick. Затем отдельные кадры можно по отдельности загрузить в MATLAB для обработки с по­мощью iread. Класс Movie Toolbox предоставляет более удобный способ чтения кадров непосредственно из распространенных форматов фильмов без необходимости сначала преобразовывать фильмы в набор отдельных кадров (изображение карты слов получено от tagxedo.com). Получение изображения 185 4.1.3 Изображения из видеофайла В разделе 4.1.1 мы загружали в память последовательность изображений, где каждое изображение было взято из отдельного файла изображения. Чаще всего последовательности изображений сохраняются в формате файла фильма, таком как MPEG4 или AVI, и может быть нецелесообразно или невозможно хранить всю последовательность в памяти. Toolbox поддерживает чтение кадров из файла фильма, сохраненного в любом из популярных форматов, таких как AVI, MPEG и MPEG4. Например, мы можем открыть файл фильма при помощи кода >> cam = Movie('traff ic_sequence.mpg'); traff ic_sequence.mpg 720 x 576 @ 30 fps; 351 frames, 11.7 sec cur frame 1/351 (skip=1) который возвращает объект Movie, являющийся экземпляром подкласса класса ImageSource и, следовательно, полиморфен только что описанному классу VideoCamera. Этот фильм имеет 350 кадров и снят со скоростью 30 кадров в секунду. Размер каждого кадра в фильме >> cam.size() ans = 720 576 и следующий кадр считывается из файла фильма командами >> im = cam.grab(); >> about(im) im [uint8] : 576x720x3 (1244160 bytes) Кадр представляет собой цветное изображение 720´576. С помощью этих нескольких примитивов мы можем написать очень простой проигрыватель фильмов 1 2 3 4 5 while 1 im = cam.grab; if isempty(im) break; end image(im); drawnow end где проверка в строке 3 предназначена для обнаружения конца файла, и в этом случае функция захвата возвращает пустую матрицу. Методы nframes и framerate предоставляют общее количество кадров и количество кадров в секунду. Методы skiptotime и skiptoframe позволяют выбирать определенные кадры в фильме. 186 Глава 4 · Изображения и их обработка 4.1.4 Изображения из интернета Термин «веб-камера» стал обозначать любую локальную камеру, подключенную к компьютеру через порт USB или Firewire, но здесь мы используем его для обозначения камеры, подключенной к интернету через веб-сервер, предоставляющий Веб-камеры изображения по запросу. По всему миру установлены десятки поддерживают различные параметры, тысяч таких веб-камер, направленных на различные сцены, от которые можно обыденных до захватывающих. Получив URL-адрес веб-камеры встроить в URLот Axis Communications , мы можем скачать изображение с ка- адрес, и для них не существует меры в любой точке мира и поместить его в матрицу в нашем стандарта. Эта рабочем пространстве MATLAB. функция Toolbox Например, мы можем подключиться к камере в Дартмутском поддерживает только веб-камеры Axis колледже в Нью-Гемпшире Communications. >> cam = AxisWebCamera('http://wc2.dartmouth.edu'); которая возвращает объект AxisWebCamera, являющийся экземпляром подкласса класса ImageSource и, следовательно, полиморфный ранее описанным классам VideoCamera и Movie. Размер изображения в этом случае: >> cam.size() ans = 480 640 Следующее изображение получается при помощи команды >> im = cam.grab(); которая возвращает цветное изображение наподобие показанного на рис. 4.3. Веб-камеры настраиваются их владельцем на Соотношение сторон – это отношение ширины изображения к его высоте. Оно значительно различается в зависимости от различных технологий обработки изображений и дисплеев. Для 35-мм пленки это соотношение равно 3:2 (1.5), что соответствует отпечатку 4´6 дюймов (1.5). Существуют и другие соотношения сторон: 5´7 дюймов (1.4) и 8´10 дюймов (1.15), которые требуют обрезки вертикальных краев изображения для его размещения на стандартном мониторе. В телевизорах и ранних компьютерных мониторах использовался формат 4:3 (1.33), например распространенный формат VGA 640´480. Формат HDTV остановился на соотношении 16:9 (1.78). Современные цифровые зеркальные камеры обычно используют соотношение 1.81, что близко к соотношению для HDTV. В кинотеатрах предпочтение отдается очень широким изображениям с соотношением сторон 1.85 или даже 2.39. Формат CinemaScope был разработан компанией 20th Century Fox на основе работ Анри Кретьена в 1920-х гг. Анаморфотный объектив на камере сжимает широкое изображение до стандартного соотношения сторон в камере, а на проекторе процесс происходит в обратном порядке. Получение изображения 187 v (пиксели) периодическую съемку изображений, от одного раза в секунду до одного раза в минуту. Повторный доступ будет возвращать одно и то же изображение до тех пор, пока камера не сделает следующий снимок. Рис. 4.3. Изображение с веб-камеры Дартмутского университета, которая направлена на главную лужайку колледжа 4.1.5 u (пиксели) Изображения с карт Вы можете получить доступ к изображениям со спутника и дорожным картам любой точки планеты из MATLAB. Сначала создайте экземпляр объекта EarthView Чтобы получить >> ev = EarthView('key', YOUR_KEY); ключ API, вам необходимо зарегистрироваться в Google где YOUR_KEY – это строка, содержащая ваш 86-символьный ключ Developers Console Google API . Получить спутниковый снимок моего универсии согласиться со- тета очень просто: блюдать условия использования >> ev.grab(-27.475722,153.0285, 17); Google. Уровень масштаСнимок показан на рис. 4.4a, а аргументами являются шибирования – это рота, долгота и уровень масштабирования . Без выходных целое число, а значение, равное аргументов результат будет отображаться с по­мощью idisp. нулю, возвращает Если координаты неизвестны, мы можем выполнить поиск по вид, охватывающий имени всю Землю. Каждое увеличение на >> ev.grab('QUT brisbane', 17) единицу удваивает разрешение в наВместо вида со спутника можно выбрать вид дорожной карты правлениях x и y. >> ev.grab(-27.475722,153.0285, 15, 'map'); 188 Глава 4 · Изображения и их обработка который показывает обширную картографическую информацию, такую как названия дорог и мест. Более простое представление дает команда >> ev.grab(-27.475722,153.0285, 15, 'roads'); v (пиксели) v (пиксели) результат которой показан на рис. 4.4 в виде бинарного изображения, где белые пиксели соответствуют дорогам, а все остальное показано черным. Мы могли бы использовать эту сетку дорог для планирования пути робота. a 4.1.6 u (пиксели) b u (пиксели) Изображения из кода При отладке алгоритма бывает очень полезно начать с идеального и простого изображения, прежде чем переходить к более сложным изображениям реального мира. Вы можете нарисовать такое изображение с по­мощью своего любимого приложения для рисования и импортировать его в MATLAB или нарисовать его непосредственно в MATLAB. Функция Toolbox testpattern создает простые изображения с различными шаблонами, включая линии, сетки точек или квадратов, линейные изменения интенсивности и синусоидальные диаграммы интенсивности. Например: >> im = testpattern('rampx', 256, 2); >> im = testpattern('siny', 256, 2); >> im = testpattern('squares', 256, 50, 25); >> im = testpattern('dots', 256, 256, 100); Результат показан на рис. 4.5а. Второй аргумент – это размер создаваемого изображения, в данном случае все они составляют 256´256 пикселей, а остальные аргументы зависят от типа запрошенного шаблона. Подробности смотрите в онлайн-документации. Рис. 4.4. a) Вид с воздуха на Брисбен, Австралия, цветной аэрофотоснимок; b) бинарное изображение или транспортная сетка, где белые пиксели – это дороги, по которым можно проехать (изображения предоставлены Google, CNES/Astrium, Sinclair Knight Merz & Fugro) Получение изображения 189 v (пиксели) Рис. 4.5. Изображения из кода: a) некоторые тестовые шаблоны, сгенерированные Toolbox; b) простое изображение, созданное из графических примитивов a b u (пиксели) Изображение/ Мы также можем создать изображение из простых графичематрицу можно ских примитивов . Сначала создадим пустой холст, содержаредактировать с по­мощью команды щий только черные пиксели (значение пикселя равно нулю): openvar('canvas'), которая вызывает >> canvas = zeros(1000, 1000); интерфейс, похожий на электронную а затем создадим два квадрата: таблицу. >> sq1 = 0.5 * ones(150, 150); >> sq2 = 0.9 * ones(80, 80); Первый имеет значение пикселя 0.5 (средне-серый) и размер 40´40. Второй меньше (всего 20´20), но ярче – со значением пикселя 0.9. Теперь мы можем вставить их на холст: >> canvas = ipaste(canvas, sq1, [100 100]); >> canvas = ipaste(canvas, sq2, [300 300]); где последний аргумент указывает координату холста (u, v), ку­да будет вставлен шаблон – верхний левый угол шаблона на холсте. Мы также можем создать круг >> circle = 0.6 * kcircle(120); радиусом 30 пикселей со значением серого 0.6. Функция kcircle Toolbox возвращает квадратную матрицу >> size(circle) ans = 61 61 состоящую из нулей с центрированным максимальным диском значений, равным единице. Мы также можем вставить ее на холст: >> canvas = ipaste(canvas, circle, [600, 200]); 190 Глава 4 · Изображения и их обработка Наконец, нарисуем на нашем холсте отрезок: >> canvas = iline(canvas, [100 100], [800 800], 0.8); который простирается от точки (100, 100) до точки (800, 800), и все его пиксели имеют яркость 0.8. Результат >> idisp(canvas) показан на рис. 4.5b. Можно ясно видеть, что объекты имеют В компьютерной обычно разную яркость, и заметно также, что линия и круг искажены графике применяется эффектами квантования, которые приводят к ступенчатой фор- сглаживание, когда краевым пикселям ме краев . Обратите внимание, что все эти функции принимают координаты, выраженные в нотации (u, v), а не в нотации столбцов-строк MATLAB. Верхний левый пиксель равен (1, 1), а не (0, 0). 4.2 Гистограммы изображений Распределение значений пикселей предоставляет полезную информацию о качестве изображения и композиции сцены. Мы получаем распределение, вычисляя гистограмму изображения, которая показывает, сколько раз встречается значение каждого пикселя. Например, гистограмма изображения, показанного на рис. 4.8а, вычисляется и отображается с по­мощью кода >> church = iread('church.png', 'grey'); >> ihist( church ) Результат показан на рис. 4.6а. Мы видим, что значения серого (горизонтальная ось) охватывают диапазон от 5 до 238, что близко к полному диапазону возможных значений. Если бы изображение было недоэкспонировано, область гистограммы была бы сжата влево. Если бы изображение было переэкспонировано, гистограмма была бы растянута вправо, и многие пиксели имели бы максимальное значение. Кумулятивная гистограмма показана на рис. 4.6b, но ее использование будет обсуждаться в следующем разделе. Гистограммы также могут быть рассчитаны для цветных изображений, и в этом случае результатом будут три гистограммы – по одной для каждого цветового канала. Для этого изображения распределение значений пикселей далеко не равномерно, и мы видим, что есть три значимых пика. Однако, если присмотреться повнимательнее, мы увидим множество очень незначительных пиков. Форма пика зависит и пикселям, примыкающим к краям, присваивают дробные значения серого, что создает впечатление более гладкой линии. Количество пикселей Накопительное количество пикселей Гистограммы изображений 191 a Уровень серого b Оригинал Нормализовано Уровень серого Рис. 4.6. Изображение от масштаба, в котором мы рассматриваем данные. Можно поцеркви: лучить гистограмму как пару векторов: a) гистограмма, b) кумулятивная >> [n,v] = ihist(church); гистограмма до и после нормализации где элементы n – это количество раз, когда встречаются пиксели со значением, соответствующим элементу v. Функция Toolbox peak автоматически найдет положение пиков: >> [~,x] = peak(n, v) >> about x x [double] : 1x58 (464 bytes) В этом случае было обнаружено 58 пиков, большинство из которых весьма незначительны. Значимые пики не только больше, чем их непосредственные соседи, они больше, чем все другие значения поблизости – теперь проблема состоит в том, чтобы определить, что мы подразумеваем под соседними пиками. Например, пики, превышающие все остальные значения в пределах ±25 пикселей в горизонтальном направлении >> [~,x] = peak(n, v, ‚scale', 25) x = 213 147 41 которые являются тремя значительными пиками, наблюдаемыми невооруженным глазом. Важнейшей частью поиска пиков является выбор подходящего масштаба. Обнаружение пиков – это тема, с которой мы столкнемся позже и которая дополнительно обсуждается в приложении H. Пики на гистограмме соответствуют определенным группам пикселей изображения. Самый низкий соответствует темным пикселям, которые обычно принадлежат земле и крыше. Средний пик обычно соответствует пикселям неба, а самый высокий – белым стенам. Однако каждый из элементов сцены имеет распределение значений серого, и для большинства реальных 192 Глава 4 · Изображения и их обработка сцен мы не можем просто сопоставить уровень серого с элементом сцены. Например, некоторые пиксели неба ярче, чем некоторые пиксели стен, и очень небольшое количество пикселей земли ярче, чем некоторые пиксели неба и стен. 4.3 Монадические операции Монадические (monadic, одноместные) операции обработки изображений схематично показаны на рис. 4.7. Результатом является изображение того же размера W´H, что и входное изображение, и каждый выходной пиксель является функцией соответствующего входного пикселя. O[u, v] = f(I[u, v]), ∀(u, v) ∈ I. входное изображение выходное изображение Один полезный класс монадических функций изменяет тип данных пикселей. Например, чтобы перейти от uint8 (целочисленные значения пикселей в диапазоне [0, 255]) к значениям двойной точности в диапазоне [0, 1], мы используем функциюToolbox idouble: >> imd = idouble(church); и обратный переход: >> im = iint(imd); Цветное изображение имеет три измерения, и мы также можем рассматривать его как двухмерное изображение, где каждое значение пикселя является трехмерным вектором. Монадическая операция может преобразовать цветное изображение в изображение в оттенках серого, где значение каждого выходного пикселя является скаляром, представляющим яркость соответствующего входного пикселя. Рис. 4.7. Монадические операции обработки изображений. Каждый выходной пиксель является функцией соответствующего входного пикселя (показан красным) Монадические операции 193 >> grey = imono(f lowers); Обратная операция >> color = icolor(grey); возвращает трехмерное цветное изображение, где каждая цветовая плоскость равна grey – при отображении оно по-прежнему выглядит как монохромное изображение. Мы можем создать цветное изображение, где красная плоскость равна входному изображению, с по­мощью команды >> color = icolor(grey, [1 0 0]); Результат представляет собой окрашенную в красный цвет версию исходного изображения. Очень распространенной монадической операцией является установка порога. Это логическая монадическая операция, которая разделяет пиксели на два класса в зависимости от их интенсивности: >> bright = (church >= 180); >> idisp(bright) И полученное изображение дано на рис. 4.8b, где все пиксели, лежащие в интервале [180, 255], показаны белым цветом. Такие изображения, где пиксели имеют только два значения, называются бинарными. Глядя на гистограмму изображения на рис. 4.6а, мы видим, что значение серого 180 находится посередине между вторым и третьим пиком, что является хорошим приближением к оптимальной стратегии разделения пикселей, принадлежащих этим двум популяциям. Переменная bright имеет логический тип, где пиксели имеют значения только true или false. MATLAB автоматически преобразует их в единицу и ноль соответственно при использовании в арифметических операциях, и функция idisp делает то же самое. Многие монадические операции связаны с изменением распределения уровней серого в изображении. Иногда изображение Гистограмма такого изображения будет не охватывает весь диапазон доступных уровней серого, наприиметь пробелы. мер оно недоэкспонировано или переэкспонировано. Мы можем Если M – макси- применить линейное отображение к значениям шкалы серого: мально возможное значение пикселя, >> im = istretch(church); а N < M – максимальное значение в изображении, то что гарантирует, что значения пикселей охватывают весь диарастянутое изо- пазон , который составляет либо [0, 1], либо [0, 255], в зависибражение будет мости от класса изображения. иметь не более Более сложной версией является нормализация или выравN уникальных значений пикселя, т. е. нивание гистограммы: значения M – N не могут встречаться. >> im = inormhist(church); 194 Глава 4 · Изображения и их обработка a b с d e f Рис. 4.8. Некоторые монадические операции с изображением: a) исходное изображение, b) пороговое значение, c) нормализация гистограммы, d) гамма-коррекция, e) увеличение яркости, f) постеризация. Вставка на каждом рисунке представляет собой график, показывающий сопоставление уровня серого изображения по горизонтальной оси с выходным значением по вертикальной оси на основе кумулятивного распределения >> ihist(church, 'cdf'); как показано на рис. 4.6b. Балансировка исходного изображения с по­мощью нормализованного кумулятивного распределения гарантирует, что кумулятивное распределение результирующего изображения будет линейным – все значения серого встречаются одинаковое количество раз. Результат показан на рис. 4.8c, где были выделены детали текстуры стен и неба, которые имели очень маленькую вариацию уровня серого. Диадические операции 195 Такие операции, как isstretch и inormhist, могут улучшить изображение с точки зрения человека-наблюдателя, но важно помнить, что к изображению не добавляется никакой новой информации. Последующие этапы обработки изображения не приведут к улучшениям. Как обсуждалось в разделе 3.3.6, выходной сигнал камеры обычно подвергается гамма-кодированию, так что значение пикселя представляет собой нелинейную функцию Lγ яркости, воспринимаемой фотоячейкой. Такие изображения можно гамма-декодировать с по­мощью нелинейной монадической операции >> im = igamm(church, 1/0.45); которая возводит каждый пиксель в указанную степень, как показано на рис. 4.8d, или >> im = igamm(church, 'sRGB'); Гамма-коррекция для декодирования изображений со стандартной гамма-кодив данном случае ровкой sRGB . применялась Еще одной простой нелинейной монадической операцией дважды: один раз с по­мощью функции является постеризация (выделение нескольких диапазонов). igamm и один Эффект поп-арта достигается за счет уменьшения количества раз с по­мощью устройства отобра- уровней серого: жения. Из-за этого результирующее >> idisp( church/64 ) изображение выглядит неестественно как показано на рис. 4.8f. Поскольку используется целочисленвысококонтрастным. ное деление, результирующее изображение имеет пиксели со значениями в диапазоне [0, 3] и, следовательно, всего четыре разных оттенка серого. Наконец, поскольку изображение представлено матрицей, любая поэлементная матричная функция или оператор MATLAB являются монадическим (одноместным) оператором, например унарным отрицанием, скалярным умно­ жением или сложением или такими функциями, как abs или sqrt. 4.4 Диадические операции Диадические (dyadic, двухместные) операции схематично показаны на рис. 4.9. Два входных изображения дают одно выходное изображение, и все три изображения имеют одинаковый размер. Каждый выходной пиксель является функцией соответствующих пикселей в двух входных изображениях: O[u, v] = f(I 1[u, v], I 2[u, v]), ∀(u, v) ∈ I1. 196 Глава 4 · Изображения и их обработка входное изображение входное изображение выходное изображение Рис. 4.9. Диадические операции обработки изображений. Каждый выходной пиксель является функцией двух соответствующих входных пикселей (показаны красным) Примерами полезных двоичных операций могут служить бинарные арифметические операторы, такие как сложение, вычитание, поэлементное умножение, или встроенные функции двоичных матриц MATLAB, такие как max, min, atan2. Вычитание одного изображения uint8 из другого дает нам новое изображению uint8, даже если результат потенциально отрицательный. MATLAB вполне правильно интерпретирует значения пикселей в интервале [0, 255], поэтому вычитание большего числа из меньшего приведет к нулю, а не к отрицательному значению. При сложении результат больше 255 будет установлен на 255. Чтобы обойти это ограничение, изображения должны быть сначала преобразованы в целые числа со знаком с по­мощью функции cast MATLAB или в значения с плавающей запятой с по­мощью функции idouble Toolbox. Проиллюстрируем диадические операции двумя примерами. Первым примером послужит хромакей (chroma-key) – метод, обычно используемый на телевидении для наложения изображения человека на какой-либо фон, например диктора погоды, наложенного на карту погоды. Объект снимается на синем или зеленом фоне, что позволяет легко, используя только значения пикселей, отличить фон от объекта. Загружаем изображение предмета, снятое перед зеленым экраном >> subject = iread('greenscreen.jpg', 'double'); как показано на рис. 4.10а. Вычисляем координаты цветности (уравнение 3.9) >> linear = igamm(subject, 'sRGB'); >> [r,g] = tristim2cc(linear); после первого преобразования гамма-кодированного цветного изображения в линейные трехцветные значения. В этом случае Диадические операции 197 одного g достаточно, чтобы различить фоновые пиксели. Гистограмма значений >> ihist(g) показанная на рис. 4.10b, указывает на большую совокупность пикселей около 0.55, которая является фоном, и другую совокупность, принадлежащую объекту. Можно смело сказать, что к предмету относится любой пиксель, для которого g < 0.45, и создать маску изображения >> mask = g < 0.45; >> idisp(mask) где пиксель является истинным (равный единице и отображается белым цветом), если он является частью объекта, как показано на рис. 4.10c. Нам нужно применить эту маску ко всем трем цветовым плоскостям, поэтому мы реплицируем ее: v (пиксели) Количество пикселей >> mask3 = icolor( idouble(mask) ); c b Цветность (g) v (пиксели) u (пиксели) v (пиксели) a u (пиксели) d u (пиксели) Рис. 4.10. Как работает хромакей: a) объект на зеленом фоне; b) гистограмма значений цветности зеленого; c) вычисленное изображение маски, где true означает белый цвет; d) объект, наложенный на фоновую сцену (фото любезно предоставлено Фионой Корк) 198 Глава 4 · Изображения и их обработка Получаем изображение предмета без фона: >> idisp(mask3 .* subject); Далее загружаем желаемое фоновое изображение: >> bg = iread('road.png', 'double'); выполняем масштабирование и обрезку, чтобы оно было того же размера, что и исходное изображение: >> bg = isamesize(bg, subject); и отображаем его с вырезом для предмета >> idisp(bg .* (1-mask3)) Наконец, мы добавляем объект без фона к фону без объекта, чтобы получить объект, наложенный на фон: >> idisp( subject.*mask3 + bg.*(1-mask3) ); как показано на рис. 4.10d. Этот метод, конечно, не сработает, На заре телевидения использовался если объект содержит цвета, совпадающие с цветом фона . За- синий экран. Сегоддачу можно решить более компактно, используя функцию по- ня более популярен зеленый фон из-за пиксельного переключения Toolbox ipixswitch: >> ipixswitch(mask, subject, bg); где все аргументы являются изображениями одинаковой ширины и высоты, а каждый выходной пиксель выбирается из соответствующего пикселя на втором или третьем изображении в соответствии с логическим значением соответствующего пикселя на первом изображении. Способность отличать объекты переднего плана от фона – важная проблема зрения роботов, но термины «передний план» и «фон» нестрого определены и специфичны для конкретного применения. В робототехнике мы редко можем позволить себе роскошь использования специального фона, как это было в примере с хромакеем. Вместо этого мы могли бы сделать снимок сцены без объекта переднего плана и считать все остальное фоном, но для этого требуется специальное знание о том, когда объект переднего плана отсутствует. Также предполагается, что фон не меняется со временем. Вариативность представляет собой серьезную проблему в сценах реального мира, где окружающее освещение и тени меняются за довольно короткие промежутки времени, а сцена может структурно изменяться на протяжении длительного времени. В следующем примере мы обрабатываем последовательность изображений и находим фон, несмотря на то что в сцене есть несколько движущихся объектов. Мы будем использовать проблем, возникающих с голубыми глазами и синей джинсовой одеждой. Диадические операции 199 рекурсивный алгоритм, который обновляет предполагаемое фоновое изображение B̂ на каждом временном шаге на основе предыдущей оценки и текущего изображения: B̂〈k+1〉 ← B̂〈k〉 + c(I〈k〉 – B̂〈k〉), где k – шаг по времени, а c(·) – монадическая функция насыщения изображения Для демонстрации этого примера откроем фильм, показы­ вающий движение транспорта через перекресток: >> vid = Movie('traff ic_sequence.mpg', 'grey', 'double') vid = traff ic_sequence.mpg 720 x 576 @ 30 fps; 351 frames, 11.7 sec cur frame 1/351 (skip=1) и инициализируем фон для первого изображения в последовательности >> bg = vid.grab(); затем запустим основной цикл: 1 sigma = 0.02; 2 while 1 3 im = vid.grab; 4 if isempty(im) break; end; % end of f ile? 5 d = im-bg; 6 d = max( min(d, sigma), -sigma); % apply c(.) 7 bg = bg + d; 8 idisp(bg); 9 end Один кадр из этой последовательности показан на рис. 4.11а. Предполагаемое фоновое изображение, как на рис. 4.11b, показывает статические элементы сцены, а движущиеся транспортные средства слегка размыты. Вычитание сцены из предполагаемого фона создает изображение, в котором яркие пиксели отличаются от фона, как видно на рис. 4.11c. Применение пороговой обработки к абсолютному значению этого разностного изображения показывает область изображения, где есть движение. Конечно, если автомобили стоят достаточно долго, они станут частью фона. v (пиксели) v (пиксели) 200 Глава 4 · Изображения и их обработка a b v (пиксели) u (пиксели) c 4.5 u (пиксели) u (пиксели) Рис. 4.11. Пример обнаружения дорожного движения в кадре 200: a) текущее изображение; b) предполагаемое фоновое изображение; c) разница между текущим и оценочным фоновым изображением, где белый цвет равен нулю, красный и синий являются отрицательными и положительными значениями соответственно, а величина обозначается интенсивностью цвета Пространственные операции Пространственные операции схематично показаны на рис. 4.12. Каждый пиксель выходного изображения является функцией всех пикселей в области, окружающей соответствующий пиксель входного изображения: O[u, v] = f(I [u + i, v + j]), ∀(i, j ) ∈ �, ∀(u, v) ∈ I, где � обозначает окно – обычно это квадратная область размером w´w с нечетной длиной стороны w = 2h + 1, где h ∈ �+ – полуширина. На рис. 4.12 окно включает все пиксели в области, отмеченной красным цветом. Пространственные операции эффективны благодаря множеству возможных функций f(·), линейных или нелинейных. В оставшейся части этого раздела обсуждаются линейные пространственные операторы, такие как сглаживание и обнаружение границ, а также некоторые нелинейные функции, такие как ранговая фильтрация и сопоставление с шаблоном. В следующем разделе рассматривается Пространственные операции 201 большой и важный класс нелинейных пространственных операторов – математическая морфология. 4.5.1 Линейная пространственная фильтрация Очень важным линейным пространственным оператором является корреляция: (4.1) где K ∈ �w´w – ядро, а элементы называются коэффициентами фильтра. Для каждого выходного пикселя соответствующее окно пикселей входного изображения � поэлементно умножается на ядро K. Центр окна и ядра определяются координатами (0, 0) и i, j ∈ [−h, h] ⊂ �´�. Эту операцию можно рассматривать как взвешенную сумму пикселей в окне, где веса определяются элементами ядра K. Корреляция часто записывается в операторной форме как O = K ⊕ I. Тесно связанной операцией является свертка (4.2) где K ∈ �w´w – ядро свертки. Обратите внимание, что в первом члене уравнения изменился знак индексов i и j. Свертка часто записывается в операторной форме как O = K ∗ I. Рис. 4.12. Операции пространственной обработки изображений. Красным цветом показано окно �, представляющее собой набор пикселей, используемых для вычисления выходного пикселя (показан красным) входное изображение выходное изображение 202 Глава 4 · Изображения и их обработка Как вы скоро увидите, свертка – это рабочая лошадка обработки изображений, и для выполнения таких функций, как сглаживание, вычисление градиента или обнаружение краев, можно выбрать подходящее ядро K. Свертка требует больших вычислительных ресурсов – входное изображение N´N с ядром w´w требует w 2N 2 умножений и сложений. В Toolbox свертка выполняется с по­мощью функции iconvolve: O = iconvolve (K, I); Если I имеет несколько цветовых плоскостей, то и выходное изображение будет таким же – каждая выходная цветовая плос­ кость является сверткой соответствующей входной плоскости с ядром K. 4.5.1.1 Сглаживание Рассмотрим ядро свертки, представляющее собой квадратную матрицу 21´21, содержащую одинаковые элементы: >> K = ones(21,21) / 21^2; Матрица имеет единичный объем, т. е. сумма ее элементов равна единице. Результатом свертки изображения с этим ядром будет изображение, в котором каждый выходной пиксель являРасфокусировка ется средним значением пикселей в соответствующей окрест- включает в себя ности 21´21 во входном изображении. Как и следовало ожи- ядро, которое представляет собой дать, это усреднение двухмерный паттерн Эйри или функцию sinc. Функция Гаусса аналогична по форме, но всегда приводит к сглаживанию, размытию или расфокусировке , положительна, тогда что мы видим на рис. 4.13b. Присмотревшись очень вниматель- как паттерн Эйри имеет отрицательно, мы увидим несколько слабых горизонтальных и вертикаль- ные кольца с малой ных линий – артефакт, известный как паразитная помеха, или амплитудой. >> mona = iread('monalisa.png', 'double', 'grey'); >> idisp( iconvolve(mona, K) ); Корреляция или свертка? Эти два термина часто используются вольно и имеют схожие, хотя и разные определения. Свертка – это пространственный эквивалент умножения в частотной области, а ядро свертки – это импульсная характеристика фильтра в частотной области. У свертки также есть много полезных математических свойств, описанных соседнем примечании. Разница в индексации между уравнениями 4.1 и 4.2 эквивалентна отражению ядра по горизонтали и вертикали вокруг центральной точки. Многие ядра симметричны, и в этом случае корреляция и свертка дают один и тот же результат. Однако обнаружение границ всегда основано на несимметричных ядрах, поэтому мы должны позаботиться о применении свертки. Мы будем использовать корреляцию только для сопоставления шаблонов в разделе 4.5.2. v (пиксели) Пространственные операции 203 а u (пиксели) b u (пиксели) c u (пиксели) Рис. 4.13. «звон». Более подходящим ядром для сглаживания является Сглаживание: двухмерная функция Гаусса: a) исходное изображение; b) сглаживание ядром (4.3) усреднения 21×1; c) сглаживание гауссовым ядром G(σ = 5) размером 31×31 которая симметрична относительно начала координат, а объем под кривой равен единице. Разброс гауссовой кривой определяется параметром стандартного отклонения σ. Применение этого ядра к изображению >> K = kgauss(5); >> idisp( iconvolve(mona, K) ); дает результат, показанный на рис. 4.13c. Здесь мы задали стандартное отклонение гауссовой диаграммы, равное 5 пикселям. Дискретным приближением к гауссиану является ядро 31´31: Свойства свертки. Свертка подчиняется знакомым правилам алгебры, она: коммутативная: A ∗ B = B ∗ A, ассоциативная: A ∗ B ∗ C = (A ∗ B) ∗ C = A ∗ (B ∗ C), распределительная (применяется суперпозиция): A ∗ (B + C ) = A ∗ B + A ∗ C, линейная: A ∗ (αB) = α(A ∗ B) и инвариантна к сдвигу – пространственный эквивалент временной инвариантности при обработке одномерных сигналов, т. е. результат операции, одинаков везде на изображении. 204 Глава 4 · Изображения и их обработка >> about(K) K [double] : 31x31 (7688 bytes) Сглаживания можно легко добиться с по­мощью функции ismooth Toolbox: >> idisp( ismooth(mona, 5) ) Размытие – это нелогичная операция обработки, поскольку мы обычно прилагаем много усилий, чтобы получить чистое и четкое изображение. Намеренное ухудшение изображения кажется на первый взгляд несколько безрассудным. Однако, как вы увидите позже, сглаживание по Гауссу оказывается чрезвычайно полезным. Ядро само по себе является матрицей, поэтому мы можем отобразить его как изображение >> idisp( K ); Насколько широк должен быть гауссиан? При выборе гауссового ядра необходимо учитывать стандартное отклонение, обычно определяемое задачей, и размеры ядра � ∈ �w´w, содержащего дискретную функцию Гаусса. Время вычислений пропорционально w2, поэтому в идеале окно должно быть не больше, чем нужно. Гауссиан монотонно убывает во всех направлениях, но никогда не достигает нуля. Поэтому мы выбираем полуширину окна h так, чтобы значение гауссиана было меньше некоторого порога вне окна свертки w´w. 2 2 На краю окна, на расстоянии h от центра, значение гауссиана будет e–h /2σ . При −2 −4.5 σ = 1 и h = 2 гауссиан будет иметь ширину e » 0.14, при h = 3 будет e » 0.01, а при h = 4 будет e−8 » 3.4´10−4. Если h не указано, Toolbox выбирает h = 3σ. Для σ = 1 это окно размером 7´7, которое содержит все значения гауссиана, превышающие 1 % от пикового значения. Свойства гауссиана. Функция Гаусса G(·) обладает некоторыми особыми свойствами. Свертка двух гауссианов – это еще один гауссиан: G(σ1) ∗ G(σ2) = G( σ12 + σ22 ). Для случая, когда σ1 = σ2 = σ: G(σ) ∗ G(σ) = G( 2σ). Двухмерный гауссиан разделим – его можно записать как произведение двух одномерных гауссианов: Это означает, что свертка с двухмерным гауссианом может быть вычислена путем свертки с одномерным гауссианом с начала каждой строки, а затем каждого столбца. Общее количество операций сокращается до 2wN 2, т. е. лучше в w раз. Гауссиан также имеет одинаковую форму в пространственной и частотной областях. Пространственные операции 205 что показано на рис. 4.14а. Мы видим большое значение в цент­ ре ядра и то, что оно плавно спадает во всех направлениях. Мы также можем отобразить ядро как поверхность >> surf l(-15:15, -15:15, K); v (пиксели) как показано на рис. 4.14b. Грубым приближением к гауссиану является цилиндрическое ядро, которое представляет собой Рис. 4.14. Галерея цилиндр с вертикальными сторонами, а не плавное изменение часто используемых ядер свертки, h = 15, амплитуды. Функция kcircle создает ядро, которое можно расσ = 5 сматривать как цилиндр единичной высоты заданного радиуса a Гауссиан как интенсивность u (пиксели) b Гауссиан с Цилиндр (r = 8) d Производная гауссиана (DoG) e Лапласиан гауссиана (LoG) f Разность гауссианов (DiffG) 206 Глава 4 · Изображения и их обработка >> K = kcircle(8, 15); как показано на рис. 4.14c. Аргументы задают радиус 8 пикселей в пределах окна половинной ширины h = 15. 4.5.1.2 Граничные эффекты Затруднения со всеми пространственными операциями возникают, когда окно находится близко к краю входного изображения, как показано на рис. 4.15. В этом случае выходной пиксель является функцией окна, которое охватывает пиксели за пределами входного изображения – эти пиксели не имеют определенного значения. Есть несколько распространенных способов решения этой проблемы. Во-первых, мы можем предположить, что пиксели за пределами изображения имеют определенное значение. Обычный выбор – ноль, и это поведение по умолчанию реализовано функцией Toolbox iconvolve. Мы можем видеть эффект этого на рис. 4.13, где границы сглаженного изображения темные из-за влияния этих нулей. Другой вариант – считать, что результат недействителен, когда окно пересекает границу изображения. Недопустимые выходные пиксели показаны штриховкой на рис. 4.15. В результате получается выходное изображение размером (W – 2h)´(H – 2h), которое немного меньше входного изображения. Это поведение можно задать, передав параметр 'valid' в iconvolve. входное изображение 4.5.1.3 выходное изображение Нахождение края Часто нас интересует нахождение краев объектов в сцене. Возьмем изображение >> castle = iread('castle.png', 'double', 'grey'); показанное на рис. 4.16а. Весьма полезно было бы рассмотреть значения пикселей вдоль одномерного профиля, проходящего Рис. 4.15. В случае, когда окно � выходит за край входного изображения, выходной пиксель в точке (u, v) не определен. Заштрихованные пиксели в выходном изображении – это все те пиксели, для которых выходное значение функции не определено Пространственные операции 207 через все изображение. Горизонтальный профиль изображения при v = 360 >> castle = iread('castle.png', 'double', 'grey'); является вектором, который мы можем построить >> plot(p); относительно горизонтальной координаты u на рис. 4.16b. Отчетливые высокие шипы соответствуют белым буквам и другим Рис. 4.16. Профиль обозначениям на знаке. При более внимательном рассмотреинтенсивности на нии одного из пиков на рис. 4.16c мы видим профиль интенсивкраях: a) исходное изображение; ности поперек вертикального стержня буквы Т. Интенсивность b) профиль уровня фона ≈ 0.3, а интенсивность яркого света ≈ 0.9, но эти значения серого вдоль сильно зависят от уровня освещения. Очень быстрое увеличегоризонтальной линии v = 360; ние интенсивности на протяжении всего лишь нескольких пикc) крупный селей является отличительным и более надежным признаком план всплеска края, чем любое решение, основанное на фактических уровнях при u ≈ 580; d) производная от c серого. (изображение из Производная первого порядка вдоль этого сечения равна: Значение пикселя p¢[v] = p[v] – p[v – 1]. v (пиксели) набора данных ICDAR 2005 OCR; Lucas, 2005) c b u (пиксели) Производная значения пикселя u (пиксели) Значение пикселя a u (пиксели) d u (пиксели) 208 Глава 4 · Изображения и их обработка Ее можно вычислить с по­мощью функции MATLAB diff >> plot(diff(p)) и построить график, как показано на рис. 4.16d. Сигнал в целом нулевой с четкими ненулевыми откликами на краях объекта, в данном случае на краях стержня буквы Т. Производную в точке v также можно записать как симмет­ ричную разность первого порядка: p¢[v] = ½(p[v + 1] – p[v – 1]), что эквивалентно свертке с одномерным ядром: K = (½ 0 –½). Свертывание изображения с этим ядром >> K = [0.5 0 -0.5]; >> idisp( iconvolve(castle, K), 'invsigned') c b u (пиксели) v (пиксели) u (пиксели) v (пиксели) a v (пиксели) v (пиксели) дает результат, очень похожий на показанный на рис. 4.17а, на котором отчетливо видны вертикальные края – высокие горизонтальные градиенты. u (пиксели) d u (пиксели) Рис. 4.17. Краевой градиент: a) градиент в направлении u; b) градиент в направлении v; c) величина градиента; d) направление градиента. Синим цветом показаны положительные градиенты, красным – отрицательные и белым – нулевые Пространственные операции 209 Поскольку это ядро имеет значения со знаком, результат свертки также будет со знаком, т. е. градиент в пикселе может быть положительным или отрицательным, как показано на рис. 4.17a,b. Функция idisp всегда отображает минимальное, самое отрицательное, значение черным цветом, а максимальное, самое положительное, – белым. Таким образом, ноль будет отображаться как средне-серый. Параметр 'signed' заставляет idisp использовать красное и синее закрашивание для четкого обозначения знака: ноль – черный, отрицательные пиксели – красные, положительные пиксели – синие, а интенсивность цвета пропорциональна значению пикселя. Опция 'invsigned' аналогична, за исключением того, что ноль обозначается белым цветом. Это ядро обычно Для вычисления горизонтального градиента было предлозаписывается жено множество ядер свертки. Популярным выбором является с обратным знаком, что правильно для ядро Собеля корреляции. Для свертки ядро >> Du = ksobel должно быть на- Du = писано так, как 0.1250 0 -0.1250 показано здесь. 0.2500 0 -0.2500 0.1250 0 -0.1250 и мы видим, что каждая строка является масштабированной версией одномерного ядра K, определенного выше. Общий результат представляет собой взвешенную сумму горизонтального градиента для текущей строки и строк выше и ниже. Свертывание нашего изображения с этим ядром >> idisp( iconvolve(castle, Du), 'invsigned') генерирует горизонтальное градиентное изображение, показанное на рис. 4.17а, которое выделяет вертикальные края. Вертикальный градиент вычисляется с использованием транспонирования ядра >> idisp( iconvolve(castle, Du'), 'invsigned') Фильтры могут и выделяет горизонтальные ребра , как показано на рис. 4.17b. реагировать на края Обозначения, используемые для градиентов, значительно разпод любым произвольным углом. личаются в литературе. Чаще всего горизонтальный и вертиСамо ядро Собеля кальный градиент обозначают соответственно как ∂I/∂u, ∂I/∂v; можно рассматри- Ñ I, Ñ I или I , I . В операторной форме это записывается так: u v u v вать как изображение и вращать с по­ Iu = D ∗ I; мощью irotate. Для получения угловой Iv = DT ∗ I, точности обычно требуется большее ядро, например где D – производное ядро, такое как ядро Собеля. сгенерированное Взятие производной сигнала усиливает высокочастотный функцией kdgauss. шум, а все изображения имеют шум, как было сказано ранее. 210 Глава 4 · Изображения и их обработка На уровне пикселей шум представляет собой стационарный случайный процесс – значения не коррелируют между пикселями. Однако интересующие нас признаки, такие как края, имеют коррелированные изменения значения пикселя в большем пространственном масштабе, как показано на рис. 4.16c. Мы можем уменьшить влияние шума, сгладив изображение, прежде чем брать производную Iu = D ∗ (G(σ) ∗ I). Вместо свертки изображения с по­мощью гауссовой кривой, а затем производной мы используем ассоциативное свойство свертки, чтобы записать: Iu = D ∗ (G(σ) ∗ I) = (D ∗ (G(σ)) ∗ I). DoG Мы выполняем свертку изображения через производную гауссиана (derivative of the Gaussian, DoG), которую можно получить численно с по­мощью функции Gu = iconvolve( Du, kgauss(sigma) , 'full'); или аналитически, взяв производную в направлении u от уравнения Гаусса (4.3) и получив уравнение (4.4) Карл Фридрих Гаусс (1777–1855) был немецким математиком, внесшим крупный вклад в такие области, как теория чисел, дифференциальная геометрия, магнетизм, астрономия и оптика. Он был вундеркиндом, родился в Брауншвейге, Германия, и был единственным сыном необразованных родителей. В возрасте трех лет он исправил в уме финансовую ошибку, допущенную его отцом, а в подростковом возрасте сделал свои первые математические открытия. Гаусс был перфекционистом и трудолюбивым, но не плодовитым писателем. Он отказывался публиковать что-либо, что не считал полным и не выдерживающим критики. Существует мнение, что математика могла бы продвинуться вперед на 50 лет, если бы он вовремя опубликовал все свои открытия. Согласно легенде Гаусса прервали посреди работы и сказали, что его жена умирает, на что он ответил: «Скажите ей подождать, пока я закончу». Любопытно, но нормальное распределение, или функция Гаусса, не является одним из его достижений. Впервые нормальное распределение было открыто де Муавром в 1733 г., а затем Лапласом в 1778 г. В честь Гаусса названа единица СИ для плотности магнитного потока. Пространственные операции 211 которое вычисляется функцией kdgauss Toolbox и показано на рис. 4.14d. Стандартное отклонение σ управляет масштабом обнаруженных краев. При большом σ, что предполагает повышенное сглаживание, края из-за тонкой текстуры будут ослаблены, останутся только края крупных элементов. Эта способность находить ребра в разных пространственных масштабах важна и лежит в основе концепции масштабного пространства, которую мы обсудим в разделе 5.3.2. Другая интерпретация этого оператора – пространственный полосовой фильтр (bandpass filter), поскольку он представляет собой каскад фильтра низких частот (сглаживающий) с фильтром высоких частот (дифференцирующий). Вычисление горизонтальной и вертикальной составляющих градиента в каждом пикселе >> Iu = iconvolve( castle, kdgauss(2) ); >> Iv = iconvolve( castle, kdgauss(2)' ); позволяет нам вычислить величину градиента в каждом пикселе >> m = sqrt( Iu.^2 + Iv.^2 ); Это изображение с усиленными краями на рис. 4.17c показывает края очень отчетливо. Направление градиента в каждом пикселе равно >> th = atan2( Iv, Iu); и лучше всего видно на разреженном динамическом графике >> quiver(1:20:numcols(th), 1:20:numrows(th), ... Iu(1:20:end,1:20:end), Iv(1:20:end,1:20:end)) как показано на рис. 4.17d. График краевых направлений намного более зашумлен, чем график амплитуды. Там, где градиент края сильный, на границе знака или краях букв, направление перпендикулярно краю, но мелкомасштабная текстура наподобие кирпичной кладки выглядит как почти случайное направление края. Градиентные изображения можно легко вычислить с по­мощью функции Toolbox: >> [du,dv] = isobel( castle, kdgauss(2) ); где последний аргумент переопределяет ядро Собеля по умолчанию. Хорошо известным и очень эффективным детектором краев является оператор края Кэнни. Он использует величину и направление края, которые мы только что вычислили, и выполняет два дополнительных шага. Во-первых, это подавление не- 212 Глава 4 · Изображения и их обработка Пьер-Симон Лаплас (1749–1827) был французским математиком и астрономом, который объединил теории математической астрономии в своем пятитомном Mécanique Céleste («Небесная механика»). Когда он был подростком, его математические способности впечатлили Даламбера, который помог ему получить профессорскую должность. На вопрос Наполеона, почему он не упомянул Бога в своей книге по астрономии, он якобы сказал: «Je n’avais pas besoin de cette hypothèse-là» («Мне не нужна эта гипотеза»). Он стал графом Империи в 1806 г., а впоследствии маркизом. Его именем названы оператор Лапласа (дифференциальный оператор второго порядка) и преобразование Лапласа. Величина края локальных максимумов. Рассмотрим изображение величины градиента на рис. 4.17c как трехмерную поверхность, высота которой пропорциональна яркости, как показано на рис. 4.18. Мы видим серию холмов и гребней, и нам нужно найти пиксели, лежащие вдоль линий гребней. Исследуя значения пикселей в локальной окрестности, перпендикулярной направлению края, т. е. в направлении градиента края, можно найти максимальное значение и установить все остальные пиксели равными нулю. Результатом является набор ненулевых пикселей, соответствующих пикам и линиям хребта. Второй шаг – пороговое значение гистерезиса. Для каждого ненулевого пикселя, превышающего верхний порог, создается цепочка из соседних пикселей, превышающих нижний порог. Любые другие пиксели устанавливаются равными нулю. Рис. 4.18. Крупный план величины градиента вокруг буквы T, показанного в виде трехмерной поверхности Применить оператор Кэнни к нашему примерному изображению очень просто: >> edges = icanny(castle, 2); Пространственные операции 213 Он возвращает изображение, края которого отмечены ненулевыми значениями интенсивности, соответствующими величине градиента в этом пикселе, как показано на рис. 4.19a. Мы видим, что края намного тоньше, чем для величины производной оператора Гаусса, показанной на рис. 4.19b. В этом примере σ = 2 для производной операции Гаусса. При помощи дополнительных аргументов можно настроить параметры порога гистерезиса. v (пиксели) v (пиксели) Рис. 4.19. Сравнение двух пограничных операторов: a) оператор Кэнни с параметрами по умолчанию; b) величина производной ядра Гаусса (σ = 2). Оператор |DoG| требует меньше вычислений, чем оператор Кэнни, но генерирует более толстые a u (пиксели) b u (пиксели) края. Для обоих случаев результаты До сих пор мы рассматривали ребро как точку с высоким грапоказаны инвертированными, диентом, а подавление нелокальных максимумов использовабелый цвет равен нулю лось для поиска максимального значения в локальных окрест- ностях. Альтернативный способ найти точку максимального градиента – вычислить вторую производную и определить, где она равна нулю. Оператор Лапласа (4.5) Разность гауссианов. Лапласиан гауссиана может быть аппроксимирован разностью двух гауссовых функций: где σ1 > σ2 и обычно σ1 = 1.6σ2. Разность вычисляется функцией kdog Toolbox. На рис. 4.13e и f показаны соответственно ядра LoG и DiffG. Это приближение полезно при работе с последовательностями масштабного пространства, которые будут обсуждаться в разделе 5.3.2. Рассмотрим последовательность изображений I〈k〉, где I〈k+1〉 = G(σ) ⊗ I〈k〉, т. е. изображения сглажены по нарастающей. В таком случае разница между любыми двумя изображениями в последовательности эквивалентна значению функции DiffG( 2σ, σ), применяемой к исходному изображению. 214 Глава 4 · Изображения и их обработка представляет собой сумму второй пространственной производной в горизонтальном и вертикальном направлениях. Для дискретного изображения ее можно вычислить путем свертки с ядром Лапласа >> L = klaplace() L = 0 1 0 1 -4 1 0 1 0 которая является изотропной – она одинаково реагирует на края в любом направлении. Вторая производная даже более чувствительна к шуму, чем первая производная, и поэтому тоже часто используется в сочетании со сглаживанием изображения по Гауссу Ñ2I = L ∗ (G(σ) ∗ I) = (L ∗ (G(σ)) ∗ I), (4.6) LoG которое мы объединяем в лапласиан ядра Гаусса (LoG), где L – это ядро Лапласа, рассмотренное выше. Аналитически это можно записать так: (4.7) (4.8) Это так называемый оператор Марра–Хилдрета, или ядро «мексиканской шляпы», показанное на рис. 4.14e. Применим это ядро к нашему изображению с по­мощью функции: >> lap = iconvolve( castle, klog(2) ); Результат показан на рис. 4.20a и b. Максимальный градиент возникает, когда вторая производная равна нулю, но значимый край представляет собой переход через ноль от сильного положительного значения (синий) к сильному отрицательному значению (красный). Рассмотрим увеличенный вид лапласиана буквы T, показанный на рис. 4.20b. Сгенерируем горизонтальное сечение стержня буквы Т при v = 360 >> p = lap(360,570:600); >> plot(570:600, p, '-o'); которое показано на рис. 4.20c. Мы видим, что нулевые зна- Пространственные операции 215 чения второй производной лежат между пикселями. Детектор пересечения нуля выбирает пиксели, соседние с точками перехода через ноль >> zc = zcross(lap); u (пиксели) c b u (пиксели) v (пиксели) |Лапласиан| при v = 360 a v (пиксели) v (пиксели) Рис. 4.20. как показано на рис. 4.20d. Мы видим, что ребра появляются a) Лапласиан гауссиана; дважды. Снова обращаясь к рис. 4.20c, мы наблюдаем слабое пеb) крупный план ресечение нуля в интервале u ∈ [573, 574] и гораздо более четкое части (a) вокруг пересечение нуля в интервале u ∈ [578, 579]. буквы T, где синий и красный цвета обозначают положительные Фундаментальное ограничение всех подходов к обнаружению краев и отрицательные заключается в том, что края интенсивности не обязательно очерчивают значения границы объектов. Объект может иметь плохой контраст с фоном, что соответственно; приводит к слабым граничным краям. И наоборот, на объекте может c) горизонтальное поперечное быть полоса, которая не является его краем. Тени часто имеют очень сечение LoG острые края, но не являются реальными объектами. Текстура объекта через стержень T; часто дает сильный выходной сигнал детектора краев не только в точd) крупный план ках на его границе, как, например, в случае с кирпичами на рис. 4.16b. выхода детектора перехода через ноль в букве Т u (пиксели) d u (пиксели) 216 Глава 4 · Изображения и их обработка 4.5.2 Сравнение с шаблоном В нашем обсуждении до сих пор мы использовали ядра, которые представляют математические функции, такие как гауссиан и его производная и ее лапласиан. Мы также рассмотрели ядро свертки как матрицу, как изображение и как трехмерную поверхность (рис. 4.14). В этом разделе мы будем считать, что ядро – это изображение или часть изображения, которые мы называем шаблоном. При сравнении с шаблоном мы стремимся найти части входного изображения, больше всего похожие на шаблон. Схема сравнения с шаблоном показана на рис. 4.21. Каждый пиксель в выходном изображении определяется как O[u, v] = s(T, �), ∀(u, v) ∈ I, где T – шаблон w´w, образец пикселей, который мы ищем, с нечетной длиной стороны w = 2h + 1, а � – окно w´w с центром в (u, v) на входном изображении. Функция s(I1, I2) является скалярной мерой, описывающей сходство двух одинаковых по размеру изображений I1 и I2. Перечень распространенных мер сходства приведен К этим показателям можно добавить в табл. 4.1. Наиболее очевидные меры вычисляются просто взвешивание по путем вычисления попиксельной разницы T – � и получения Гауссу, чтобы уменьсуммы абсолютных разностей (sum of the absolute differences, шить различия, возникающие на краях SAD) или суммы квадратов разностей (sum of the squared differ- двух окон. ences, SSD). Эти метрики равны нулю, если изображения идентичны, и увеличиваются при непохожести. Сложно сказать, какое значение меры лучше всего отражает плохое совпадение, но для определения наилучшего совпадения можно использовать ранжирование мер подобия. входное изображение выходное изображение Рис. 4.21. Операции пространственной обработки изображений. Закрашенная красным область показывает окно �, представляющее собой набор пикселей, используемых для вычисления выходного пикселя (показан красным) Пространственные операции 217 Дэвид Марр (1945–1980) был британским нейробиологом и психологом, который объединил достижения психологии, искусственного интеллекта и нейрофизиологии в новую дисциплину вычислительной нейронауки. Он изучал математику в Тринити-колледже в Кембридже и защитил докторскую диссертацию по физиологии, посвященную моделированию функции мозжечка. Его достижения были опубликованы в трех журнальных статьях в период с 1969 по 1971 гг. и легли в основу теории функционирования мозга млекопитающих, большая часть которой остается актуальной и сегодня. В 1973 г. он был приглашенным научным сотрудником в Лаборатории искусственного интеллекта Массачусетского технологического института, а позже стал профессором кафедры психологии. Его внимание переключилось на изучение зрения и, в частности, так называемой ранней зрительной системы. Он умер от лейкемии в возрасте 35 лет, и вскоре после его смерти была опубликована книга Vision: A computational investigation into the human representation and processing of visual information (Marr, 2010). Таблица 4.1. Меры подобия для двух областей изображения одинакового размера I1 и I2. Префикс Z указывает на то, что мера учитывает смещение нуля или разницу в среднем значении двух изображений (Banks and Corke 2001). I–1 и I–2 являются средними значениями областей изображения I1 и I2 соответственно. Функции Toolbox указаны в последнем столбце Сумма абсолютных разностей SAD s = (u,v)∈I1|I1[u, v] – I2[u, v]| ZSAD s = sad (u, v)∈I1|(I1[u, v] – I1) – (I2[u, v] – I2)| – – Сумма квадратов разностей SSD s = (u,v)∈I1(I1[u, v] – I2[u, v])2 ZSSD s = zsad ssd 2 (u, v)∈I1((I1[u, v] – I1) – (I2[u, v] – I2)) – – zssd Перекрестная корреляция NCC (u, v)∈I1 I1[u, v] I2[u, v] s= 2 2 (u, v)∈I1 I1 [u, v] (u, v)∈I1 I2 [u, v] ZNCC s= ncc (I [u, v] – I1) (I2[u, v] – I2) zncc (u, v)∈I1 1 – 2 (I [u, v] – I1) (u, v)∈I1 1 – 2 (I [u, v] – I2) (u, v)∈I1 2 Более сложные меры, такие как нормализованная взаимная корреляция, дают оценку в интервале [–1, +1], где +1 соответствует идентичным областям. На практике хорошим совпадением считается значение больше 0.8. Нормализованная взаимная корреляция требует больших вычислительных ресурсов, поскольку использует операции умножения, деления и извлечения квадратного корня. Нужно отметить, что результат может быть неопределенным, если знаменатель равен нулю, что происходит, если элементы I1 или I2 идентичны. Если I2 ≡ I1, то легко показать, что SAD = SSD = 0 и NCC = 1, что указывает на идеальное совпадение. Для иллюстрации мы будем использовать глаз Моны Лизы в качестве шаблона 51´51: 218 Глава 4 · Изображения и их обработка >> mona = iread('monalisa.png', 'double', 'grey'); >> T = mona(170:220, 245:295); и вычислим три общие меры: >> sad(T, T) ans = 0 >> ssd(T, T) ans = 0 >> ncc(T, T) ans = 1 Теперь рассмотрим случай, когда два изображения относятся к одной и той же сцене, но одно изображение темнее другого – изменилось освещение или экспозиция камеры. В этом случае I2 = αI1 и теперь >> sad(T, T*0.9) ans = 111.1376 >> ssd(T, T*0.9) ans = 5.6492 эти меры указывают на степень несходства. Однако нормированная взаимная корреляция >> ncc(T, T*0.9) ans = 1 инвариантна к изменению интенсивности. Далее допустим, что значения пикселей имеют смещение , Это может быть связано с непратак что I2 = I1 + β, и мы находим, что >> sad(T, T+0.1) ans = 260.1000 >> ssd(T, T+0.1) ans = 26.0100 >> ncc(T, T+0.1) ans = 0.9974 все меры теперь указывают на степень несходства. Проблемное смещение можно устранить, сначала вычитая из T и � их среднее значение: >> zsad(T, T+0.1) ans = вильной настройкой уровня черного. Уровень черного камеры – это значение пикселя, соответствующее отсутствию света, и часто оно больше ноля. Пространственные операции 219 3.5670e-12 >> zssd(T, T+0.1) ans = 4.8935e-27 >> zncc(T, T+0.1) ans = 1.0000 и теперь все эти меры указывают на идеальное совпадение. Префикс z обозначает разновидности мер подобия, описанных выше, которые инвариантны к смещению интенсивности. Только мера ZNCC >> zncc(T, T*0.9+0.1) ans = 1.0000 инвариантна как к изменению усиления, так и к изменению смещения. Все эти методы потерпят неудачу, если изображения имеют даже небольшое изменение угла поворота или масштаба. Рассмотрим задачу из известной детской книги «Где Уолли?» или «Где Вальдо?» – было бы интересно попытаться найти лицо Уолли в толпе: >> crowd = iread('wheres-wally.png', 'double'); >> idisp(crowd) К счастью, мы приблизительно знаем, как он выглядит, а шаб­лон >> wally = iread('wally.png', 'double'); >> idisp(wally) был извлечен из другого изображения и масштабирован так, чтобы голова была примерно такой же ширины, как и другие головы в сцене толпы (около 21 пикселя в ширину). Сходство нашего шаблона wally с каждым возможным расположением окна вычисляется по формуле >> S = isimilarity(wally, crowd, @zncc); с использованием меры сходства ZNCC. Результат >> idisp(S, 'colormap', 'jet', 'bar') показан на рис. 4.22, где цвет пикселя указывает на сходство ZNCC в соответствии со шкалой справа. Мы можем видеть несколько точек высокого сходства (белые), которые являются кандидатами на позиции Уолли. Пиковые значения по отношению к локальному окну 3´3 равны: >> [mx,p] = peak2(S, 1, 'npeaks', 5); >> mx 220 Глава 4 · Изображения и их обработка mx = 0.5258 0.5230 0.5222 0.5032 0.5023 в порядке убывания. Второй аргумент задает полуширину окна h = 1, а третий – количество возвращаемых пиков. Наибольшее значение 0.5258 – это сходство наиболее сильного найденного совпадения. Эти совпадения происходят в координатах (u, v), заданных вторым возвращаемым значением p, и мы можем выделить эти точки на сцене >> idisp(crowd); >> plot_circle(p, 30, 'edgecolor', 'g') >> plot_point(p, 'sequence', 'bold', 'textsize', 24, 'textcolor', 'y') Сходство v (пиксели) используя последовательно пронумерованные зеленые круги. Лучшее совпадение (261, 377) на самом деле является правильным ответом – мы нашли Уолли! Интересно взглянуть на других предпочтительных кандидатов. Номера два и три в нижней части изображения – это люди в бейсболках, которые очень похожи друг на друга. u (пиксели) Рис. 4.22. Изображение сходства S с отмеченными пятью лучшими кандидатами на совпадение с Уолли. Полоса справа представляет собой шкалу подобия. Обратите внимание на границу неопределенных значений, где окно шаблона выходит за край входного изображения На основании этого примера можно отметить несколько важных моментов. Изображения имеют довольно низкое разрешение, а шаблон всего 21´25 – очень грубое подобие Уолли. Совпадение несильное – всего 0.5258 по сравнению с максимально возможным значением 1.0, и есть несколько сопутствующих факторов. Показатель сходства не является инвариантным по отношению к масштабу, т. е. при изменении относительного масштаба (увеличения) показатель сходства довольно быстро падает. На практике допустимо расхождение масштаба между T и � на 10–20 %. Для этого примера шаблон был масштабирован лишь приблизительно. Во-вторых, не все Уолли оди- Пространственные операции 221 наковы. Уолли в шаблоне смотрит вперед, но Уолли, которого мы нашли на изображении, смотрит влево. Другая проблема заключается в том, что квадратный шаблон обычно включает в себя не только интересующий объект, но и пиксели фона. По мере перемещения объекта фоновые пиксели могут меняться, что приводит к снижению оценки сходства. Это известная проблема смешанных пикселей, которая обсуждается в следующем разделе. В идеале шаблон должен как можно точнее описывать интересующий объект. На практике возникает еще одна проб­ лема из-за искажения перспективы. Квадратный участок пикселей в центре изображения будет казаться трапецеидальным на краю изображения и, таким образом, будет хуже совпадать с квадратным шаблоном. Распространенная проблема с сопоставлением шаблонов заключается в том, что могут возникать ложные совпадения. В приведенном выше примере второй кандидат имел показатель сходства всего на 0.5 % ниже, чем первый, пятый кандидат был только на 5 % ниже. На практике, прежде чем принять сходство за совпадение, применяется ряд правил: сходство должно превышать некоторый порог, а первый кандидат должен превосходить второго на некоторый коэффициент, чтобы гарантировать отсутствие двусмысленности. Другой подход заключается в том, чтобы предоставить больше информации для решения задачи, такой как известное движение камеры или объекта. Например, если бы мы отслеживали Уолли от кадра к кадру в последовательности изображений, мы бы выбрали Уолли-кандидата, наиболее близкого к предыдущему месту, где он был найден. В качестве альтернативы мы могли бы создать модель движения, обычно модель с постоянной скоростью, которая предполагает, что он перемещается примерно на одно и то же расстояние и в одном направлении от кадра к кадру. Таким образом, мы могли бы предсказать его будущее положение и выбрать Уолли, наиболее близкого к этому предсказанному положению, или искать только вблизи предсказанного положения, чтобы уменьшить количество вычислений. Нам также пришлось бы иметь дело с практическими трудностями, такими как остановка Уолли, изменение направления или временное затенение. 4.5.2.1 Непараметрические локальные преобразования Непараметрические меры подобия более устойчивы к проблеме смешанных пикселей, и перед сравнением мы можем применить локальное преобразование к изображению и шаблону. Двумя распространенными представителями этого класса являются последовательное (census transform) и ранговое (rank transform) преобразования. 222 Глава 4 · Изображения и их обработка Последовательное преобразование отображает значения пикселей из локальной области в целое число, рассматриваемое как битовая строка – каждый бит соответствует одному пикселю в области, как показано на рис. 4.23. Если пиксель больше центрального пикселя, его соответствующий бит устанавливается в единицу, в противном случае он равен нулю. В случае окна w´w строка будет иметь длину w 2 − 1 бит . Две строки Для 32-битного битов сравниваются с использованием расстояния Хэмминга, целого числа uint32 это ограничивает которое представляет собой количество различающихся би- окно до размера тов. Его можно вычислить, просто подсчитав количество уста- 5×5, если только не новленных битов после операции исключающего ИЛИ между используется разреженное отображедвумя битовыми строками. Благодаря этому требуется очень ние (Humenberger et мало арифметических операций по сравнению с более тради- al. 2009). 64-битное ционными методами – без квадратных корней или деления, – целое число uint64 допускает окно рази такие алгоритмы поддаются реализации в оборудовании мером 7×7. специального назначения или ПЛИС. Другое преимущество заключается в том, что интенсивность считается относительно центрального пикселя окна, что делает метод инвариантным к общим изменениям интенсивности или постепенным градиентам интенсивности. Рис. 4.23. Пример последовательного и рангового преобразования для окна 3×3. Пиксели помечаются красным или синим цветом, если они меньше или больше или равны центральному пикселю соответственно. Эти логические значения затем упаковываются в двоичное слово в указанном направлении, от младшего бита к старшему. Значение последовательного преобразования – 101011012 или десятичное число 173. Значение рангового преобразования – это сумма всех битов, которая в данном случае равна 5 Ранговое преобразование сопоставляет значения пикселей в локальной области со скаляром, который представляет собой количество элементов в области, превышающих значение центрального пикселя. Этот показатель характеризует сущность области, окружающей центральный пиксель, и, как и последовательное преобразование, инвариантен к общим изменениям интенсивности, поскольку основан на локальных относительных значениях шкалы серого. Эти преобразования обычно используются в качестве этапа предварительной обработки, применяемой к каждому из изображений перед использованием простой классической меры подобия, такой как SAD. Функция isimilarity Toolbox поддерживает эти показатели с по­мощью параметров 'census' и 'rank'. Пространственные операции 223 4.5.3 Нелинейные операции Другой класс пространственных операций основан на нелинейных пиксельных функциях внутри окна. Например, функция >> out = iwindow(mona, ones(7,7), 'var'); вычисляет дисперсию пикселей в каждом окне 7´7. Аргументы задают размер окна и встроенную функцию MATLAB var. Функция вызывается с векторным аргументом 49´1, содержащим пиксели в окне, расположенные в виде вектора-столбца, и возвращаемое значение функции становится соответствующим значением выходного пикселя. Эта операция действует как детектор границ, так как она имеет низкое значение для однородных областей независимо от их яркости. Однако это требует больших вычислительных ресурсов, поскольку функция var вызывается более 470 000 раз. По такому принципу можно использовать любую встроенную функцию MATLAB или ваш собственный М-файл, которые принимают на вход вектор и возвращают скаляр. Ранговые фильтры сортируют пиксели в окне по значению и возвращают указанный элемент из отсортированного списка. Максимальное значение в окне 5´5 для каждого пикселя – это пиксель с наивысшим рангом в окне >> mx = irank(mona, 1, 2); где аргументами являются ранг и полуширина окна h = 2. Медиана по окну 5´5 является 12-й по рангу >> med = irank(mona, 12, 2); и полезна в качестве фильтра для удаления шумов импульсного типа, а для изображения Моны Лизы это значительно уменьшает влияние мелких трещинок на поверхности картины. Более впечатляющая демонстрация заключается в добавлении значительного импульсного шума к копии изображения Лены: >> lena = iread('lena.pgm', 'double'); spotty = lena; >> npix = prod(size(lena)); >> spotty(round(rand(5000,1)*(npix-1)+1)) = 0; >> spotty(round(rand(5000,1)*(npix-1)+1)) = 1.0; >> idisp(spotty) как показано на рис. 4.24а. Мы установили 5000 случайных пикселей равными нулю, а еще 5000 случайных пикселей – равными максимальному значению. Этот тип шума часто называют импульсным шумом, или шумом «соли и перца». А теперь применяем медианный фильтр 3´3 >> idisp( irank(spotty, 5, 1) ) 224 Глава 4 · Изображения и их обработка v (пиксели) и видим, что изображение, показанное на рис. 4.24b, значительно улучшилось. Похожий эффект можно было бы получить с по­мощью сглаживания, но это привело бы к размытию изображения; преимущество медианной фильтрации заключается в сохранении краев сцены. a u (пиксели) b u (пиксели) Третьим аргументом функции irank вместо скаляра может быть матрица, и это позволяет выполнять некоторые очень мощные операции. Например, >> M = ones(3,3); >> M(2,2) = 0 M = 1 1 1 1 0 1 1 1 1 >> mxn = irank(lena, 1, M); задает первое по рангу (максимальное) подмножество пикселей из окна, соответствующего ненулевым элементам M. В данном случае M задает восемь соседних пикселей, но не центральный пиксель. Результатом mxn является максимальное значение среди восьми соседей каждого соответствующего пикселя во входном изображении. Мы можем использовать функцию >> idisp(lena > mxn) для отображения всех тех точек, где значение пикселя больше, чем его локальные соседи, что выполняет подавление нелокальных максимумов. Эти точки соответствуют локальным максимумам или пикам, если изображение рассматривается как поверхность. Такая масочная матрица очень похожа на структурирующий элемент, с которым мы познакомимся в следующем разделе. Рис. 4.24. Медианный фильтр очищает изображение от импульсного шума. a) Изображение, искаженное шумом; b) результат применения медианного фильтра Математическая морфология 225 4.6 Математическая морфология Математическая морфология – это класс нелинейных пространственных операторов, схематично показанных на рис. 4.25. Каждый пиксель в выходной матрице является функцией подмножества пикселей в области, окружающей соответствующий пиксель входного изображения: O[u, v] = f(I[u + i, v + j]), ∀(i, j) ∈ �, ∀(u, v) ∈ I, (4.9) где � – структурирующий элемент, произвольное маленькое бинарное изображение. Он встроен в прямоугольное окно с нечетной длиной сторон. Структурирующий элемент подобен рассмот­ ренному ранее ядру свертки, за исключением того, что теперь он определяет, к каким пикселям в окрестности применяется функция f(·), – он задает подмножество пикселей в окне. Выбранные пиксели, для которых соответствующие значения структурирующего элемента отличны от нуля, показаны красным цветом на рис. 4.25. Математическая морфология, как следует из ее названия, занимается формой объектов на изображении. Рис. 4.25. Операции морфологической обработки изображений. Операция определена только для выбранных элементов (красный цвет) внутри структурирующего элемента (квадрат с красным контуром) входное изображение выходное изображение Проще всего объяснить концепцию структурирующего элемента на простом примере. В данном случае это синтетическое бинарное изображение, созданное скриптом, >> eg_morph1 >> idisp(im) которое показано повторно в левой части рис. 4.26. Структурирующий элемент показан красным цветом в конце каждой строки. Если мы рассмотрим самую верхнюю строку, структурирующий элемент представляет собой квадрат >> S = ones(5,5); 226 Глава 4 · Изображения и их обработка и применяется к исходному изображению с использованием операции минимума >> mn = imorph(im, S, 'min'); а результат показан во втором столбце рис. 4.26. Для каждого пикселя входного изображения берется минимум всех пикселей в окне 5´5. Если какой-либо из этих пикселей равен нулю, результирующий пиксель будет равен нулю. Мы можем увидеть анимированный процесс >> morphdemo(im, S, 'min') Результат впечатляет: два объекта полностью исчезли, а два квадрата разделились и стали меньше. Два исчезнувших объекта не соответствовали форме структурирующего элемента. Здесь возникает связь с морфологией или формой – в выходном изображении будут присутствовать только те формы, которые могут содержать структурирующий элемент. Структурирующий элемент может принимать любую форму: круг, кольцо, пятиконечную звезду, отрезок линии длиной 20 пикселей под углом 30° к горизонтали или силуэт уточки. Математическая морфология позволяет создавать очень мощные фильтры на основе форм. Во второй строке показаны результаты для большего структурирующего элемента 7´7, применение которого привело к полному устранению малого квадрата и дальнейшему уменьшению большого квадрата. В третьей строке показаны результаты применения структурирующего элемента, который представляет собой отрезок горизонтальной линии шириной 14 пикселей, и единственными оставшимися фигурами являются длинные горизонтальные линии. Операцию, которую мы только что выполнили, часто называют эрозией, поскольку большие объекты размываются и становятся меньше – в этом случае структурирующий элемент 5´5 заставил срезать два пикселя по всему периметру каждого Полуширина объекта. Маленький квадрат первоначально размером 5´5 те- структурирующего элемента. перь имеет размер только 1´1. Если бы мы повторили операцию, маленький квадрат полностью исчез бы, а большой уменьшился бы еще больше. Обратная операция – это дилатация (dilation, расширение), которая делает объекты больше. На рис. 4.26 мы применяем дилатацию к результатам второго столбца: >> mx = imorph(mn, S, 'max'); Результаты дилатации показаны в третьем столбце. Для каждого пикселя входного изображения берется максимум всех пикселей в окне 5´5. Если любой из этих соседей равен единице, результирующий пиксель будет тоже равен единице. В этом Математическая морфология 227 случае мы видим, что два квадрата вернулись к своим первоначальным размерам, но большой квадрат потерял свои выступающие линии. изображение после эрозии эрозия, затем дилатация Рис. 4.26. Пример математической морфологии. Пиксели равны либо 0 (серый), либо 1 (белый). Каждый столбец соответствует обработке с использованием структурирующего элемента, показанного в конце красным цветом. Первый столбец – исходное изображение, второй столбец – после эрозии структурирующим элементом, а третий – после дилатации второго столбца Морфологические операции часто записываются в операторной форме. Эрозия описывается выражением O = I ⊖ �, где в уравнении (4.9) функция f(·) = min(·), а растяжение O = I ⨁ �, где в уравнении (4.9) функция f(·) = max(·). Эти операции также известны как вычитание и сложение Минковского соответственно. Эрозия и дилатация связаны уравнением A ⨁ B = A ⊖ B¢, где черта обозначает логическое дополнение значений пикселей, а штрих обозначает отражение относительно центрального пикселя. По сути, это означает, что эрозия белых пикселей аналогична дилатации темных пикселей, и наоборот. Для морфологических операций справедливы равенства: (A ⨁ �1) ⨁ �2 = A ⨁ (�1 ⨁ �2); (A ⊖ �1) ⊖ �2 = A ⊖ (�1 ⨁ �2), из которых следует, что последовательность эрозий или дилатаций с по­мощью структурирующего элемента эквивалентна 228 Глава 4 · Изображения и их обработка применению одного более крупного структурирующего эле- Например, квад­ структуримента, но первое в вычислительном отношении дешевле . Со- ратный рующий элемент кращенные функции 3×3, примененный дважды, эквивалентен квадратному структурирующему элементу 5×5. можно использовать вместо низкоуровневой функции imorph. Первый использует 2×(3×3×N 2) = 18N 2 Последовательность операций эрозии, а затем дилатации операций, тогда как известна как открытие, поскольку она открывает промежутки. последний требует 5×5×N 2 = 25N 2 В операторной форме это записывается так: операций. >> out = ierode(im, S); >> out = idilate(im, S); I ∘ S = (I ⊖ S) ⨁ S. Открытие не только выделило определенные формы, но и очистило изображение: квадраты были разделены, а выступы на большом квадрате удалены, так как они не соответствуют форме структурирующего элемента. На рис. 4.27 мы выполняем операции в обратном порядке: дилатация, затем эрозия. В первом ряду элементы не утеряны, они сначала выросли, затем сжались, а у большого квадрата остались выступы. Отверстие было заполнено, так как оно не соответствует форме структурирующего элемента. Во втором ряду более крупный структурирующий элемент заставил два квадрата соединиться вместе. Эта последовательность операций называется закрытием, поскольку она закрывает промежутки и записывается в операторной форме как I • S = (I ⨁ S) ⊖ S. Обратите внимание, что в нижней строке два сегмента линии остались прикрепленными к краю, это связано с поведением по умолчанию при обработке пикселей края. изображение после дилатации дилатация, затем эрозия Рис. 4.27. Пример математической морфологии. Пиксели либо 0 (серый), либо 1 (белый). Каждая строка соответствует обработке с использованием элемента структурирования, показанного в конце красным цветом. Первый столбец – исходное изображение, второй столбец – после дилатации структурирующим элементом, а третий – после эрозии второго столбца структурирующим элементом Математическая морфология 229 Эти названия имеют Открытие и закрытие реализуются функциями Toolbox ioсмысл, если учесть, pen и iclose соответственно. В отличие от эрозии и дилатации что происходит повторное применение открывания или закрывания бесполезс белыми объектами на черном фоне. но, поскольку эти операции идемпотентны: Для черных объектов операции (I ∘ S) ∘ S = I ∘ S; выполняют обратную функцию. (I • S) • S = I • S. Эти операции также можно применять к изображениям в градациях серого, чтобы выделить объекты определенной формы в сцене перед такой операцией, как определение порога. Круговой структурирующий элемент радиуса R можно рассматривать как шар радиуса R, катящийся по поверхности интенсивности. Расширение, или операция максимума, представляет собой поверхность, определяемую центром шара, катящегося по верхней части поверхности интенсивности входного изображения. Эрозия, или операция минимума, представляет собой поверхность, определяемую центром шара, катящегося по нижней стороне поверхности интенсивности входного изображения. 4.6.1 Удаление шума Обычно морфологическое открытие используется для удаления шума на изображении. Получим изображение: >> objects = iread('segmentation.png'); На рис. 4.28а показано зашумленное бинарное изображение, Сегментация полученное в результате довольно плохой операции сегментаи бинаризация ции объектов . Нам нужно удалить темные пиксели, которые изображения обсуждаются не принадлежат объектам, и заполнить пропуски в четырех в разделе 5.1.1. темных прямоугольных объектах. Работа с краевыми пикселями. Проблема окна свертки рядом с краем входного изображения обсуждалась ранее. Аналогичные проблемы существуют для морфологических пространственных операций, и функции imorph, irank и iwindow Toolbox поддерживают опцию 'valid', как это делает iconvolve. Другие параметры заставляют возвращаемое изображение иметь тот же размер, что и входное изобра­ жение: 'replicate' (по умолчанию) реплицируется граничный пиксель, т. е. используется значение ближайшего граничного пикселя; 'none' пиксели за границей не включаются в набор пикселей, заданный структурирующим элементом; 'wrap' предполагает, что изображение обтекается слева направо и сверху вниз. 230 Глава 4 · Изображения и их обработка Выберем симметричный круговой структурирующий элемент радиуса 3 >> S = kcircle(3) S = 0 0 0 0 1 1 0 1 1 1 1 1 0 1 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 1 1 1 1 1 0 0 1 1 1 1 1 0 0 0 0 1 0 0 0 c b u (пиксели) v (пиксели) u (пиксели) v (пиксели) a v (пиксели) v (пиксели) Рис. 4.28. Морфологическая очистка. a) Исходное и применим операцию закрытия, чтобы заполнить отверстия изображение, b) оригинал в объектах после открытия, c) закрытие >> closed = iclose(objects, S); и открытие, d) открытие Результат показан на рис. 4.28b. Отверстия были заполне- и закрытие. Элемент ны, но шумовые пиксели превратились в маленькие кружочки, структурирования представляет собой а некоторые слиплись. Мы устраняем их с по­мощью операции круг радиуса 3. Цветовая карта открытия инвертирована, заданные пиксели >> clean = iopen(closed, S); показаны черным цветом u (пиксели) d u (пиксели) Математическая морфология 231 и результат, показанный на рис. 4.28c, представляет собой значительно очищенное изображение. Если мы применим операции в обратном порядке – сначала открытие, затем закрытие >> opened = iopen(objects, S); >> closed = iclose(opened, S); результаты, показанные на рис. 4.28d, будут намного хуже. Хотя при открытии были удалены изолированные шумовые пиксели, были также удалены большие фрагменты целевого изображения, которые невозможно восстановить. 4.6.2 Обнаружение границы Преобразование цилиндра (top-hat transform) использует морфологические операции для обнаружения краев объектов. Продолжая приведенный выше пример и применяя к изображению функцию clean, как показано на рис. 4.28c, мы вычисляем его эрозию с по­мощью кругового структурирующего элемента: >> eroded = imorph(clean, kcircle(1), 'min'); Объекты на этом изображении немного меньше, так как структурирующий элемент срезал один пиксель снаружи каждого объекта. Вычитание изображения после эрозии из оригинала >> idisp(clean-eroded) v (пиксели) дает нам слой пикселей вокруг края каждого объекта, как показано на рис. 4.29. Рис. 4.29. Обнаружение границы путем морфологической обработки. Результаты показаны инвертированными, белый цвет равен нулю u (пиксели) 232 Глава 4 · Изображения и их обработка 4.6.3 Преобразование «попадание или промах» Преобразование «попадание или промах» (hit or miss) использует разновидность морфологического структурирующего элемента. Его значения равны нулю, единице или не определены, как показано на рис. 4.30а. Нулевой и единичный пиксели должны точно совпадать с базовыми пикселями изображения, чтобы результатом была единица, как показано на рис. 4.30b. Если есть какое-либо несоответствие единицы или нуля, как показано на рис. 4.30c, то результат будет нулевым. Реализация Toolbox очень похожа на морфологическую функцию, например out = hitormiss(image, S); где неопределенным значениям структурирующего элемента присваивается специальное значение MATLAB NaN. а b c Преобразование «попадание или промах» можно использовать итеративно с последовательностью структурирующих элементов для выполнения сложных операций, таких как скелетирование и обнаружение линейных признаков. Скелет объектов вычисляется при помощи функции >> skeleton = ithin(clean); Результат показан на рис. 4.31а. Линии имеют ширину в один пиксель и являются краями обобщенной диаграммы Вороного – они очерчивают наборы пикселей в соответствии с границей формы, к которой они ближе всего. Затем мы можем найти конечные точки скелета >> ends = iendpoint(skeleton); а также тройные точки >> joins = itriplepoint(skeleton); т. е. точки, в которых соединяются три линии. Они показаны на рис. 4.31b и c соответственно. Рис. 4.30. Преобразование «попадание или промах»: a) структурирующий элемент имеет значения ноль (красный), единица (синий) или неопределенное (заштриховано); b) пример попадания; c) пример промаха – пиксель, обведенный кружком, не соответствует структурирующему элементу a b v (пиксели) u (пиксели) v (пиксели) Рис. 4.31. Операции преобразования «попадание или промах»: a) скелетирование; b) обнаружение конечной точки; c) обнаружение тройного соединения. Изображения показаны инвертированными, с исходным бинарным изображением, наложенным серым цветом. Конечные и тройные точки показаны черными пикселями v (пиксели) Математическая морфология 233 u (пиксели) 4.6.4 c u (пиксели) Преобразование расстояния [examples/chamfer_match.m] Обсуждаемое здесь преобразование расстояния работает с бинарным изображением, а выходное значение, соответствующее каждому нулевому пикселю входного изображения, представляет собой евклидово расстояние до ближайшего ненулевого пикселя. Рассмотрим задачу подбора модели по форме изображения. Создадим контур повернутого квадрата >> im = testpattern('squares', 256, 256, 128); >> im = irotate(im, -0.3); >> edges = icanny(im) > 0; который показан на рис. 4.32a, а затем вычислим преобразование расстояния >> dx = distancexform(edges, 'euclidean'); как показано на рис. 4.32b. Начальная оценка квадрата показана красной линией. Выходное значение преобразования расстояния в любой точке Евклидово расстояние (пиксели) 234 Глава 4 · Изображения и их обработка b Евклидово расстояние (пиксели) a v (пиксели) c u (пиксели) Рис. 4.32. Преобразование расстояния: a) входное бинарное изображение; b) преобразованное входное изображение с наложенным квадратом модели; c) преобразование расстояния как поверхность этого красного квадрата указывает, насколько далеко оно находится от ближайшей точки исходного квадрата. Если мы просуммируем преобразование расстояния для каждой точки на красном квадрате или хотя бы только для вершин, мы полу- Знаковая функция расстояния В преобразовании расстояния бинарного изображения значение в каждом пикселе равно расстоянию от этого пикселя до ближайшего ненулевого пикселя во входном изображении. Метрикой расстояния обычно является либо евклидово (норма L2), либо манхэттенское расстояние (норма L1). Оно равно нулю для пикселей, которые не равны нулю во входном изображении. Это преобразование тесно связано со знаковой функцией расстояния, значение которой в любой точке равно расстоянию от этой точки до ближайшей границы фигуры и является положительным внутри фигуры и отрицательным вне фигуры. На рисунке справа показана функция расстояния со знаком для единичного круга, и она имеет нулевое значение, обозначенное красной плоскостью на границе объекта. Если мы считаем, что форма определяется ее преобразованием расстояния со знаком, то ее нулевой контур определяет границу формы. Изменение формы 235 чим общую меру расстояния, которая будет равна нулю только тогда, когда квадрат нашей модели наложится на исходный квадрат. Общее расстояние – это функция стоимости, которую мы можем минимизировать, используя процедуру оптимизации, подбирающую положение, ориентацию и размер квадрата. Если рассматривать преобразование расстояния как трехмерную поверхность на рис. 4.32c, наша задача аналогична броску растяжимого квадратного контура в долину преобразования расстояния. Обратите внимание, что преобразование расстояния необходимо вычислить только один раз, и во время подбора модели функция стоимости представляет собой просто поиск вычисленного расстояния. Это пример сопоставления граней, а полный пример с оптимизацией приведен в examples/ chamfer_match.m. 4.7 Изменение формы В заключение мы обсудим операции обработки, которые изменяют форму или размер изображения. 4.7.1 Обрезка Самым простым изменением формы является выбор прямо­ угольной области изображения, что является знакомой операцией обрезки. Возьмем изображение >> mona = iread('monalisa.png'); показанное на рис. 4.33a, на котором мы интерактивно указываем область наблюдения (region of interest, ROI): >> [eyes,roi] = iroi(mona); >> idisp(eyes) щелкнув и перетащив рамку выбора на изображение. В данном случае мы выделили глаза, а углы выделенной области можно при желании вывести на печать >> roi roi = 239 237 359 294 где столбцы – это координаты (u, v) для верхнего левого и нижнего правого углов. Строки представляют собой u и v-промежутки 236 Глава 4 · Изображения и их обработка v (пиксели) v (пиксели) Рис. 4.33. Пример выбора области наблюдения или обрезки изображения: a) исходное изображение, b) выбранная область а u (пиксели) b u (пиксели) соответственно. Функцию можно использовать неинтерактивно, указав ROI >> smile = iroi(mona, [265 342; 264 286]); который в данном случае охватывает улыбку Моны Лизы, показанную на рис. 4.33b. 4.7.2 Изменение размера изображения Часто приходится уменьшать размеры изображения, возможно, потому что большое количество пикселей приводит к длительному времени обработки или занимает слишком много памяти. Продемонстрируем эту обработку на изображении с высоким разрешением >> roof = iread('roof.jpg', 'grey'); >> about(roof) roof [uint8] : 1668x2009 (3351012 bytes) которое показано на рис. 4.34а. Простейшим средством уменьшения размера изображения является подвыборка или прореживание, при котором выбирается каждый m-й пиксель в направлении u и v, где m ∈ �+ – коэффициент подвыборки. Например, при m = 2 изображение N´N становится изображением N/2´N/2, которое содержит одну четверть количества пикселей исходного изображения. Для примера мы уменьшим размер изображения в семь раз в каждом направлении >> smaller = roof(1:7:end,1:7:end); используя стандартный синтаксис индексации MATLAB для выбора каждой седьмой строки и столбца. Результат показан на рис. 4.34b, где мы наблюдаем несколько ярко выраженных изо- Изменение формы 237 гнутых линий на крыше, которых не было на исходном изображении. Это артефакты процесса выборки. Подвыборка снижает частоту пространственной выборки изображения, что может Любой реализуе- привести к пространственному наложению высокочастотных мый фильтр низких компонентов из-за текстуры или резких краев. Чтобы убедиться, частот имеет конечную характеристику что выполняется требование теоремы выборки Шеннона–Найвыше его частоты квиста, необходимо применить сглаживающий пространственсреза. На практике ный фильтр низких частот и тем самым уменьшить пространчастота среза выственную полосу пропускания изображения перед операцией бирается настолько ниже теоретиче- подвыборки . Это еще одно применение сглаживания, и ядро ской, чтобы отклик Гаусса является вполне подходящим фильтром низких частот фильтра на частоте для этой цели. Комбинированная операция сглаживания и подНайквиста был достаточно малым. выборки реализована в Toolbox с по­мощью функции Как правило, для подвыборки с m = 2 >> smaller = idecimate(roof, 7); используется гауссиан с σ = m/2. а результаты для m = 7 показаны на рис. 4.34c. Обратите вни- c b u (пиксели) v (пиксели) u (пиксели) v (пиксели) a v (пиксели) v (пиксели) мание, что артефакты в виде изогнутых линий больше не наблюдаются. u (пиксели) d u (пиксели) Рис. 4.34. Пример масштабирования изображения: a) исходное изображение; b) подвыборка с m = 7, обратите внимание на масштабирование по оси; c) подвыборка с m = 7 после сглаживания; d) изображение c восстановлено до исходного размера путем репликации пикселей 238 Глава 4 · Изображения и их обработка Обратная операция – это репликация пикселей, при которой каждый входной пиксель реплицируется как плитка размера m´m в выходном изображении: >> bigger = ireplicate( smaller, 7 ); Результат показан на рис. 4.34d. Вдоль края крыши и вдоль линии горизонта можно видеть некоторую ступенчатость. На этапе прореживания было удалено 98 % пикселей, и восстановление исходного размера изображения не добавило никакой новой информации. Однако мы могли бы сделать изображение более приятным для глаз, сгладив границы плитки: >> smoother = ismooth( bigger, 4); Мы можем сделать то же самое, используя функцию iscale Toolbox, которая масштабирует изображение с произвольным коэффициентом m ∈ �+, например: >> smaller = iscale(lena, 0.1); >> bigger = iscale(smaller, 10); Второй аргумент – масштабный коэффициент, и, если m < 1, изображение будет уменьшено, а если m > 1 – увеличено. 4.7.3 Пирамиды изображений Важной концепцией компьютерного зрения, к которой мы вернемся в следующей главе, является масштабируемое пространство. Функция ipyramid Toolbox возвращает пирамидальную декомпозицию входного изображения >> p = ipyramid( imono(mona) ) p = Columns 1 through 11 [700x677 double] [350x339 double] ... [2x2 double] [0.0302] как массив ячеек MATLAB, содержащий изображения с последовательно более низким разрешением. Обратите внимание, что последний элемент – версия с разрешением 1´1 – представляет собой один темно-серый пиксель! Эти изображения вставляются в составное изображение, показанное на рис. 4.35. Пирамида изображений лежит в основе многих так называемых стратегий «от грубого к точному». Рассмотрим задачу поиска шаблона значений пикселей, которые представляют интересующий объект. На самом маленьком изображении можно очень быстро найти объект, так как оно содержит лишь небольшое количество пикселей. Затем поиск уточняется с ис- Рис. 4.35. Пирамида изображений, последовательность изображений, каждое из которых составляет половину (по длине стороны) разрешения от предыдущего v (пиксели) Изменение формы 239 u (пиксели) пользованием следующего большего изображения, но теперь мы знаем, в какой области этого большего изображения искать. Процесс повторяется до тех пор, пока расположение объекта не будет точно определено на изображении с самым высоким разрешением. 4.7.4 Деформация изображения Деформация изображения – это преобразование координат, а не значений пикселей. Деформацию можно использовать для увеличения или уменьшения размера изображения, поворота изображения или применения совершенно произвольных изменений формы. Координаты пикселя в новом представлении (u¢, v¢) выражаются как функции от координат в исходном виде: u¢ = fu(u, v), v¢ = fv(u, v). (4.10) Рассмотрим простой пример, когда изображение уменьшено в размере в 4 раза в обоих направлениях и смещено так, что его начало координат (его верхний левый угол) сдвинуто на координату (100, 200). Мы можем выразить это кратко следующим образом: u¢ = u/4 + 100, v¢ = v/4 + 200. (4.11) Координатные матрицы таковы, Сначала прочитаем изображение и установим пару коордичто U(u,v) = u и V(u,v) = v натных матриц , которые охватывают область входного изои являются общей бражения – набор всех возможных (u, v): конструкцией в MATLAB, см. документацию >> mona = iread('monalisa.png', 'double', 'grey'); для meshgrid. >> [Ui,Vi] = imeshgrid(mona); 240 Глава 4 · Изображения и их обработка и другую пару, охватывающую область выходного изображения, которое мы произвольно выбираем равным 400´400, т. е. набор всех возможных (u¢, v¢): >> [Up,Vp] = imeshgrid(400, 400); Теперь для каждого пикселя в выходном изображении соответствующая координата во входном изображении задается инверсией функций fu и fv. Для нашего примера инверсия уравнения 4.11 будет иметь вид: u = 4(u¢ – 100), v = 4(v¢ – 200). (4.12) Она реализована в матричной форме в MATLAB как С помощью завершающего аргумента для interp2 могут Теперь мы можем деформировать входное изображение, ис- быть выбраны различные режимы пользуя функцию MATLAB interp2. интерполяции, но по умолчанию исполь>> little_mona = interp2(Ui, Vi, mona, U, V); зуется билинейная интерполяция. ПикРезультат показан на рис. 4.36а. Учтите, что для interp2 тре- сель с координатой буется изображение, у которого пиксели имеют значения с пла- (u + δ+u, v + δv), где u, v ∈ � и δu, δv ∈ [0, 1), вающей запятой. представляет собой У операций за кулисами этих преобразований есть тонкие линейную комбинанюансы. Во-первых, хотя (u¢, v¢) являются целочисленными ко- цию пикселей (u, v), ординатами, координаты входного изображения (u, v) не обя- (u + 1, v), (u, v + 1) и (u + 1, v + 1). зательно будут целыми числами. Значения пикселей должны Функция интерпобыть интерполированы из соседних пикселей входного изо- ляции действует как бражения. Во-вторых, не всем пикселям выходного изображе- слабый сглаживаю­ щий фильтр, но при ния соответствуют пиксели входного изображения, как показа- очень большом но на рис. 4.37. К счастью для нас, interp2 справляется со всеми уменьшении масэтими проблемами, и пиксели, не существующие во входном штаба изображение следует сначала изображении, устанавливаются в NaN в выходном изображении, сгладить с по­мощью которое мы отобразили красным. В случае сильно искаженных ядра Гаусса. а v (пиксели) v (пиксели) >> U = 4*(Up-100); V = 4*(Vp-200); u (пиксели) b u (пиксели) Рис. 4.36. Деформированные изображения: a) масштабирование и сдвиг; b) поворот на 30° вокруг своего центра. Пикселям, отображаемым красным цветом, было присвоено значение NaN с по­мощью interp2 – они не интерполировались из каких-либо пикселей изображения Изменение формы 241 отображений может случиться так, что многие соседние выходные пиксели сопоставляются с одним и тем же входным пикселем, что приводит к пикселизации или ступенчатости выходного изображения. Теперь давайте попробуем сделать что-нибудь более амбициозное и повернем изображение на 30°, чтобы получить выходное изображение того же размера, что и входное: >> [Up,Vp] = imeshgrid(mona); Нам нужно повернуть изображение вокруг его центра, но, поскольку начало исходного изображения находится в верхнем левом углу, мы должны сначала перенести начало координат Это применение в центр, затем повернуть изображение и вернуть начало кооркручения, о котором было сказано динат в верхний левый угол . Поэтому уравнение деформации в главе 2. имеет вид: (4.13) где (uc, vc) – координата центра изображения, а R(π/6) – матрица поворота в SE(2). Ее можно преобразовать в обратную форму и реализовать при помощи кода: >> R = SO2(pi/6).R; ус = 256; вк = 256; >> U = R(1,1)*(Up-uc) + R(2,1)*(Vp-vc) + uc; >> V = R(1,2)*(Up-uc) + R(2,2)*(Vp-vc) + vc; >> twisted_mona = interp2(Ui, Vi, mona, U, V); Результат показан на рис. 4.36b. Обратите внимание на направление вращения – наше определение осей x и y (параллельных осям u и v соответственно) таково, что ось z определяется как направленная внутрь страницы, что делает вращение по часовой стрелке положительным углом. Также обратите внимание, что углы исходного изображения были потеряны, они выходят за пределы выходного изображения. Функция iscale использует деформацию изображения для изменения масштаба изображения, а функция irotate испольРис. 4.37. Обозначение координат для деформации изображения. Пиксель (u¢, v¢) в выходном изображении получается из пикселя (u, v) входного изображения, как указано стрелкой. Искаженное изображение не обязательно является многоугольным или полностью содержится в выходном изображении входное изображение выходное изображение 242 Глава 4 · Изображения и их обработка зует деформацию для поворота. Приведенный выше пример может быть реализован с по­мощью одной строки кода: >> twisted_mona = irotate(mona, pi/6); Наконец, мы вернемся к примеру с дисторсией объектива из раздела 6.2.4. Искаженное изображение с камеры является входным изображением и будет деформировано для устранения искажения. Нам повезло, так как модель искажения (6.13) уже представлена в обратной форме. Напомним, что u¢ = u + δu; v¢ = v + δv, где искаженные координаты отмечены штрихом, а δu и δv – функции от (u, v). Сначала мы загружаем искаженное изображение и строим матрицы координат для искаженного и неискаженного изображений: >> distorted = iread('Image18.tif', 'double'); >> [Ui,Vi] = imeshgrid(distorted); >> Up = Ui; Vp = Vi; а затем загружаем результаты калибровки камеры: >> load Bouguet Для лучшей читаемости распаковываем нужные параметры из переменных Calibration Toolbox cc, fc и kc >> k = kc([1 2 5]); p = kc([3 4]); >> u0 = cc(1); v0 = cc(2); >> fpix_u = fc(1); fpix_v = fc(2); для векторов радиального и тангенциального искажения, главной точки и фокусного расстояния в пикселях. Затем мы конвертируем координаты пикселей в нормализованные коордиВ метрах относинаты изображения >> u = (Up-u0) / fpix_u; >> v = (Vp-v0) / fpix_v; Тогда радиальное расстояние пикселей от главной точки равно >> r = sqrt( u.^2 + v.^2 ); а ошибки координат пикселей из-за искажения равны >> delta_u = u .* (k(1)*r.^2 + k(2)*r.^4 + k(3)*r.^6) + ... 2*p(1)*u.*v + p(2)*(r.^2 + 2*u.^2); >> delta_v = v .* (k(1)*r.^2 + k(2)*r.^4 + k(3)*r.^6) + ... p(1)*(r.^2 + 2*v.^2) + 2*p(2)*u.*v; тельно главной точки камеры. Подведение итогов 243 Искаженные координаты пикселей в метрических единицах >> ud = u + delta_u; vd = v + delta_v; которые мы конвертируем обратно в пиксельные координаты >> U = ud * fpix_u + u0; >> V = vd * fpix_v + v0; и, наконец, применяем деформацию >> undistorted = interp2(Ui, Vi, distorted, U, V); v (пиксели) v (пиксели) Результаты показаны на рис. 4.38. Изменение довольно тонкое, но наиболее заметно по краям и углам изображения, где r является максимальным. а u (пиксели) b u (пиксели) Рис. 4.38. Деформация для устранения оптических искажений: a) исходное искаженное изображение; В этой главе вы узнали, как получать изображения из различb) исправленное ных источников, таких как файлы изображений, видеофайлы, изображение. Обратите внимание, видеокамеры и интернет, и загружать их в рабочее пространчто верхний край ство MATLAB. Получив изображения, мы можем обращаться мишени стал с ними как с матрицами – основным типом данных MATLAB, – прямой линией (пример из набора и удобно ими манипулировать. Элементами матриц изображеинструментов ния могут быть целые числа, числа с плавающей запятой или Bouguet Camera логические значения. Далее мы обсудили различные операции Calibration Toolbox, изображение обработки, а их таксономия сведена в табл. 4.2. Операции с одномер 18) ним изображением включают в себя унарные арифметические 4.8 Подведение итогов операции, преобразование типов, различные преобразования цвета и растяжение уровня серого; нелинейные операции, такие как нормализация гистограммы и гамма-кодирование или декодирование; и логические операции, такие как пороговое 244 Глава 4 · Изображения и их обработка Таблица 4.2. Краткий перечень алгоритмов обработки изображений, обсуждаемых в этой главе Операции Монадические Преобразование типа Унарные функции Унарные операторы Изображения и константы RVC Toolbox Уровень серого Цвет igamm, istretch, inormhist imono, icolor, colorspace, tristim2cc iint, idouble Диадические Бинарные операторы Бинарные функции Пространственные Линейные Край Ядра Нелинейные Совпадение с шаблоном Морфологические Изменение расстояния Изменение формы Масштабирование Вращение Обрезка Искажение Получение изображений Из файла Из камеры Из веб-камеры Из фильма Из карт Google Из кода Общие функции Отображение Анализ Запись изображения MATLAB ipixswitch abs, sqrt, exp –, ~, .^2, imcomplement +, –, *, /, >, >=, <, <=, imadd, imsubstract, immultiply, imdivide imadjust, stretchlim, histeq imapplymatrix, rgb2hsv, hsv2rgb, rgb2lab, lab2rgb, rgb2xyz, xyz2rgb, lab2xyz, xyz2lab +, –, .*, ./, &, |, imadd, imsubstract, immultiply, imdivide, imlincomb atan2, min, max и др. iconv, ismooth isobel, icanny kgauss, ksobel, kdgauss, klaplace, klog, kdog, kcircle irank, ivar, iwindow isimilarity, sad, ssd, ncc, zsad, zssd, zncc imorph, ierode, idilate, iopen, iclose, hitormiss, ithin, iendpoint, itriplepoint distancexforma conv2, imgaussfilt edge fspecial idecimate, ireplicate, iscale iscale iroi, isamesize, itrim, ipad homtrans imresize imrotate imcrop iread imread videoinput VideoCameraa AxisCamera Movie EarthView testpattern, ipaste, kcircle, iline idisp ihist, iline ordfilt2, medfilt2, stdfilt normxcorr2 bwmorph, imerode, imdilate, imopen, imclose, bwhitmiss bwdist interp2, imwarp, imtransform VideoReader imshow, ImageViever app imwrite Примечания: жирным шрифтом обозначены базовые функции MATLAB, для остальных нужны дополнительные наборы инструментов. Функции RVC Toolbox иногда служат оберткой базовых функций MATLAB. a) Полностью функциональна, когда установлены пакеты MATLAB. Подведение итогов 245 значение. Мы также обсудили операции с парами изображений, такие как фильтрация зеленого, вычисление фона и обнаружение движущихся объектов. Самый большой и разнообразный класс операций – это пространственные операторы. Мы обсудили свертки, которые можно использовать для сглаживания изображения и обнаружения краев. Линейные операции определяются матрицей ядра, которую можно выбрать для выполнения таких функций, как сглаживание изображения (для уменьшения эффекта шума изображения или в качестве низкочастотного сглаживающего фильтра перед прореживанием) или для обнаружения краев. Нелинейные пространственные операции применяются для сопоставления шаблонов, вычисления ранговой статистики (включая медианный фильтр, который устраняет импульсный шум) и математической морфологии, которая фильтрует изображение на основе формы и может использоваться для очистки бинарных изображений. Преобразование «попадание или промах», может итеративно применяться для выполнения таких функций, как скелетирование. Наконец, мы обсудили операции по изменению формы, такие как области внимания, изменение масштаба, а также проб­ лемы, которые могут возникнуть из-за ступенчатости и общего искажения изображения при перемещении, повороте или устранении оптических искажений изображения. Все эти методы обработки изображений лежат в основе алгоритмов выделения признаков, которые мы обсудим в следующей главе. Дополнительное чтение Обработка изображений – обширная область, и эта глава познакомила вас со многими наиболее полезными методами с точки зрения робототехники. Более полное освещение тем, представленных здесь, и других, таких как морфология оттенков серого, восстановление изображений, вейвлет-методы и методы частотной области, а также сжатие изображений, можно найти у Желиски (Szeliski, 2011), Никсона и Агуадо (Nixon and Aguado, 2012), Форсайта и Понсе (Forsyth and Ponce, 2011) и Гонсалеса и Вудса (Gonzalez and Woods, 2011). Онлайн-информация о компьютерном зрении доступна через CVonline по адресу http:// homepages.inf.ed.ac.uk/rbf/CVonline, а материал этой главы рассматривается в разделе Image Transformations and Filters («Преобразование изображений и фильтры»). Обнаружение краев – это часть обработки изображений, но по ней имеется огромное количество литературы. Форсайт и Понсе (Forsyth and Ponce, 2011) предлагают исчерпывающее введе- 246 Глава 4 · Изображения и их обработка ние в обнаружение границ и полезное обсуждение ограничений обнаружения границ. Никсон и Агуадо (Nixon and Aguado, 2012) также рассматривают подходы фазовой конгруэнтности к обнаружению границ и сравнивают различные детекторы границ. Ядро Собеля для обнаружения краев было описано в неопубликованной статье 1968 г. Стэнфордской лаборатории искусственного интеллекта Ирвина Собеля и Джерома Фельдмана A 3×3 Iso­tropic Gradient Operator for Image Processing. Детектор краев Кэнни был первоначально описан в статье (Canny, 1983, 1987). Непараметрические меры сходства изображений стали популярными в 1990-х гг. благодаря ряду ключевых статей, таких как работы Забиха и Вудфилла (Zabih and Woodfill, 1994), Бэнкса и Корке (Banks and Corke, 2001), Бахата и Наяра (Bhat and Nayar, 2002). Применение к системам обработки изображений в реальном времени высокоскоростной логики, такой как FPGA, изуча­лось несколькими группами (Corke et al., 1999; Woodfill and Von Herzen, 1997). Математическая морфология – еще одна очень большая тема, и мы коснулись только поверхности, а важные методы, такие как морфология оттенков серого и переходные границы, вообще не были рассмотрены. В упомянутых выше общих книгах по обработке изображений есть полезные обсуждения этой темы. Большинство специализированных книг в этой области уже устарели, но работа Шиха (Shih, 2009) является хорошим введением, а книга Догерти и Латуфо (Dougherty and Latufo, 2003) предлагает более практический подход к обучению. Подход к компьютерному зрению, описанный в этой книге, часто называют восходящей обработкой. Эта глава была посвящена методам низкоуровневого зрения, которые представляют собой операции с пикселями. Следующая глава посвящена высокоуровневым методам визуализации, в которых наборы пикселей группируются, а затем описываются для представления объектов на сцене. Источники изображений Все изображения, используемые в этой части книги, поставляются вместе с набором инструментов в папке images набора инструментов машинного зрения. Существуют тысячи онлайн-веб-камер, а также ряд сайтов, которые объединяют их и предоставляют списки, классифицированные по местоположению, например Opentopia, EarthCam и WatchThisCam. Большинство этих сайтов не подключают вас напрямую к веб-камере, поэтому URL-адрес камеры приходит- Подведение итогов 247 ся извлекать из источника HTML-страницы. Для класса AxisWebCamera требуется корневая часть URL-адреса (до первой косой черты). Некоторый контент на этих страницах со списками может быть довольно сомнительным – так что будьте осторожны. Примечания к MATLAB В табл. 4.2 перечислены функции обработки изображений, которые обсуждались в этой главе, и эквивалентные функции из нескольких наборов инструментов, доступных в MathWorks: Image Processing Toolbox™, Image Acquisition Toolbox™ и Computer Vision System Toolbox™. Есть много дополнительных функций из этих наборов инструментов, которые здесь не перечислены. Набор инструментов RVC является бесплатным и с открытым исходным кодом, но его разработка ограничена, а код написан с приоритетом понимания, а не для производительности. Напротив, наборы инструментов MathWorks являются поддерживаемыми продуктами, и многие из них поддерживают GPU, могут использоваться в Simulink или для автоматической генерации кода. Дополнением к книге Гонсалеса и Вудса (Gonzalez and Woods, 2008) является их следующая основанная на MATLAB книга (Gonzalez et al. 2009), в которой подробно рассмотрена обработка изображений с использованием MATLAB и включены функции, расширяющие IPT. Они предоставляются бесплатно в формате P-кода (исходный код или справка отсутствуют) или в виде M-файлов для покупки, но в настоящее время они устарели. Поисковый запрос «обработка изображений» на сайте MATLAB CENTRAL http://www.mathworks.com/matlabcentral/fileexchange возвращает тысячи файлов. Программные инструменты общего назначения Существует множество высококачественных программных инструментов для обработки изображений и видео вне среды MATLAB. Пакет OpenCV на http://opencv.org – это зрелый проект программного обеспечения компьютерного зрения с открытым исходным кодом, содержащий более 2500 алгоритмов, интерфейсы для C++, C, Python и Java и работающий на Windows, Linux, Mac OS, iOS и Android. В настоящее время издано несколько книг об OpenCV, но я рекомендую книгу Кёхлера и Брэндски (Kaehler and Bradski, 2016) – это второе издание популярной книги, которая представляет собой хорошее введение в программное обеспечение и компьютерное зрение в целом. 248 Глава 4 · Изображения и их обработка ImageMagick (http://www.imagemagick.org) – это кросс-плат­ фор­менная коллекция библиотек и инструментов командной строки для преобразования форматов изображений (более 100 форматов), которые полезны для пакетных операций с большими наборами изображений. Для манипуляций с видео FFmpeg есть превосходный многофункциональный кроссплатформенный инструмент по адресу http://www.ffmpeg.org. Он поддерживает преобразование видеоформатов, а также видео в неподвижные изображения и наоборот. Упражнения 1. Ознакомьтесь с функцией idisp для изображений в оттенках серого и цветных изображений. Исследуйте значения пикселей на изображении, а также кнопки масштабирования, линии и гистограммы. Используйте iroi, чтобы извлечь улыбку Моны Лизы. 2. Сравните гистограммы изображений в градациях серого, которые недоэкспонированы, правильно экспонированы и переэкспонированы. В случае цветных изображений сравните гистограммы цветовых каналов RGB для сцен с разными доминирующими цветами. Комбинируйте захват изображения в реальном времени с вычислением и отображением гистограммы. 3. Присвойте две копии изображения в оттенках серого переменным рабочей области A и B. Напишите код, определяющий время, необходимое для вычисления разницы между A и B, используя сокращение MATLAB A–B или два вложенных цикла for. Используйте функции tic и toc для измерения времени. 4. Загрузите несколько кадров с камеры или извлеките из видеофайла и отобразите их. 5. Напишите цикл, который захватывает кадр с камеры и отображает его. Добавьте различные эффекты к изображению перед отображением, такие как «негативное изображение», пороговое значение, постеризация, искусственный цвет, фильтрация краев и т. д. 6. Для сцены с яркостью 800 нит и камерой с ISO 1000, q = 0.7 и f-числом 2.2 вычислите время экспозиции, необходимое, чтобы средний уровень серого 8-битного изображения равнялся 150. 7. Выполните обработку спутниковых снимков: a) получите изображение своего района с по­мощью EarthView и создайте изображение, где дороги – это белые пиксели, а все остальное – черные пиксели; Подведение итогов 249 b) для изображений, возвращаемых функцией EarthView, напишите функцию преобразования координат пикселя в широту и долготу; c) загрузите данные GPS-трека со своего телефона и наложите их на изображение со спутника. 8. Работа с обнаружением движения: a) измените пример обработки дорожного движения (раздел 4.4, рис. 4.11) и выделите движущиеся транспортные средства; b) напишите цикл, который выполняет вычисление фона, используя кадры с вашей камеры. Что происходит, когда вы перемещаете объекты в сцене или оставляете их там на некоторое время? Исследуйте эффект изменения параметра σ; c) объедините концепции обнаружения движения и хроматической рирпроекции (хромакей), чтобы поместить пиксели с камеры, где есть движение, в сцену пустыни. 9. Свертка: a) сравните результаты сглаживания с использованием равномерного ядра 21´21 и ядра Гаусса. Наблюдаете ли вы артефакт «звона» в первом случае? b) почему мы выбираем сглаживающее ядро, сумма элементов которого равна единице? c) сравните производительность ядра простого горизонтального градиента K = (−0.5 0 0.5) с ядром Собеля; d) исследуйте фильтрацию с по­мощью ядра Гаусса для различных значений σ и размера ядра; e) создайте ядро 31´31 для обнаружения линий под углом 60°; f) выведите аналитически производную гауссиана в x-на­ правлении (уравнение 4.4); g) выведите аналитически лапласиан гауссиана (уравнение 4.8); h) выведите аналитически разность гауссианов; i) покажите разницу между разностью гауссианов и производной гауссиана. 10. Аналитически покажите влияние ошибки шкалы интенсивности на меры подобия SSD и NCC. 11. Выполните сопоставление шаблона с изображением Моны Лизы; сначала преобразуйте его в оттенки серого: a) используйте iroi, чтобы выбрать один из глаз Моны Лизы в качестве шаблона. Шаблон должен иметь нечетные размеры; b) используйте isimilarity для вычисления подобия изображений. Какое совпадение лучше всего и где оно встречается? Каково сходство с другим глазом? Где на- 250 Глава 4 · Изображения и их обработка ходится второе наилучшее совпадение и какова его оценка сходства? c) измените интенсивность изображения Моны Лизы и исследуйте влияние на пиковое сходство; d) добавьте смещение к интенсивности изображения Мо­ ны Лизы и исследуйте влияние на пиковое сходство; e) повторите шаги (c) и (d) для различных показателей сходства, таких как SAD, SSD, рейтинг и последовательность; f) масштабируйте размер шаблона с по­мощью различных коэффициентов (используйте iscale) в диапазоне от 0.5 до 2.0 с шагом 0.05 и исследуйте влияние на пиковое сходство. Постройте график зависимости пикового сходства от масштаба; g) повторите (f) для вращения шаблона в диапазоне от –0.2 до 0.2 рад с шагом 0.05. 12. Выполните пример подвыборки в разделе 4.7.2 и изучите артефакты сглаживания вокруг острых краев и обычную текстуру черепицы. Какова подходящая ширина ядра сглаживания для прореживания на M? 13. Напишите функцию для создания рис. 4.35 из вывода ipyramid. 14. Создайте функцию деформации, которая имитирует ваше любимое зеркало в комнате смеха. 15. Деформируйте изображение в полярных координатах (r, θ) относительно центра изображения, где горизонтальная ось – это r, а вертикальная ось – θ. Глава 5 Извлечение признаков изображения В предыдущей главе мы обсудили получение и обработку изображений. Вы узнали, что изображения – это просто большие массивы значений пикселей, но с точки зрения роботов изображения содержат слишком много данных и мало информации. Робот должен уметь отвечать на содержательные вопросы, например: в каком положении находится объект? что это за объект? как быстро он движется? как быстро двигается сам робот? и т. д. Ответами на такие вопросы являются измерения, полученные из изображения, которые принято называть признаками изображения. Признаки – это суть сцены и исходный материал, который нам нужен для управления роботом. Операции обработки изображений из предыдущей главы работали с одним или несколькими входными изображениями и возвращали другое изображение. В отличие от этого процедура извлечения признаков работает с одним изображением и возвращает один или несколько признаков изображения. Признаки обычно представляют собой скаляры (например, площадь или соотношение сторон) или короткие векторы (например, координаты объекта или параметры линии). Извлечение признаков изображения – необходимый первый шаг в использовании данных изображения для управления роботом. Это этап выделения уплотненной информации, снижающий скорость передачи данных с 106–108 байт/с на выходе камеры до порядка десятков признаков на кадр, которые можно использовать в качестве входных данных для системы управления роботом. В этой главе мы рассмотрим признаки и способы их извлечения из изображений. Опираясь на методы обработки изображений из предыдущей главы, мы обсудим несколько классов объектов: области, линии и опорные точки. В разделе 5.1 обсуж- 252 Глава 5 · Извлечение признаков изображения даются признаки областей, которые представляют собой смежные группы пикселей, однородные по некоторому свойству пикселей. Например, это может быть набор пикселей, представляющих красный объект на фоне другого цвета. В разделе 5.2 обсуждаются признаки линий, описывающие прямые линии в мире робота. Прямые линии отчетливы и очень часто встречаются в искусственных средах, например на краях дверных проемов, зданий или дорог. Последним источником признаков являются опорные точки, которые обсуждаются в разделе 5.3. Это особенно характерные точки сцены, которые можно надежно обнаружить в разных проекциях одной и той же сцены. Нельзя забывать о том, что признаки изображения представляют собой сводку информации, представленной в пикселях, составляющих изображение, и что отображение мира в пиксели сопряжено со значительными потерями информации – перспективная проекция, обсуждаемая в главе 6. Обычно мы боремся с этой потерей информации, делая предположения, основанные на знаниях об окружающей среде, но наша система всегда будет настолько хороша, насколько хороши наши предположения. Например, мы можем использовать признаки изображения для описания положения и формы группы красных пикселей, соответствующих красному объекту. Однако признак размера, обычно количество пикселей, ничего не говорит о размере красного объекта в реальном мире – нам нужна дополнительная информация, такая как расстояние между камерой и объектом и внутренние параметры камеры. Мы также должны предположить, что объект не закрыт частично – это сделало бы наблюдаемый размер меньше, чем истинный размер. Далее нужно предположить, что освещенность такова, что цветность света, отраженного от предмета, соответствует его свойствам. На изображении также могут быть обнаружены черты, не соответствующие физическому предмету, – декоративные рисунки, четкие края тени или отражения в окне. 5.1 Получение признаков из области Сегментация изображения – это процесс разделения изображения на значимые области, как показано на рис. 5.1. Цель состоит в том, чтобы сегментировать, т. е. отделить те пиксели, которые представляют интересующие объекты, от всех других пикселей в сцене. Это один из старейших подходов к пониманию сцены, и, хотя он концептуально прост, его сложно реализовать на практике. Ключевым требованием является надежность, т. е. насколько плавно и корректно метод деградирует при нарушении лежащих в его основе предположений, например при изменении освещения сцены или точки обзора. u (пиксели) v (пиксели) u (пиксели) v (пиксели) u (пиксели) v (пиксели) u (пиксели) v (пиксели) b d u (пиксели) u (пиксели) Метки v (пиксели) c u (пиксели) v (пиксели) a v (пиксели) v (пиксели) Получение признаков из области 253 u (пиксели) Рис. 5.1. Примеры классификации пикселей. Левая часть – входное изображение, правая часть – результат классификации. Классификация зависит от задачи, и пиксели классифицируются либо как объекты (белые), либо как не-объекты (черные). Предметы внимания: a) отдельные буквы на знаке; b) желтые мишени; c) красные помидоры; d) пример многоуровневой сегментации, в которой пиксели были отнесены к 28 классам, представляющим локально однородные группы пикселей в сцене 254 Глава 5 · Извлечение признаков изображения Сегментацию изображения обычно принято разделять на три подзадачи. Во-первых, это классификация, применяемая к каждому пикселю с целью отнести его к одному из C-классов c ∈ {0 ⋯ C − 1}. Обычно мы используем случай C = 2, который принято называть бинарной классификацией, или бинаризацией. Некоторые примеры классификации показаны на рис. 5.1a–c. Пиксели были классифицированы как объекты (c = 1) или необъекты (c = 0), которые отображаются как белые или черные пиксели соответственно. Классификация всегда зависит от задачи – например, объект соответствует ярким, желтым, красным или движущимся пикселям. Рисунок 5.1d иллюстрирует многоуровневую классификацию, где C = 28, а класс пикселя отражается в его отображаемом цвете. Основное предположение в примерах на рис. 5.1 состоит в том, что области гомогенны (однородны) по некоторым характеристикам, таким как яркость, цвет или текстура. Но мы понимаем, что в реальной жизни это не так и что пиксели могут быть неправильно классифицированы – нам придется иметь с этим дело на следующих этапах. Вторым шагом в процессе сегментации является представление, в котором соседние пиксели одного класса соединяются в пространственные множества S1 … Sm. Множества могут быть представлены путем присвоения метки множества каждому пикселю или списком координат пикселей, который определяет граница связного множества. На третьем и последнем шаге множества Si описываются с по­мощью компактных скалярных или векторных признаков, таких как размер, положение и форма. 5.1.1 Классификация Класс пикселей представлен целым числом c ∈ {1⋯ C}, где C – количество классов. В этом разделе мы обсудим проблему соотнесения каждого пикселя с определенным классом. Во многих примерах мы будем использовать бинарную классификацию всего с двумя классами, соответствующими не-объекту и объекту или фону и переднему плану. 5.1.1.1 Классификация по уровню серого Распространенным подходом к бинарной классификации пикселей является монадический (одноместный) оператор: v (пиксели) Количество пикселей Получение признаков из области 255 c b Уровень серого v (пиксели) u (пиксели) v (пиксели) a u (пиксели) d u (пиксели) Рис. 5.2. Бинарная в котором решение основано просто на значении пикселя I. классификация: Этот подход называется пороговой бинаризацией (thresholding), a) исходное изображение а t называется порогом. (получено из Пороговая бинаризация очень проста. Возьмем изображение коллекции ICDAR; Lucas 2005); >> castle = iread('castle.png', 'double'); b) гистограмма значений пикселей в оттенках серого, которое показано на рис. 5.2а. Бинаризованное изображение пороговые значения по методу Оцу >> idisp(castle >= 0.7) выделены красным; c) бинарная показано на рис. 5.2c. Пиксели были довольно точно классификлассификация цированы на соответствие белой краске. Эта классификация с порогом 0.7; d) бинарная основана на, казалось бы, разумном предположении, что объклассификация екты, окрашенные белой краской, ярче всего остального на изос порогом Оцу бражении. Этот подход широко использовался на заре компьютерного зрения, когда компьютеры были слабыми – было проще придумать мир белых объектов и темного фона, чем реализовать более сложную классификацию. Многие современные промышленные системы визуального контроля до сих пор используют этот простой подход, поскольку он позволяет использовать скромные встроенные компьютеры – он очень хорошо работает, если объекты находятся на конвейерной ленте подходящего 256 Глава 5 · Извлечение признаков изображения контрастного цвета или образуют силуэт на станции контроля. В реальной разнородной среде нам обычно приходится трудиться немного усерднее, чтобы извлечь полезную классификацию на уровне серого. Важный и сложный вопрос: как получено пороговое значение 0.7? Разумеется, методом проб и ошибок! Функция Toolbox itthresh >> ithresh(castle) отображает изображение и ползунок порога, который можно перемещать до получения удовлетворительного результата. Однако в день с другим освещением профиль интенсивности изображения изменится >> ithresh(castle*0.8) и потребуется другой порог. Более глубокий подход, чем метод проб и ошибок, – это анализ гистограммы изображения >> ihist(castle); как показано на рис. 5.2b. Гистограмма имеет два четко выраженных пика, т. е. бимодальное распределение, которое соответствует двум популяциям пикселей. Меньший пик около 0.9 соответствует ярким пикселям и имеет довольно небольшой диапазон изменения значений. Более широкий и высокий пик около 0.3 соответствует пикселям, расположенным на более темном фоне знака и на кирпичах, и имеет гораздо большую изменчивость яркости. Чтобы разделить два класса пикселей, необходимо найти разделяющую границу – порог, лежащий в долине между пиками. В этом отношении выбор t = 0.7 является удачным. Поскольку долина очень широка, у нас фактически есть довольно широкий диапазон выбора для порога; например, t = 0.75 также будет хорошо работать. Оптимальный порог можно вычислить с по­мощью метода Оцу >> t = otsu(castle) t = 0.5898 который разделяет изображение на два класса пикселей таким образом, чтобы минимизировать дисперсию значений внутри каждого класса и максимизировать дисперсию значений между классами – при условии, что гистограмма имеет только два пика. К сожалению, как мы скоро увидим, реальный мир редко бывает таким простым. Рассмотрим другое изображение той же сцены, на котором есть пятно засветки Получение признаков из области 257 >> castle = iread('castle2.png', 'double'); как показано на рис. 5.3а. Гистограмма на рис. 5.3b аналогична – она по-прежнему бимодальная, – но мы видим, что пики стали шире, а впадины менее глубоки. Популяции пикселей в оттенках серого теперь перекрываются, и, к сожалению, не существует единого порога, который может их разделить. Снова вычислим порог по методу Оцу: >> t = otsu(castle) t = 0.5859 v (пиксели) Количество пикселей Результат применения этого порога показан на рис. 5.3c. Классификация пикселей неудовлетворительна, и засветка перекрывает несколько символов. Результат использования более высокого порога 0.75 показан на рис. 5.3d – засветка уменьшается, но не полностью, и некоторые другие символы начинают распадаться. c b Уровень серого v (пиксели) u (пиксели) v (пиксели) a u (пиксели) d u (пиксели) Рис. 5.3. Пример бинарной сегментации: a) изображение в градациях серого с выделением интенсивности; b) гистограмма; c) классификация с пороговым значением Оцу 0.59; d) классификация с пороговым значением 0.75 258 Глава 5 · Извлечение признаков изображения Общеизвестно, что методы, основанные на пороговых значениях, ненадежны – небольшое изменение освещения сцены приводит к тому, что выбранные пороговые значения больше не подходят. В большинстве реальных сцен нет простого сопоставления значений пикселей с конкретными объектами – например, мы не можем выбрать порог, который выделял бы мотоцикл или утку. Выделение объекта на фоне остается сложной задачей компьютерного зрения. Одним из вариантов является выбор локального, а не глобального порога. Алгоритм Ниблэка широко используется в системах оптического распознавания символов и вычисляет локальный порог: t[u, v] = µ(�) – kσ(�), где � – область вокруг точки (u, v), а µ(·) и σ(·) – среднее значение и стандартное отклонение соответственно. Размер окна � является критическим параметром и должен совпадать с размером объектов, которые мы ищем. Для текущего примера мы делаем предположение, что символы имеют размер примерно 50–70 пикселей в высоту, чтобы выбрать полуширину окна 30 пикселей >> t = niblack(castle, -0.1, 30); >> idisp(t) где k = –0.1. Полученный локальный порог t показан на рис. 5.4а. Рис. 5.4. Подбор порога методом Применим порог попиксельно к исходному изображению: >> idisp(castle >= t) a v (пиксели) v (пиксели) В результате получилась классификация, показанная на рис. 5.4b. Все пиксели, принадлежащие буквам, были правильно классифицированы, но, по сравнению с рис. 5.3c, имеется много u (пиксели) b u (пиксели) Ниблэка: a) значения локального порога, отображаемые в виде изображения; b) результат бинарной сегментации Получение признаков из области 259 ложных срабатываний – пикселей фона, классифицированных как объекты. Позже в этом разделе мы обсудим методы устранения таких ложных срабатываний. Обратите внимание, что процесс классификации больше не является функцией только входного пикселя, теперь это сложная функция пикселя и его соседей. Хотя нам больше не нужно выбирать t, теперь важно выбрать параметр k и размер окна, и опять же это обычно процесс проб и ошибок, который можно заставить хорошо работать для конкретной сцены. Результаты, показанные на рис. 5.3c и d, на первый взгляд разочаровывают, но мы видим, что каждый символьный объект правильно классифицируется на некоторых, но не на всех порогах. На самом деле каждый объект правильно сегментирован для некоторого диапазона порогов, а нам бы хотелось объединения областей, классифицированных по диапазону всех порогов. Алгоритм максимально устойчивой экстремальной области (maximally stable extremal region, MSER) делает именно это. Он реализован в функции imser из Toolbox >> [mser,nsets] = imser(castle, 'area', [100 20000]); и для этого изображения Хотя явный порог не указан, imser >> nsets имеет ряд пара- nsets = метров, и в этом 95 случае их значения по умолчанию дали были найдены устойчивые наборы . Другое возвращаемое удовлетворительные результаты. значение представляет собой изображение Подробную информацию о парамет­ >> idisp(mser, 'colormap', 'jet') рах см. в онлайн-­ документации. которое показано на рис. 5.5 в синтетических цветах. Каждый v (пиксели) ненулевой пиксель соответствует устойчивому набору, а значе- Рис. 5.5. Сегментация с использованием метода максимально устойчивой экстремальной области (MSER). Идентифицированные области имеют уникальную цветовую кодировку u (пиксели) 260 Глава 5 · Извлечение признаков изображения ние – это метка, присвоенная этому набору, которая отображается как уникальный цвет. Все символы были правильно классифицированы. Граница была частично ошибочно принята за фон и слилась с текстурой кирпича в правой части изображения. 5.1.1.2 Классификация цветов Цвет – мощный параметр для сегментации, но робототехники склонны избегать его использования из-за проблем с постоянством цвета, обсуждавшихся в разделе 3.3.2. Далее мы рассмотрим два примера, в которых используются цветные изображения. Первый – довольно примитивная навигационная цель для эксперимента по посадке БПЛА в помещении, >> im_targets = iread('yellowtargets.png'); показан на рис. 5.6а, а второй – из проекта MIT Robotic Garden, >> im_garden = iread('tomato_124.jpg'); показан на рис. 5.7а. Наша цель – определить центроиды желтых мишеней и красных помидоров соответственно. Начальные этапы обработки одинаковы для каждого изображения, но мы подробно рассмотрим процесс для изображения желтых мишеней, показанных на рис. 5.6. Функция colorkmeans Toolbox сначала сопоставляет каждый цветовой пиксель с точкой на xy- или a*b*-плоскости цветности. Затем применяется алгоритм k-средних для поиска кластеров точек на плоскости, и каждый кластер соответствует группе пикселей с различимым цветом. Недостаток алгоритма k-средних состоит в том, что мы должны указать количество искомых кластеров. Мы воспользуемся нашими знаниями о том, что в этой конкретной сцене есть, по существу, два элемента разного цвета: желтые мишени и серый пол, металлическая крышка водостока и тени. Пиксели группируются в два класса цветности (C = 2) при помощи команды: >> [cls, cab,resid] = colorkmeans(im_targets, 2, 'ab'); Здесь указана a*b*-цветность, поскольку евклидово расстояние в этом пространстве, используемое k-средними для определения кластеров, соответствует человеческому восприятию различий между цветами. Функция возвращает a*b*-цветность центров кластеров >> cab cab = -0.8190 57.6140 0.4783 -4.1910 a Класс v (пиксели) v (пиксели) Получение признаков из области 261 b u (пиксели) v (пиксели) u (пиксели) d Рис. 5.6. Пример изображения цветной мишени: a) исходное изображение; b) классификация пикселей (C = 2), показанная синтетическим цветом; c) центры кластеров в a*b*-пространстве цветности; d) все пиксели класса c = 1; e) после морфологического открытия с круговым структурирующим элементом (радиус 2) u (пиксели) v (пиксели) c e u (пиксели) как один столбец на кластер. Мы можем нанести эти центры кластеров на a*b*-плоскость >> showcolorspace(cab, 'ab'); как показано на рис. 5.6c. Мы видим, что кластер 1 ближе всего к желтому >> colorname(cab(:,1), 'ab') ans = 'gold4' 262 Глава 5 · Извлечение признаков изображения Невязка >> resid resid = 2.8897e+03 представляет собой сумму расстояний каждой точки от на- Одним из вариантов значенного ей кластерного центроида. Поскольку алгоритм является запуск k-средних использует случайную инициализацию, мы будем получать несколько раз и выразные кластеры и классификацию при каждом запуске и, сле- бор центров клас­ теров, для которых довательно, разные невязки . невязка является Функция colorkmeans также возвращает классификацию пик- наименьшей. селей, которую мы можем отобразить в виде изображения >> idisp(cls, 'colormap', f lag(2), 'bar') в синтетических цветах , как показано на рис. 5.6b. Пиксели Мы указали цветов этом изображении имеют значения c = {1, 2}, указывающие, вую карту длины 2, так как знаем, что к какому классу относятся соответствующие входные пиксели. существует только Мы видим, что желтые пиксели цели были присвоены классу два возможных c = 1, который на синтетическом изображении отображается значения пикселей. красным цветом. Кластеризация k-средних требует больших вычислительных ресурсов и поэтому не очень хорошо подходит для приложений реального времени. Однако мы можем разделить процесс на этап обучения и этап классификации. На этапе обучения несколько примеров изображений будут объединены и переданы в функции colorkmeans, которые будут определять центры кластеров для каждого класса. Впоследствии мы можем относительно экономно относить пиксели к их ближайшему кластеру: >> cls = colorkmeans(im_targets, cab, 'ab'); Можно выбрать пиксели, принадлежащие классу 1, >> cls1 = (cls == 1); и получить логическое изображение, которое затем отобразить >> idisp(cls1) как показано на рис. 5.6d. Все пиксели класса 1 отображаются белым цветом и соответствуют желтым мишеням на исходном изображении. Это бинарное изображение уже демонстрирует хорошую классификацию, но есть незначительные недостатки: несколько шероховатых краев и крошечных отверстий. Их устранит операция морфологического открытия, описанная в разделе 4.6. Применим симметричный структурирующий элемент радиуса 2: >> targets_binary = iopen(cls1, kcircle(2)); a Класс v (пиксели) v (пиксели) Получение признаков из области 263 b u (пиксели) v (пиксели) u (пиксели) d Рис. 5.7. Пример изображения сада: a) исходное изображение (предоставлено проектом Distributed Robot Garden, Массачусетский технологический институт); b) классификация пикселей (C = 3), показанная синтетическим цветом; c) центры кластеров в цветовом пространстве a*b*; d) все пиксели класса c = 2; e) после морфологического закрытия круговым структурирующим элементом (радиус 15) u (пиксели) v (пиксели) c e u (пиксели) Результат показан на рис. 5.6e. Он показывает чистую бинарную сегментацию пикселей на два класса: целевые и нецелевые. Применим схожую процедуру к изображению сада. Мы будем классифицировать пиксели по трем кластерам (C = 3), основываясь на наших знаниях о том, что сцена содержит красные помидоры, зеленые листья и темный фон: >> [cls, cab] = colorkmeans(im_garden, 3, 'ab'); >> cab cab = -16.3326 44.0622 -1.5073 28.8824 26.7948 3.3873 264 Глава 5 · Извлечение признаков изображения Классы пикселей показаны на синтетическом цветном изображении рис. 5.7b. Пиксели, соответствующие помидору, были присвоены классу c = 2, которые отображаются белым цветом. Центры кластеров отмечены на цветовой плоскости a*b* на рис. 5.7c. Название цвета, ближайшего к кластеру 2: >> colorname(cab(:,2)', 'ab') ans = 'brown4' Кластеризация методом k-средних – это итерационный алгоритм для группировки n-мерных точек в k пространственных кластеров. Каждый кластер определяется центральной точкой, являющейся n-мерным вектором ci, i ∈ [1, k]. На каждой итерации все точки присваиваются ближайшему центру кластера, а затем каждый центр кластера обновляется, чтобы быть средним значением всех точек, назначенных кластеру. Алгоритм реализуется функцией kmeans Toolbox. В качестве метрики расстояния используется евклидово расстояние. Алгоритм k-средних требует начальной оценки центра каждого кластера, и это может быть сделано различными способами (см. документацию). По умолчанию kmeans случайным образом выбирает k из предоставленных точек, и это означает, что алгоритм будет возвращать разные результаты при каждом вызове. Для демонстрации выберем 500 случайных двухмерных точек: >> a = rand(2,500); где a – матрица 2´500 с одной точкой на столбец. Мы сгруппируем эти данные в три набора >> [cls,centre,r] = kmeans(a, 3); где cls – вектор из 500 элементов, которые определяют класс соответствующего столбца матрицы a. Далее, center – это матрица 2´3, столбцы которой определяют центр каждого двухмерного кластера, а r – невязка (норма расстояния каждой точки от назначенного ей кластерного центроида). Нарисуем точки в каждом кластере разными цветами: >> hold on >> for i=1:3 plot( a(1,cls==i), a(2,cls==i), '.' ); end и становится видно, что точки были разделены вполне обоснованно. Центроиды кластеров наложены на изображение в виде черных точек. Получение признаков из области 265 Можно выбрать только красные пиксели >> cls2 = (cls == 2); и получить логическое изображение, показанное на рис. 5.7d. Эта сегментация далека от совершенства. Оба помидора имеют отверстия из-за белого зеркального отражения, как обсуждалось в разделе 3.3.5. Несколько пикселей в левом нижнем углу, наоборот, были ошибочно классифицированы как помидор. Мы можем улучшить результат, применив операцию морфологического закрытия с большим круглым ядром, которое соответствует форме помидора: >> tomatoes_binary = iclose(cls2, kcircle(15)); Результат показан на рис. 5.7e. Операция закрытия улучшила форму помидора, но с нежелательным побочным эффектом в виде увеличения группы ошибочно классифицированных пикселей в нижнем левом углу. Тем не менее это изображение содержит работающую классификацию пикселей на два класса: помидоры и не помидоры. Изображение сада иллюстрирует два распространенных артефакта изображения реального мира: зеркальное отражение и окклюзию (перекрытие). Поверхность помидора достаточно Обратите внимание, что они имеют ту блестящая и ориентирована таким образом, что камера видит же цветность, что отражение комнатного света – эти пиксели белые, а не краси черный фон, пик- ные . Верхний помидор также частично закрыт листьями сели класса 3, расположенные близко и ветвями. В зависимости от того, как работает приложение, это к белой точке на может быть проблемой, а может и не быть. Поскольку до помиплоскости a∗b∗. дора все равно нельзя добраться с того направления, в котором был сделан снимок, из-за мешающих листьев, на самом деле может быть уместнее не классифицировать его как помидор. В этих примерах получена работающая классификация пикселей изображения на объекты и не-объекты. Полученные Это относительно группы белых пикселей часто называют блобами (от англ. слова простая задача. Цвет интересующе- blob, пятно, и одновременно «binary large object», большой биго объекта известен нарный объект). Интересно отметить, что мы не указали порог (мы могли бы ис- или какое-либо определение цвета объекта, но нам нужно было пользовать функцию colorname, чтобы указать количество классов и определить, какой из этих класнайти его), поэтому сов соответствует нужным объектам . Нам также пришлось мы могли вычислить выбирать. последовательность шагов обработки изображения расстояние между центром каждого и параметры каждого из этих шагов, например радиус струккластера и инте- турирующего элемента. Классификация пикселей – сложная заресующим цветом, дача, но мы можем получить неплохие результаты, используя заданным по имени, и выбрать ближай- априорное знание задачи, хороший набор приемов обработки ший кластер. изображений и опыт. 266 Глава 5 · Извлечение признаков изображения Зеркальные блики на изображениях являются отражением ярких источников света и могут усложнить сегментацию, как показано на рис. 5.3. Как обсуждалось в разделе 3.3.5, свет, отраженный большинством реальных объектов, имеет две составляющие: зеркальное отражение от поверхности, которое не изменяет спектр света; и диффузное отражение тела, которое фильтрует отраженный свет. Есть несколько способов уменьшить проблему зеркальных бликов. Во-первых, переместить или удалить проблемный источник света или переместить камеру. Во-вторых, использовать источник рассеянного света рядом с камерой, например кольцевой осветитель, который надевается на объектив камеры. В-третьих, можно ослабить зеркальное отражение с по­мощью поляризационного фильтра, поскольку свет, зеркально отраженный от диэлектрической поверхности, будет поляризован. 5.1.2 Оформление В предыдущем разделе мы брали изображения в градациях серого или цветные изображения и обрабатывали их для создания двоичных изображений, т. е. блобов. Оформление (representation) – это подзадача связывания соседних пикселей одного класса в пространственные множества S1 … Sm. Рассмотрим бинарное изображение >> im = iread('multiblobs.png'); которое показано при помощи команды >> idisp(im) на рис. 5.8а. Мы быстро различаем ряд белых и черных блобов в этой сцене, но что определяет блоб? Это набор пикселей одного класса, связанных друг с другом. Более формально мы могли бы сказать, что блоб – это пространственно непрерывная область пикселей одного класса. Блобы также называют областями, регионами или связанными компонентами. Toolbox может выполнять анализ связности на этом бинарном изображении: >> [label, m] = ilabel(im); Количество наборов или компонентов на этом изображении равно >> m m = 11 Они представляют собой пять белых шесть черных блобов (фон и отверстия). Эти блобы пронумерованы от 1 до 11. Возвращаемая матрица меток имеет тот же размер, что и исход- Получение признаков из области 267 ное изображение, и каждый элемент содержит метку s ∈ {1 ⋯ m} множества, которому принадлежит соответствующий входной Мы видели изображение меток пиксель. Матрица меток может отображаться в виде изображеранее. Результатом ния с синтетическими цветами: функции MSER на рис. 5.5 является >> idisp(label, 'colormap', jet, 'bar') такое изображение. как показано на рис. 5.8b. Каждая связанная область имеет уникальную метку и, следовательно, уникальный цвет. Глядя на значения меток на этом изображении или интерактивно исследуя отображаемую матрицу меток с по­мощью idisp, мы видим, что фон помечен как 1, крайний левый блоб помечен как 3, а его отверстия – как 5 и 7. Теперь не составит труда получить изображение, содержащее только конкретный блоб. Чтобы выбрать все пиксели, принадлежащие области 3, мы создаем логическое изображение: >> reg3 = (label==3); >> idisp(reg3) которое показано на рис. 5.8c. Общее количество пикселей u (пиксели) b u (пиксели) d v (пиксели) a c Класс v (пиксели) v (пиксели) Рис. 5.8. Пример в этом блобе определяется общим количеством пикселей с исмаркировки изображения: тинным значением в этом логическом изображении: a) бинарное изображение; >> sum(reg3(:)) b) помеченное ans = изображение; c) все 171060 пиксели с меткой 3 u (пиксели) 268 Глава 5 · Извлечение признаков изображения Анализ связности может возвращать дополнительные выходные значения >> [label, m, parents, cls] = ilabel(im); где вектор >> parents' ans = 0 1 1 2 3 1 3 6 6 9 9 описывает топологию или иерархию регионов. В данном случае вектор указывает, например, что родительской по отношению Элемент 4 этого к области 4 является область 2 , поскольку область 4 полностью массива равен 2. окружена областью 2. Родителем областей 2, 3 и 5 является область 1, которая является фоном. Область 1 имеет родительский элемент 0, указывающий, что она касается края изображения и не заключена ни в какую область. Мы можем визуализировать это в виде иерархии, показанной на рис. 5.8d, с по­мощью команды >> parents2graph(parents) Каждая связанная область содержит значения пикселей одного класса, а класс пикселей для каждой области определяется выражением: >> cls' ans = 0 1 1 0 0 1 0 0 0 1 1 Результат указывает на то, что области 2, 3, 6, 10 и 1 содержат Мы используем пиксели класса 1 (белые), а области 1, 4, 5, 7, 8 и 9 содержат пик- имя переменной cls, а не class, посели класса 0 (черные) . скольку последнее В этом примере мы предположили 4-стороннюю связь, т. е. является именем пиксели связаны внутри области только через своих северных, полезной функции в MATLAB. южных, восточных и западных соседей того же класса. Опция 8-стороннего связывания позволяет установить связь через лю- Восьмисторонняя связность бого из восьми соседей пикселя того же класса . привести Вернемся теперь к примерам из предыдущего раздела. Для может к неожиданным цветных мишеней результатам. Напри>> targets_label = ilabel(targets_binary); >> idisp(targets_label, 'colormap', 'jet'); и изображения сада >> tomatoes_label = ilabel(tomatoes_binary); >> idisp(tomatoes_label, 'colormap', 'jet'); связанные области показаны на рис. 5.9 синтетическими цветами. Теперь у нас появились кое-какие количественные знания мер, черно-белая шахматная доска будет иметь только две области; все белые квадраты – это одна область, а все черные квадраты – другая. a v (пиксели) v (пиксели) Получение признаков из области 269 u (пиксели) b u (пиксели) Рис. 5.9. об этих сценах: есть четыре желтых и три красных объекта соИзображения целей ответственно. и сада помечены синтетическим цветами. Значение каждого пикселя 5.1.2.1 Графовая сегментация является меткой пространственно До сих пор мы классифицировали пиксели на основе некоторых непрерывного множества, однородных характеристик объекта, таких как интенсивность к которому или цвет. Рассмотрим более сложную сцену принадлежит соответствующий >> im = iread('58060.jpg'); входной пиксель показанную на рис. 5.10а. Гештальт-принцип эмерджентности гласит, что мы идентифицируем объекты как целое, а не как набор частей – мы скорее видим чашу с зерном, чем выводим На сайте чашу с зерном, узнавая ее отдельные компоненты. Однако, сегментации Беркли когда дело доходит до подробной попиксельной сегментации, http://www.eecs. berkeley.edu/ начинается субъективизация – разные люди выполняют сегResearch/ ментацию по-разному, основываясь на суждениях о том, что Projects/CS/ важно . Например, следует ли сегментировать цветные полоvision/bsds размещены эти изо- сы на ткани? Если сегменты представляют объекты реального бражения, а также мира, то гештальт-представление будет заключаться в том, что ряд различных ткань должна быть только одним сегментом. Однако полосы сусегментаций, созданных человеком. ществуют, для их создания были предприняты определенные усилия, поэтому, возможно, их следует выделить. Вот почему сегментация является сложной проблемой – люди не могут договориться о том, что правильно. А от компьютерного алгоритма мы и подавно не можем ожидать суждений подобного рода. Тем не менее более сложные алгоритмы могут выполнять очень впечатляющую работу на сложных сценах реального мира. Изображение можно представить в виде графа (см. приложение G), где каждый пиксель является вершиной и имеет 8 ребер, соединяющих его с соседними пикселями. Вес каждого ребра – это неотрицательная мера несходства между двумя пикселями – абсолютное значение разницы в цвете. Алгоритм начинается с того, что каждая вершина назначается своему 270 Глава 5 · Извлечение признаков изображения собственному множеству. На каждой итерации проверяются веса ребер, и, если вершины находятся в разных множествах, но вес ребра ниже порогового значения, два множества вершин объединяются. Порог является функцией размера множества и глобального параметра k, который задает масштаб сегментации – большее значение k приводит к выбору более крупных связанных компонентов. Для рассматриваемого здесь изображения сегментация на основе графа задается выражением: >> [label, m] = igraphseg(im, 1500, 100, 0.5); >> m m = 28 >> idisp(label, 'colormap', 'jet') a u (пиксели) b Метки v (пиксели) v (пиксели) где label – матрица, показанная на рис. 5.10b, элементами которой являются метки области для соответствующих входных пикселей. Этап классификации пикселей интегрирован в этап представления. Аргументами являются параметр масштаба k = 1500, минимальный размер компонента 100 пикселей и стандартное отклонение для начального сглаживания по Гаус­су, примененного к изображению. u (пиксели) Рис. 5.10. Пример сложной сегментации: a) исходное цветное изображение (получено из набора данных сегментации Berkeley segmentation Dataset; Martin et al. 2001); b) сегментация на основе графа 5.1.3 Описание В предыдущем разделе вы узнали, как находить связанные компоненты в изображении и изолировать отдельные компоненты, как показано на рис. 5.8c. Однако это представление компонента по-прежнему является просто изображением с логическими значениями пикселей, а не кратким описанием его размера, положения и формы. Получение признаков из области 271 5.1.3.1 Ограничивающие рамки Простейшим описанием размера и формы является ограничивающая рамка – наименьший прямоугольник со сторонами, параллельными осям u и v, который окружает область. Мы проиллюстрируем это на простом бинарном изображении >> sharks = iread('sharks.png'); которое показано на рис. 5.11а. В соответствии с описанным ранее процессом, мы пометим пиксели и выберем все те, которые принадлежат области 2: >> [label, m] = ilabel(sharks); >> blob = (label == 2); Полученное логическое изображение показано на рис. 5.11b. Количество пикселей в этой области – просто сумма: >> sum(blob(:)) ans = 7728 Координаты всех ненулевых (объектных) пикселей являются соответствующими элементами: >> [v,u] = f ind(blob); где u и v являются векторами размера: Эти значения можно получить проще, используя функцию ibbox Toolbox. >> about(u) u [double] : 7728x1 (61.8 kB) Границы области равны: >> umin = min(u) umin = 443 >> umax = max(u) umax = 581 >> vmin = min(v) vmin = 125 >> vmax = max(v) vmax = 235 Эти границы определяют прямоугольник, который мы можем наложить на изображение >> plot_box(umin, vmin, umax, vmax, 'g') a v (пиксели) v (пиксели) 272 Глава 5 · Извлечение признаков изображения u (пиксели) b Рис. 5.11. a) Изображение акулы; b) область 2 с ограничивающей рамкой (зеленая) u (пиксели) как показано на рис. 5.11b. Ограничивающая рамка плотно прилегает к блобу, и ее центр можно считать центром блоба. Однако ограничивающая рамка не совмещена с блобом, т. е. ее стороны не параллельны сторонам блоба. Это означает, что при вращении блоба размер и форма ограничивающей рамки изменятся, даже если размер и форма блоба останутся прежними. 5.1.3.2 Моменты Моменты – это богатый и недорогой в вычислительном отношении класс характеристик изображения, которые могут описывать размер и местоположение области, а также ее форму. Момент изображения I является скаляром (5.1) где (p + q) – порядок момента. Нулевой момент p = q = 0 вычисляется из выражения (5.2) а для бинарного изображения, где фоновые пиксели равны нулю, это просто количество ненулевых (белых) пикселей – площадь области. Моменты рассчитываются с по­мощью функции mpq Toolbox. Для одиночной акулы из нашего примера нулевой момент равен: >> m00 = mpq(blob, 0, 0) m00 = 7728 что является площадью области в пикселях. Получение признаков из области 273 Моментам можно дать физическую интерпретацию, рассмат­ ривая функцию изображения как распределение массы. Представьте, что область представляет собой тонкую пластину, где каждый пиксель имеет одну единицу площади и одну единицу массы. Общая масса области равна m00, а центр масс (центроид) области равен: (5.3) где m10 и m01 – моменты первого порядка. Для нашего примера центроид целевой области имеет координаты: >> uc = mpq(blob, 1, 0) / m00 uc = 503.4981 >> vc = mpq(blob, 0, 1) / m00 vc = 184.7285 Мы можем отобразить его >> hold on; plot(uc, vc, 'gx', uc, vc, 'go'); как показано на рис. 5.11b. Центральные моменты µpq вычисляются относительно цент­ роида (5.4) и инвариантны к положению области. Они связаны с моментами mpq соотношением (5.5) и вычисляются функцией upq Toolbox. Снова воспользуемся аналогией с тонкой пластиной. Инерция области относительно осей, параллельных осям u и v и пересекающихся в центре тяжести области, задается симметричной матрицей (5.6) 274 Глава 5 · Извлечение признаков изображения Центральные вторичные моменты µ20, µ02 – это моменты инерции, µ11 – произведение инерции. Произведение инерции отлично от нуля, если форма несимметрична относительно осей области. Эквивалентный эллипс – это эллипс, который имеет ту же мат­рицу инерции, что и область. Для нашего примера: >> u20 = upq(blob, 2, 0); u02 = upq(blob, 0, 2); u11 = upq(blob, 1, 1); >> J = [ u20 u11; u11 u02] J = 1.0e+06 * 7.8299 -2.9169 -2.9169 4.7328 и мы можем наложить эквивалентный эллипс на область: >> plot_ellipse(4*J/m00, [uc, vc], 'b'); a Рис. 5.12. Изображение акулы: а) эквивалентный эллипс (синий), центроид и ограничительная рамка (зеленый) для области 2 целевого изображения; b) увеличенный вид v (пиксели) v (пиксели) Результат показан на рис. 5.12. u (пиксели) b u (пиксели) Собственные значения и собственные векторы J связаны с радиусами эллипса и ориентацией его большой и малой осей (см. раздел C.1.4). Для этого примера собственные значения >> lambda = eig(J) lambda = 1.0e+06 * 2.9788 9.5838 являются главными моментами области. Максимальный и минимальный радиусы эквивалентного эллипса равны: (5.7) Получение признаков из области 275 MATLAB возвра- соответственно, где λ2 ≥ λ1. В MATLAB это выглядит так : щает собственные значения в порядке >> a = 2 * sqrt(lambda(2) / m00) возрастания: λ1, a = затем λ2. 70.4313 >> b = 2 * sqrt(lambda(1) / m00) b = 39.2663 в единицах пикселей. Эти длины характерны для этой конкретной формы и инвариантны к вращению. Соотношение сторон региона >> b/a ans = 0.5575 это скаляр, приближенно характеризующий форму и инвариантный к масштабу и вращению. Собственные векторы J – это главные оси эллипса, т. е. направления его большой и малой оси. Большая или главная ось – это собственный вектор υ, соответствующий максимальному собственному значению. Для нашего примера это >> [x,lambda] = eig(J); >> x x = -0.5153 -0.8570 -0.8570 0.5153 И поскольку MATLAB возвращает собственные значения в порядке возрастания, v всегда является последним столбцом возвращаемой матрицы собственных векторов: >> v = x(:,end); Угол этого вектора относительно горизонтальной оси равен: а для нашего примера это >> atand( v(2)/v(1) ) Согласно рис. C.2b, ans = угол увеличивается -31.0185 по часовой стрелке от горизонтали, поскольку ось y градусов, что указывает на то, что большая ось эквивалентного изображения эллипса находится примерно на 30° выше горизонтали . направлена вниз, Подведем краткий итог. Мы создали изображение, содера ось z направлена жащее пространственно непрерывный набор пикселей, соотвнутрь страницы. 276 Глава 5 · Извлечение признаков изображения ветствующих одному из объектов в сцене, который мы выделили из исходного цветного изображения. Мы определили его площадь, построили обрамляющий прямоугольник, нашли его положение (местоположение его центра тяжести), его ориентацию и его форму (соотношение сторон). Эквивалентный эллипс является грубым приближением формы области, зато он инвариантен к изменениям положения, ориентации и масштаба. Инвариантность различных дескрипторов блобов к движению камеры представлена в табл. 5.1. Таблица 5.1. Признаки области и их инвариантность к движению камеры: перемещение, вращение вокруг центра тяжести объекта и масштабирование Площадь Центроид Ориентация θ Отношение сторон Округлость Моменты 5.1.3.3 Перемещение ü × ü ü ü ü Вращение ü ü × ü ü ü Масштабирование × ü ü ü ü ü Признаки блобов Toolbox обеспечивает более простой способ выполнения функций, описанных выше: >> f = imoments(blob) f = area=7728, cent=(503.5,184.7), theta=-0.54, b/a=0.558 который возвращает объект RegionFeature, содержащий множество признаков, описывающих область, включая ее площадь, центроид, ориентацию и соотношение сторон – отношение ее минимального радиуса к максимальному. Эти значения доступны как свойства объекта, например >> f.uc ans = 503.4981 >> f.theta ans = -0.5414 >> f.aspect ans = 0.5575 наряду с моментами нулевого и первого порядка и центральными моментами второго порядка: Получение признаков из области 277 >> f.moments.m00 ans = 7728 >> f.moments.u11 ans = -2.9169e+06 Toolbox предоставляет высокоуровневую функцию для вычисления признаков для каждой области изображения: >> fv = iblobs(targets_binary) fv = (1) area=14899, cent=(298.0,181.0), theta=1.48, b/a=0.702, ⮠ color=1, label=1, touch=0, parent=4 (2) area=7728, cent=(503.5,184.7), theta=-0.54, b/a=0.558, ⮠ color=1, label=2, touch=0, parent=4 (3) area=7746, cent=(84.2,160.7), theta=0.50, b/a=0.558, ⮠ color=1, label=3, touch=0, parent=4 (4) area=258946, cent=(306.7,252.9), theta=0.05, b/a=0.831, ⮠ color=0, label=4, touch=1, parent=0 (5) area=18814, cent=(246.8,426.9), theta=-0.02, b/a=0.559, ⮠ color=1, label=5, touch=0, parent=4 которая возвращает вектор fv объектов RegionFeature. Метод отображения показывает сводку свойств области, а число в скобках указывает индекс внутри вектора. Каждый объект RegionFeature В этом расчете содержит площадь, ограничивающую рамку, центроид, испредполагается, что пиксели имеют ходные и центральные моменты и эквивалентные параметры квадратную форму, эллипса, возвращаемые функцией imoments, а также дополнии это почти всегда так для цифровых тельные свойства, такие как класс пикселей в области, метка камер. Если нет, то области, метка родительской области и касается ли блоб края в iblobs должна изображения . Мы можем сказать, что область 4 является фобыть передана опция 'aspect', ном, поскольку она большая, содержит пиксели с нулевым знаопределяющая чением и касается края изображения. неединичное соНекоторые примеры свойств этого класса: отношение сторон пикселя (высоту пикселя к его >> fv(2).umin ширине). ans = 443 >> fv(3).class ans = 1 >> fv(3).parent ans = 4 >> fv(3).umin ans = 24 >> fv(3).aspect ans = 0.5580 278 Глава 5 · Извлечение признаков изображения Класс RegionFeature также имеет методы построения графиков, такие как >> fv(2). plot_box('g') который прорисовывает ограничивающую рамку объекта fv(2) зеленым цветом на текущем графике. К другим методам построения графиков относятся plot_centroid и plot_ellipse. Все методы добавляются к текущему графику и могут работать с одним объектом или вектором объектов. Например, команда >> fv.plot_box('r:') отмечает красными точками ограничивающую рамку для всех блобов в fv. Свойство children является обратным отображением свойства parent. Это список индексов в векторе признаков объектов RegionFeature, которые являются дочерними элементами этого признака. Например, фоновый блоб fv(4) имеет в качестве дочерних элементов >> fv(4).children ans = 1 2 3 5 блобы fv(1), fv(2), fv(3) и fv(5). Важно отметить, что функция iblobs может выполнять фильтрацию. Работая с изображениями помидоров, мы можем использовать известный минимальный и максимальный размер помидора, чтобы установить границы возможной области: >> fv = iblobs(tomatoes_binary, 'area', [1000, 5000]) fv = (1) area=1529, cent=(132.6,132.9), theta=-0.36, b/a=0.866, ⮠ color=1, label=2, touch=0, parent=1 (2) area=3319, cent=(95.5,210.9), theta=-0.33, b/a=0.886, ⮠ color=1, label=4, touch=1, parent=0 Этот код возвращает только блобы площадью от 1000 до 5000 пикселей. К другим параметрам фильтра относятся соотношение сторон и касание краев, а более подробная информация представлена в онлайн-документации. Для изображения помидора мы могли бы принять только блобы, которые не касаются края: >> fv = iblobs(tomatoes_binary, 'touch', 0) fv = (1) area=1529, cent=(132.6,132.9), theta=-0.36, b/a=0.866, ⮠ color=1, label=2, touch=0, parent=1 Правила фильтрации также могут быть каскадными, на­ пример: Получение признаков из области 279 >> fv = iblobs(tomatoes_binary, 'area', [1000, 5000], 'touch',0, ⮠ 'class', 1) fv = (1) area=1529, cent=(132.6,132.9), theta=-0.36, b/a=0.866, ⮠ color=1, label=2, touch=0, parent=1 Блоб должен соответствовать всем правилам, чтобы пройти каскадный фильтр. 5.1.3.4 Информация о форме из моментов Чтобы распознавать определенные объекты, нам нужны показатели формы, которые инвариантны к вращению и масштабу изображения и обеспечивают больше деталей, чем простое соотношение сторон. В случае плоских объектов, фронтопараллельных камере, можно использовать комплексные отношения моментов для формирования вектора инвариантов и применять его для распознавания таких объектов независимо от положения, ориентации и масштаба. Например, изображение на рис. 5.11а имеет три области одинаковой формы и одну отличающуюся: >> [fv,L] = iblobs(sharks, 'class', 1); >> fv = (1) area=14899, cent=(298.0,181.0), theta=1.48, b/a=0.702, ⮠ color=1, label=1, touch=0, parent=4 (2) area=7728, cent=(503.5,184.7), theta=-0.54, b/a=0.558, ⮠ color=1, label=2, touch=0, parent=4 (3) area=7746, cent=(84.2,160.7), theta=0.50, b/a=0.558, ⮠ color=1, label=3, touch=0, parent=4 (4) area=18814, cent=(246.8,426.9), theta=-0.02, b/a=0.559, ⮠ color=1, label=5, touch=0, parent=4 И из параметра соотношения сторон b/a мы видим, что блоб 1 отличается от блобов 2, 3 и 4. Второй выходной аргумент – это матрица меток, и инварианты моментов для четырех белых блобов можно вычислить с по­мощью кода: >> for i=1:4 H(i,:) = humoments(L == fv(i).label); end >> H H = 0.4544 0.0238 0.0006 0.0000 0.2104 0.0122 0.0020 0.0006 На практике дискретный 0.2101 0.0122 0.0020 0.0006 характер данных 0.2102 0.0121 0.0020 0.0006 0.0000 0.0000 0.0000 0.0000 -0.0000 0.0001 0.0001 0.0001 -0.0000 0.0000 0.0000 0.0000 пикселей означает, что инвариантность Результат указывает на сходство блобов 2, 3 и 4, несмотря на будет только приблизительной. их различное положение, ориентацию и масштаб . Он тоже 280 Глава 5 · Извлечение признаков изображения указывает на отличие формы блоба 1. Этот дескриптор формы можно рассматривать как точку в семимерном пространстве, а сходство с другими формами может быть определено через евклидово расстояние в пространстве дескрипторов. 5.1.3.5 Информация о форме из периметра Форма области кратко описывается ее границей или пикселями периметра, иногда называемыми краями. На рис. 5.13 показаны три распространенных способа представления перимет­ра области, каждый из которых дает немного отличающуюся оценку длины периметра. Цепной код (chain code) – это список самых удаленных пикселей области, центры которых связаны короткими отрезками. В цепном коде с четырьмя соседями последовательные пиксели должны быть смежными, а сегменты периметра имеют ориентацию k ´ 90°, где k ∈ {0 ⋯ 3}. В цепном коде с восемью соседями или цепном коде Фримена сегменты периметра имеют ориентацию k ´ 45 °, где k ∈ {0 ⋯ 7}. Код зазоров (crack code) располагает сегменты в зазорах между пикселями на краю области и пикселями вне области. Они имеют ориентацию k ´ 90 °, где k ∈ {0 ⋯ 3}. Периметр может быть закодирован как список координат пикселей (ui, vi) или очень компактно как битовая строка, использующая всего 2 или 3 бита для представления k для каждого сегмента. Эти различные представления эквивалентны, и любое представление может быть преобразовано в другое. Обратите внимание, что для цепных кодов граница проходит по пути, который в среднем находится на половине пикселя внутри истинной границы, и поэтому длина периметра занижается. Ошибка наиболее значительна для небольших областей. a b c Рис. 5.13. Граничные представления с пикселями области показаны серым цветом, сегменты периметра – синим, а центр граничных пикселей отмечен красной точкой: a) цепной код с четырьмя направлениями; b) цепной код Фримена с восемью направлениями; c) код зазоров. Длина периметра для этого примера составляет, соответственно, 14, 12.2 и 18 пикселей Получение признаков из области 281 Чтобы включить дополнительное вычисление для отслеживания границы объектов с использованием цепного кода с восемью соседями, нужно указать параметр 'boundary': >> fv = iblobs(sharks, 'boundary', 'class', 1); >> fv(1) ans = (1) area=14899, cent=(298.0,181.0), theta=1.48, b/a=0.702, ⮠ class=1, label=1, touch=0, parent=4, perim=1236.4, circ=0.136 И мы видим, что теперь отображаются два дополнительных параметра: perim и circ, которые представляют собой длину периметра и окружность соответственно. Граница представляет собой список граничных точек, представленных в виде матрицы с одним столбцом на каждую граничную точку. В данном случае существуют >> about(fv(1).edge) [double] : 2x1085 (17.4 kB) 1085 краевых точек, и для примера можно посмотреть первые пять точек границы: >> fv(1).edge(:,1:5) ans = 285 284 283 282 71 72 72 72 281 72 Инварианты моментов. Нормированные моменты (5.8) инвариантны к перемещению и масштабированию и вычисляются из центральных моментов с по­мощью функции Toolbox npq. Моменты третьего порядка позволяют создавать параметры, которые инвариантны к переносу, масштабу и ориентации внут­ри плоскости. Один из таких наборов моментов определяется формулой Ху (1962) φ1 = η20 + η02; φ2 = (η20 – η02)2 + 4η211; φ3 = (η30 – 3η12)2 + (3η21 – η03)2; φ4 = (η30 + η12)2 + (η21 + η03)2; φ5 = (η30 – 3η12)(η30 + η12)[(η30 + η12)2 – 3(η21 + η03)2] + (3η21 – η03)(η21 + η03)[3(η30 + η12)2 – (η21 + η03)2]; φ6 = (η20 – η02)[(η30 + η12)2 – (η21 + η03)2] + 4η11(η30 + η12)(η21 + η03); φ7 = (3η21 – η03)(η30 + η12)[(η30 + η12)2 – 3(η21 + η03)2] + (3η12 – η30)(η21 + η03)[3(η30 + η12)2 – (η21 + η03)2] и вычисляется функцией humoments Toolbox. 282 Глава 5 · Извлечение признаков изображения Отображаемая длина периметра 1236.4 была подвергнута эвристической коррекции, чтобы компенсировать недооценку из-за цепного кодирования. Граница может быть наложена на текущий график с по­ мощью метода plot_boundary >> fv(1).plot_boundary('r') В данном случае она показана красной линией. Для вектора признаков также можно вызывать методы построения графика: >> idisp(sharks) >> fv.plot_boundary('r') >> fv.plot_centroid() v (пиксели) Результат показан на рис. 5.14. u (пиксели) Рис. 5.14. Границы (красный) и центроиды четырех блобов Круглость (circularity) – еще одна часто используемая и интуитивно понятная функция формы. Она определяется как (5.9) где p – длина периметра области. Круглость имеет максимальное значение ρ = 1 для круга, ρ = π/4 для квадрата и ноль для бесконечно длинной линии. Круглость также инвариантна к песлучае небольших ремещению, вращению и масштабированию. Обратите внима- Вблобов ступенчатые ние, что в результатах iblobs, показанных выше, показатель края, возникающие круглости одинаков для блобов 2, 3 и 4 и намного ниже для бло- из-за пикселизации, привести ба 1 из-за того, что он представляет собой длинную линию . могут к значительной Каждый объект имеет одну внешнюю границу, которая мо- ошибке вычисления жет включать часть границы изображения, если объект каса- круглости. Получение признаков из области 283 ется границы. Объект с отверстиями имеет одну внутреннюю границу для каждого отверстия, но Toolbox возвращает только внешнюю границу – внутренние границы можно найти как внешние границы отверстий, которые являются дочерними областями. Поскольку внешняя граница содержит всю необходимую информацию о форме области, можно, предполагая, что область не имеет отверстий, вычислить моменты от границы с по­мощью функций mpq_poly, upq_poly и npq_poly. Один из способов анализа богатой информации о форме, закодированной в периметре, состоит в том, чтобы вычислить расстояние и угол до каждой точки периметра по отношению к центроиду объекта – этот показатель вычисляется методом boundary: >> [r,th] = fv(2).boundary; >> plot([r th]) Результат показан на рис. 5.15а. Показатели вычисляются для 400 точек (по умолчанию), равномерно распределенных по всему периметру объекта. Сигнатуры радиуса и угла описывают форму объекта. Сигнатура угла инвариантна к масштабу объекта, в то время как амплитуда сигнатуры радиуса зависит от размера объекта. Сигнатуры радиуса всех четырех блобов можно сравнить с по­мощью следующего кода: >> hold on >> for f=fv [r,t] = f.boundary(); plot(r/sum(r)); Можно было бы выполнить нормалиend а Индекс периметра Нормализованный радиус Угол (радианы) Радиус (пиксели) зацию по максимальному значению, Результат показан на рис. 5.15b. Он нормализован по сумме, но нормализация по сумме более чтобы убрать эффект масштаба объекта . Сигнатуры являютустойчива к шуму. ся функцией нормализованного расстояния по периметру. Все b Индекс периметра Рис. 5.15. Сопоставление сигнатур радиуса: a) радиус и угловая сигнатура для блоба 2 (верхняя левая акула на рис. 5.14), b) нормализованные сигнатуры радиусов для всех блобов (буква S показана пунктиром) 284 Глава 5 · Извлечение признаков изображения они начинаются с самого верхнего левого пикселя на границе объекта. Различные объекты одной и той же формы имеют одинаковые сигнатуры, которые могут быть сдвинуты по горизонтали. К тому же сигнатуры закольцованы – первая и последняя точки в горизонтальном направлении соседствуют. Чтобы сравнить профиль формы объектов, нам нужно сравнить сигнатуры при всех возможных взаимных сдвигах сигнатур по горизонтали. Сигнатуры радиуса всех четырех блобов >> b = fv.boundary представляют собой матрицу 400´4 с сигнатурами радиуса в виде столбцов. Чтобы сравнить сигнатуру блоба 2 со всеми сигнатурами, можно применить код: >> RegionFeature.boundmatch(b(:,2), b) ans = 0.6494 1.0000 0.9854 0.9927 и результат указывает на то, что форма блоба 2 точно соответствует самой себе и форме блобов 3 и 4, но не блоба 1. Статический метод boundmatch вычисляет одномерную нормализованную взаимную корреляцию (см. табл. 4) для каждого возможного вращения одной сигнатуры по отношению к другой и возвращает наибольшее значение. Существует множество вариантов описанного подхода. К сигнатуре можно применить преобразование Фурье и более кратко описать ее с по­мощью нескольких коэффициентов Фурье­. Можно вычислить кривизну границы и выделить углы или разбить границу на прямые линии и дуги. 5.1.3.6 Распознавание символов Особенно важным классом объектов являются символы. Наш мир наполнен информативным текстом в виде знаков и надписей, которые предоставляют информацию о названиях мест и направлениях движения. Мы обрабатываем большую часть визуальных символов бессознательно, но этот богатый источник информации в значительной степени недоступен для роботов. Если у вас установлен пакет Computer Vision System Toolbox™, вы можете воспользоваться встроенной функцией оптического распознавания символов. Вернемся к изображению туристического указателя, которое мы использовали ранее, и применим OCR к значащей области, указанной как (u, v, w, h), где (u, v) – координаты верхнего левого края области: >> castle = iread('castle.png'); >> words = ocr(castle, [420 300 580 420]); Получение признаков из области 285 Функция возвращает структуру. Она распознала следующие слова: >> words.Text ans = Tourist information Castle Можно узнать ее уверенность в этих словах: >> words.WordConf idences' ans = 0.8868 0.7884 0.8588 Мы можем выделить расположение слов на исходном изображении с по­мощью команды: >> plot_box('matlab', words.WordBoundingBoxes, 'y') Рис. 5.16. Оптическое распознавание символов. Ограничивающие рамки обнаруженных слов показаны желтым цветом. Заданная вручную рабочая область, в которой следует искать текст, отображается в виде красной пунктирной рамки 5.1.4 v (пиксели) Результат показан на рис. 5.16. Эта функция требует разумной оценки области, в которой должен быть найден текст. u (пиксели) Промежуточный итог Мы обсудили, как преобразовать входное изображение – в градациях серого или цветное – в краткие описания областей внутри сцены. Характерные признаки области зависят от природы и назначения объекта. Для робота-сборщика помидоров это будут красные круги, для приземляющегося БПЛА это могут быть желтые мишени на земле. Описанный процесс представляет собой классический подход к приложениям машинного зрения «от частного к общему», и его ключевые этапы таковы: 286 Глава 5 · Извлечение признаков изображения 1)классификация пикселей по критерию конкретного приложения, например краснота, желтизна или движение. Каждому пикселю присваивается класс c; 2)группировка смежных пикселей одного класса в множества, при этом каждому пикселю присваивается метка S, обозначающая множество, которому он принадлежит; 3)описание множеств посредством признаков, полученных из их пространственной протяженности, моментов, эквивалентного эллипса и границы. Эти шаги представляют собой переход от низкого уровня представления к высокому. Операции низкого уровня работают с отдельными пикселями, тогда как операции высокого уровня связаны с более абстрактными понятиями, такими как размер и форма. Алгоритмы MSER и graphcuts достаточно мощны, поскольку они объединяют шаги 1 и 2 и учитывают области пикселей и локализованные различия для создания сегментации. Важно отметить, что ни один из этих шагов не обязан быть идеальным. Возможно, на первом этапе будет несколько ложных срабатываний – отдельные пиксели, ошибочно классифицированные как объекты, которые мы можем устранить с по­мощью морфологических операций или отбросить после анализа связности на основании их небольшого размера. Первый шаг также может иметь ложноотрицательные результаты; например, зеркальное отражение и окклюзия могут привести к тому, что некоторые пиксели объекта будут неправильно отброшены как посторонние. В этом случае необходимо применить определенную эвристику, например морфологическую обработку, чтобы заполнить пробелы в блобе. Другой вариант – заново сегментировать сцену, т. е. увеличить количество областей и использовать некоторые специфичные знания предметной области для объединения смежных областей. Например, область белого зеркального отражения может быть объединена с окружающими областями для создания области, соответствующей целому помидору. В некоторых случаях можно тщательно подобрать положение камеры и освещение для получения изображения высокого качества, но роботу, работающему в изменчивом реальном мире, такая роскошь недоступна. Робот должен извлечь из изображения как можно больше полезной информации и двигаться дальше. Знание предметной области всегда является мощным инструментом. Например, если мы знаем, что сцена содержит помидоры и листья, и наблюдаем большую красную область, которая не является круглой, мы используем наше знание предметной области, чтобы сделать вывод, что это круглый плод, который частично закрыт листьями. Поэтому можно приказать роботу искать другой плод, который не закрыт, а затем пере- Признаки, извлекаемые из линий 287 меститься в новое место, откуда лучше видны остальные плоды. Сегментация объектов остается одним из самых сложных аспектов машинного зрения, и волшебного решения не существует. Разработчик должен обладать знаниями о формировании и обработке изображений, проницательностью, хорошим набором инструментов и терпением. 5.2 Признаки, извлекаемые из линий Линии – это отчетливые визуальные элементы, которые особенно распространены в искусственных средах, например края дорог, зданий и дверных проемов. В разделе 4.5.1.3 мы обсуждали, как можно использовать градиенты интенсивности изображения для нахождения краев, и в этом разделе речь пойдет о подгонке сегментов линий к таким краям. Для иллюстрации основного принципа построим очень простую сцену >> im = iread('5points.png', 'double'); a Голоса v (пиксели) ρ (пиксели) показанную на рис. 5.17а. Возьмем любую из этих точек – через нее проходит бесконечное количество прямых. Если бы точка могла голосовать за эти линии, то каждая возможная линия, проходящая через точку, получила бы один голос. Теперь рассмотрим другую точку, которая делает то же самое, голосуя за все возможные линии, проходящие через нее. Только одна линия, на которой лежат обе точки, получит голос от каждой точки – всего два голоса, – в то время как все остальные возможные линии получат либо ноль, либо один голос. b (рад) Рис. 5.17. Основы преобразования Хафа: a) пять точек, определяющих шесть линий; b) массив накопителей Хафа. По горизонтальной оси отложен угол θ ∈ �1, поэтому мы можем представить себе граф, обернутый вокруг цилиндра (левая и правая стороны соединены). Знак ρ также меняется в месте соединения, поэтому пересечения кривых на левом и правом ребрах эквивалентны u (пиксели) 288 Глава 5 · Извлечение признаков изображения Было бы удобно описывать каждую линию с по­мощью минимального количества параметров, но стандартное уравнение v = mu + c не подходит для случая вертикальных линий, где m = ∞. Вместо этого принято представлять линии с по­мощью параметрической пары (ρ, θ), показанной на рис. 5.18: (5.10) где θ ∈ [−π/2, π/2) – угол между горизонтальной осью и прямой, а ρ ∈ [−ρmin, ρmax] – расстояние по перпендикуляру между началом координат и прямой. Горизонтальная линия имеет θ = 0, а вертикальная линия имеет θ = −π/2. Таким образом, любую линию можно рассматривать как точку (θ, ρ) в двухмерном пространстве всех возможных линий. Рис. 5.18. Пример параметрической пары (θ, ρ) для двух отрезков. Положительные значения показаны синим цветом, отрицательные – красным Голосовать за бесконечное число линий, проходящих через каждую точку, нецелесообразно, поэтому мы рассматриваем конечное множество линий. Параметрическое θρ-пространство квантуется, и для подсчета голосов используется соответствующий массив A размерностью Nθ´Nρ – так называемый массив накопителей (accumulator array). Для входного изображения размера W´H: ρmax = –ρmax = max(W, H). Массив A содержит Nρ элементов, покрывающих интервал ρ ∈ [−ρmax, ρmax], и Nθ элементов, покрывающих интервал θ ∈ [−π/2, π/2). Индексами массива являются целые числа (i, j) ⊂ �2 такие, что i ∈ [1, Nθ] ↦ θ ∈ [−π/2, π/2); j ∈ [1, Nρ] ↦ ρ ∈ [−ρmax, ρmax). Признаки, извлекаемые из линий 289 Краевая точка (u, v) голосует за все линии, удовлетворяющие уравнению (5.10), представляющие собой все пары (i, j), для которых ρ = u sin θ + v cos θ (5.11) и все элементы A[i, j] инкрементируются. Для каждого i ∈ [1, Nθ] вычисляется соответствующее значение θ, затем, согласно уравнению (5.11), вычисляется ρ и отображается в соответствующее целое число j. Каждая граничная точка добавляет голос к Nθ элементам A, лежащим вдоль кривой. В итоге элементы A, набравшие наибольшее количество голосов, соответствуют доминирующим линиям сцены. Для примера рис. 5.17а результирующий массив накопителей показан на рис. 5.17b. Большая часть массива содержит ноль голосов (темно-синий), а светлые кривые представляют собой следы одиночных голосов, соответствующих каждой из пяти входных точек. Эти кривые пересекаются в точках, которые соответствуют линиям более чем с одним голосом. Мы видим четыре точки, где две кривые пересекаются, что дает нам ячейки с двумя голосами, и они соответствуют линиям, соединяющим четыре внешние точки на рис. 5.17а. Горизонтальная ось представляет собой угол θ ∈ �1, поэтому левый и правый концы соединяются, а ρ меняет знак – точки пересечения кривых в левой и правой частях массива эквивалентны. Существуют также два места, где пересекаются три кривые, что дает ячейки с тремя голосами, и они соответствуют диагональным линиям, приходящим через среднюю точку рис. 5.17а. Этот метод называется преобразованием Хафа (Hough transform). Рассмотрим более сложный пример сплошного квадрата, повернутого против часовой стрелки на 0.3 рад: >> im = testpattern('squares', 256, 256, 128); >> im = irotate(im, -0.3); Вычислим краевые точки >> edges = icanny(im); Измерение ρ которые показаны на рис. 5.19а. Преобразование Хафа вычиссимметрично от- ляется как носительно нуля, поэтому, включая ноль, >> h = Hough(edges) это нечетное количество элементов. Hough: nd=401, ntheta=400, interp=3x3, distance=1 Измерение θ имеет диапазон [−π/2, π/2), и возвращает экземпляр класса Hough. Он содержит двухмерный оно асимметрично массив накопителей голосов A, в котором nd строк и ntheta столботносительно нуля и имеет четное цов. По умолчанию θρ-плоскость квантуется на 401´400 бинов . число элементов. Массив накопителей можно рассматривать как изображение 290 Глава 5 · Извлечение признаков изображения >> h.show(); как показано на рис. 5.19b. Четыре ярких пятна соответствуют доминирующим краям входного изображения. Мы видим, что многие другие возможные линии также получили небольшое количество голосов. Следующим шагом является нахождение пиков в массиве накопителей: >> lines = h.lines() lines = theta=0.298527, rho=224.412, strength=1 theta=0.306267, rho=96.2507, strength=0.962963 theta=-1.27224, rho=-20.1637, strength=0.874074 theta=-1.28026, rho=-150.256, strength=0.837037 theta=0.282667, rho=94.1344, strength=0.785185 theta=-1.25683, rho=-146.799, strength=0.77037 theta=0.318101, rho=226.064, strength=0.718519 theta=0.278998, rho=222.699, strength=0.703704 theta=-1.25286, rho=-17.337, strength=0.666667 theta=0.325784, rho=97.7635, strength=0.562963 theta=-1.29514, rho=-23.7157, strength=0.503704 c Голоса ρ (пиксели) b Голоса (рад) (рад) v (пиксели) v (пиксели) u (пиксели) ρ (пиксели) a Рис. 5.19. Преобразование Хафа для повернутого квадрата: a) изображение края; b) накопитель Хафа; c) крупный план накопителя Хафа; d) искомые линии, наложенные на исходное изображение d u (пиксели) Признаки, извлекаемые из линий 291 Этот код возвращает вектор объектов LineFeature, соответствующих линиям с наибольшим количеством голосов, а также количество голосов, связанных с этой линией, нормализованное по отношению к наибольшему количеству голосов. Если функция вызывается без выходных аргументов, найденные пики указываются на изображении массива накопителей. Обратите внимание, что, хотя объект имеет только четыре стороны, в массиве накопителей гораздо больше четырех пиков. Отметим также, что четвертый и шестой пики имеют довольно близкие параметры линий, и эта область накопителя более подробно показана на рис. 5.19c. Мы видим несколько ярких пятен (большое количество голосов), которые расположены близко друг к другу, – это последствие дискретизации. Упомянутая ранее концепция масштаба пиков применима и здесь, поэтому снова применим нелокальное подавление максимумов, чтобы устранить меньшие пики в окрестностях максимумов: >> h = Hough(edges, 'suppress', 5) h = Hough: nd=401, ntheta=400, interp=3x3, distance=5 В этом случае расстояние равно пяти ячейкам накопителя – максимумы подавляют более мелкие локальные максимумы в радиусе пяти ячеек. У нас остаются всего четыре пика >> lines = h.lines() lines = theta=0.298527, rho=224.412, strength=1 theta=0.306267, rho=96.2507, strength=0.962963 theta=-1.27224, rho=-20.1637, strength=0.874074 theta=-1.28026, rho=-150.256, strength=0.837037 соответствующих краям объекта. Поскольку параметры линии дискретизированы, метод lines использует интерполяцию для уточнения местоположения пика (см. приложение H). По умолчанию интерполяция выполняется Без аргумента по окну 3´3 с центром в локальных максимумах голосов. Как отображаются только пик найден, все голоса в пределах расстояния подавлевсе пики выше ния обнуляются, чтобы исключить любые близкие максимумы, 'houghThresh'. По умолчанию и процесс повторяется для всех пиков в массиве голосования, это значение превышающих заданную долю наибольшего пика . равно 0.5, но с по­ Обнаруженные линии можно нанести на исходное изобра­ мощью пара­мет­ра жение: 'houghThresh' можно задать значение Hough. >> idisp(im); >> h.plot('b') Результат показан на рис. 5.19d. 292 Глава 5 · Извлечение признаков изображения Пример реального изображения >> im = iread('church.png', 'grey', 'double'); >> edges = icanny(im); >> h = Hough(edges, 'suppress', 10); >> lines = h.lines(); и десятка сильнейших линий >> idisp(im, 'dark'); >> lines(1:10).plot('g'); показаны на рис. 5.20. На изображении обнаружено много четких линий, при этом линии, соответствующие краям крыши и краю земли у подножия здания, определены верно. Однако большинство вертикальных линий не соответствует линиям на изображении – это всего лишь следствие наличия разрозненных участков с высоким градиентом, которые голосуют за линию, проходящую через них. Еще одну меру важности края можно найти, спроецировав линию на изображение края и подсчитав максимальное количество смежных пикселей края, которые лежат вдоль нее: >> lines = lines.seglength(edges); Метод возвращает вектор объектов LineFeature, аналогичный вектору, возвращаемому методом lines, но со свойством length, которому присвоено значение максимальной длины краевого сегмента: >> lines(1) ans = theta=0.0237776, rho=791.008, strength=1, length=24 в данном случае 24 пикселя. Краевой сегмент определяется как почти непрерывная группа краевых пикселей без промежутка более пяти (по умолчанию) пикселей. Затем мы можем выбрать все пики Хафа, соответствующие сегментам длиной более 80 пикселей >> k = f ind( lines.length > 80); и выделить эти строки синим цветом >> lines(k).plot('b--') как показано на рис. 5.20. Мы видим, что несколько линий сходятся в точке схода перспективы справа от изображения. Рис. 5.20. Преобразование Хафа, примененное к реальному изображению. Зеленые линии соответствуют десяти самым сильным пикам голосования. Наложенные синие пунктиры – это линии с длиной краевого сегмента не менее 80 пикселей. Три линии соответствуют обоим критериям 5.2.1 v (пиксели) Признаки, извлекаемые из линий 293 u (пиксели) Промежуточный итог Преобразование Хафа, в принципе, элегантно, и на практике оно работает либо хорошо, либо ужасно плохо. Оно плохо работает, когда сцена содержит много текстуры или края объектов размыты. Влияние текстуры приводит к широкому, но неравномерному распределению голосов по массиву накопителей, что маскирует истинные пики. Поэтому приходится много экспериментировать с параметрами краевого детектора и пикового детектора Хафа. Функция Hough имеет множество опций, описанных в онлайндокументации. По умолчанию сила голоса, поданного каждой точкой края, является силой края в этой точке, которая подчеркивает более сильные края. Сила краев, в edgeThresh раз меньшая максимальной силы края, считается нулевой. Объект Hough также может быть создан из массива координат краев с равными голосами или из массива координат краев и вектора с соответствующей силой голосов. Преобразование Хафа вычисляет направление линии, подгоняя линии к краевым пикселям. Оно игнорирует обширную информацию о направлении края в каждом пикселе, которая обсуждалась ранее. Поэтому и результат работы алгоритма зачастую хуже, чем мог бы быть при использовании полной информации. Использование направления для каждого пикселя требует небольших дополнительных затрат, поскольку мы уже вычислили градиенты изображения, чтобы оценить величину края. 294 Глава 5 · Извлечение признаков изображения 5.3 Признаки, извлекаемые из точек Последний класс признаков, которые мы обсудим в этой главе, – это точечные признаки. Это визуально различимые точки на изображении, называемые опорными (point of interest), выступающими, ключевыми или угловыми точками. Сначала мы обсудим некоторые классические методы нахождения опорных точек, а затем рассмотрим более современные масштабно-инвариантные методы. 5.3.1 Классические детекторы углов В разделе 4.5.1.3 было сказано, что точка на линии имеет сильный градиент в направлении, нормальном к линии. Однако градиент вдоль линии низкий, т. е. пиксель будет очень похож на своих соседей по линии. Опорная точка отличается тем, что обладает высоким градиентом в ортогональных направлениях. Это может быть один пиксель, интенсивность которого значительно отличается от интенсивности всех его соседей, или это может быть буквально пиксель в углу объекта. Поскольку опорные точки существенно отличаются от их окружения, вероятность того, что они будут надежно обнаружены при разных видах одной и той же сцены, гораздо выше. Следовательно, они играют ключевую роль в многоракурсных методах, таких как стереозрение и оценка движения, которые мы обсудим в главе 7. Самым ранним детектором опорных (угловых) точек был оператор Моравека (детектор углов Моравека), выбирающий точки сцены, которые полезны для отслеживания. Он основан на интуитивном предположении, что если небольшой фрагмент изображения � должен однозначно присутствовать на другом изображении, он будет сильно отличаться от фрагмента того же размера в любом соседнем месте. Моравек определил сходство между областью с центром в (u, v) и соседней областью, смещенной на (δu, δv), как (5.12) где � – некоторая локальная область изображения, обычно квадратное окно размером W´W. Это мера сходства SSD из табл. 4.1, которую мы обсуждали ранее. Сходство оценивается N, NE, E, … W, NW для перемещений по восьми сторонам света (δu, δv) ∈ �, а ми- или i, j ∈ {–1, 0, 1}. нимальное значение является мерой значимости (5.13) Признаки, извлекаемые из точек 295 которая велика только в том случае, если все смещенные участки отличаются от исходного участка. Функция CM(·) вычисляется для каждого пикселя изображения, и опорные точки располагаются там, где высокое значение CM. Основной недостаток детектора Моравека заключается в том, что он неизотропен, поскольку исследует изменение изображения (в основном градиентное) в ограниченном числе направлений. Следовательно, детектор может давать сильное выходное значение для точки на линии, что нежелательно. Мы можем обобщить этот подход, определив сходство как взвешенную сумму квадратов различий между областью изображения и смещенной областью: где W – весовая матрица, выделяющая точки ближе к центру окна �. Указанный член можно аппроксимировать усеченным См. приложение Е. рядом Тейлора : I[u + δu, v + δv] » I [u, v] + Iu[u, v]δu + Iv [u, v]δv, где Iu и Iv – горизонтальный и вертикальный градиенты изображения соответственно. Теперь мы можем написать: Это выражение можно более компактно записать в квадратичной форме как где Если весовая матрица является ядром Гаусса W = G(σI) и мы заменяем суммирование сверткой, то 296 Глава 5 · Извлечение признаков изображения (5.14) A представляет собой симметричную матрицу 2´2, называемую тензором структуры, матрицей автокорреляции или матрицей второго момента. Она отражает структуру интенсивности локальной окрестности, а ее собственные значения обеспечивают вращательно-инвариантное описание окрестности. Элементы матрицы A вычисляют из градиентов изображения, возводят в квадрат или умножают, а затем сглаживают с использованием весовой матрицы. Последнее действие снижает шум и повышает стабильность и надежность детектора. Градиентные изображения Iu и Iv обычно рассчитывают с использованием метода производной ядра Гаусса (раздел 4.5.1.3) с параметром сглаживания σD. Опорная точка (u, v) – это такая точка, относительно которой значение s(·) велико для всех направлений вектора (δu, δv). То есть в каком бы направлении мы ни двигали окно, оно быстро становится непохожим на исходную область. Если мы рассматриваем исходное изображение I как поверхность, собственные значения A являются главной кривизной поверхности в этой В разделе 4.1.1 точке. Если оба собственных значения малы, то поверхность было сказано, что плоская, т. е. область изображения имеет приблизительно по- сжатие изображестоянную локальную интенсивность. Если одно собственное ния с потерями, такое как JPEG, значение высокое, а другое низкое, то поверхность имеет фор- удаляет высокому гребня, что указывает на ребро. Если оба собственных зна- частотные детали чения высокие, поверхность имеет острый пик, который мы из изображения, но именно такие считаем углом . детали определяДетектор Ши–Томаси (иногда называют детектором Канаде– ют угол. В идеале Томаси) рассматривает силу угла как минимальное собственное детекторы углов следует применять значение: к изображениям, CST(u, v) = min(λ1, λ2), которые не под- (5.15) вергались сжатию и распаковке. где λi – собственные значения A. Точки на изображении, для которых эта мера высока, называются «хорошими признаками для отслеживания». Детектор Харриса основан на том же Иногда в литературе упоминается как принципе, но определяет силу угла как CH(u, v) = det(A) – k tr(A). (5.16) Здесь большое значение также представляет сильный, отчетливый угол. Поскольку det(A) = λ1λ2 и tr(A) = λ1 + λ2, детектор Харриса реагирует, когда оба собственных значения велики, и элегантно избегает вычисления собственных значений A, которое требует несколько более высоких вычислительных за- детектор углов Плесси. Признаки, извлекаемые из точек 297 Вычисление соб- трат . Обычно используемое значение k равно 0.04. Еще один ственных значений вариант – детектор Нобля: для матрицы 2×2 включает решение квадратного урав(5.17) нения и, следовательно, требует операции извлечения квадратного который арифметически прост, но потенциально подвержен корня. сингулярности. Обычно сила угла вычисляется для каждого пикселя, и в результате получается изображение силы угла. Затем применяется нелокальное подавление максимумов, чтобы сохранить только те значения, которые больше, чем их непосредственные соседи. Список таких точек сортируется по убыванию значения силы угла. Затем можно применить пороговую фильтрацию, чтобы принимать только углы с силой выше определенного порога, или выше определенной доли самого сильного угла, или просто взять N самых сильных углов. Toolbox предоставляет угловой детектор Харриса, который мы продемонстрируем на реальном изображении: >> b1 = iread('building2-1.png', 'grey', 'double'); >> idisp(b1) Вычислим признаки Харриса: >> C = icorner(b1, 'nfeat', 200); 7497 corners found (0.8%), 200 corner features saved Результат представляет собой вектор объектов PointFeature. Детектор обнаружил более 7000 углов, которые были локальными максимумами изображения силы углов, и они составляли 0.8 % всех пикселей изображения. В данном случае мы запросили 200 самых сильных углов. Вектор содержит углы, отсортированные по уменьшению силы угла, и каждый объект PointFeature содержит координату угла (u, v), силу угла и дескриптор, который включает уникальные элементы тензора структуры в векторной форме (A11, A22, A12). Дескриптор можно использоДругой подход к определению кривизны изображения заключается в использовании определителя гессиана (determinant of the Hessian, DoH). Гессиан – это матрица градиентов второго порядка в точке где Iuu = ∂2I/∂u2, Ivv = ∂2I/∂v2 и Iuv = ∂2I 2/∂u∂v. Определитель det(H) имеет большую величину, когда уровень серого изменяется в двух направлениях. Однако вторые производные усиливают шум изображения даже больше, чем первые производные, и изображение должно быть предварительно сглажено. 298 Глава 5 · Извлечение признаков изображения вать как простую метку угла, чтобы помочь сопоставить соответствующие углы для видов на сцену с разных точек зрения. Углы можно накладывать на изображение в виде белых квад­ ратов >> idisp(b1, 'dark'); >> C.plot('ws'); как показано на рис. 5.21а. Параметр 'dark' для idisp уменьшает яркость изображения, чтобы сделать наложенные угловые маркеры более заметными. Крупный план фрагмента изображения показан на рис. 5.21b, и там мы видим, что элементы действительно часто расположены на углах объектов. Мы также видим, что углы склонны группироваться неравномерно, с большей плотностью в областях с высокой контраст­ ностью и текстурой, и в некоторых случаях это может стать проб­лемой. Чтобы распределить угловые точки более равномерно, можно увеличить расстояние, используемое для подавления нелокальных максимумов: u (пиксели) c b u (пиксели) v (пиксели) v (пиксели) a v (пиксели) v (пиксели) >> Cs = icorner(b1, 'nfeat', 200, 'suppress', 10); 7497 corners found (0.7%), 200 corner features saved u (пиксели) d u (пиксели) Рис. 5.21. Детектор углов Харриса применен к двум видам одного и того же здания: a) первый вид; b) увеличенный фрагмент первого вида; c) второй вид; d) увеличенный фрагмент второго вида. Обратите внимание, что довольно много обнаруженных углов связано с одними и теми же объектами мира в двух видах Признаки, извлекаемые из точек 299 указав минимальное расстояние между углами (в данном случае 10 пикселей). Мы можем применить стандартные операции и синтаксис MATLAB к векторам объектов PointFeature, например: >> length(C) ans = 200 и использовать индекс >> C(1:4) ans = (3,3), strength=2.97253e-05, ⮠ descrip=(0.00704357 0.00703274 0.00344741) (600,662), strength=2.13105e-05, ⮠ descrip=(0.00568787 0.00448007 -0.000189851) (24,277), strength=1.5516e-05, ⮠ descrip=(0.00577341 0.00361102 -0.00134506) (54,407), strength=1.53644e-05, ⮠ descrip=(0.0062428 0.00301444 0.00016217) чтобы просмотреть основные свойства признака. Мы также можем создавать выражения, такие как: >> C(1:5).strength ans = 1.0e-04 * 0.2973 0.2131 0.1552 0.1536 0.1496 >> C(1).u ans = 3 Можно нанести на график, например, координату каждого пятого объекта из первых 100 объектов: >> C(1:5:100).plot() Сила угла вычисляется для каждого пикселя и может быть выведена на печать >> [C,strength] = icorner(b1, 'nfeat', 200); 7497 corners found (0.7%), 200 corner features saved и представлена в виде изображения >> idisp(strength, 'invsigned') как показано на рис. 5.22а. Мы видим, что функция силы угла сильно положительна (синий) для угловых элементов и сильно отрицательна (красный) для линейных элементов. На рис. 5.22b дано увеличенное изображение, которое показывает, что обнаруженный угол находится на вершине пика угловатости ши- Сила угла v (пиксели) 300 Глава 5 · Извлечение признаков изображения v (пиксели) a u (пиксели) b u (пиксели) Рис. 5.22. Сила риной в несколько пикселей. Обнаруженный угол является ло- угла по Харрису: a) увеличенный кальным максимумом, но мы можем использовать окружающие фрагмент значения, чтобы оценить его местоположение с точностью до прочностей угла, субпикселя (см. приложение H). Это требует дополнительных вы- представленных в виде изображения числений, которые можно включить с по­мощью опции 'interp'. (синий – Интегральная гистограмма силы 200 обнаруженных углов положительные, показана на рис. 5.23. Самый сильный угол имеет CH » 3´10–5, красный – отрицательные); но большинство из них намного слабее, только 2 % углов превы- b) увеличенное изображение шает половину этого значения Возьмем изображение того же здания, снятое из другого места: значений силы >> b2 = iread('building2-2.png', 'grey', 'double'); угла, отображаемых в виде поверхности Посмотрим, какие углы были обнаружены: Интегральное кол-во признаков >> C2 = icorner(b2, 'nfeat', 200); 7712 corners found (0.8%), 200 corner features saved Сила угла Рис. 5.23. Интегральная гистограмма силы углов Признаки, извлекаемые из точек 301 >> idisp(b2,'dark') >> C2.plot('ws'); Результаты показаны на рис. 5.21c и d. Для многих полезных приложений роботизированного зрения, таких как отслеживание, создание мозаики и стереозрение, которые мы обсудим в главе 7, важно, чтобы угловые объекты обнаруживались в одних и тех же точках мира независимо от различий в освещении или изменений поворота и масштаба между двумя видами. Из рис. 5.21 мы видим, что многие (хотя не все) признаки действительно привязаны к одному и тому же мировому признаку в обоих представлениях. Детектор Харриса вычисляется из градиентов изображения и, следовательно, устойчив к изменениям освещения, а собственные значения структурного тензора A инвариантны к вращению. Однако детектор не инвариантен к изменениям масштаба. По мере увеличения изображения градиенты вокруг угловых точек становятся меньше – одинаковое изменение интенсивности распространяется на большее количество пикселей. Это уменьшает крутизну градиента и, следовательно, силу углов. В следующем разделе обсуждается решение этой проблемы с по­мощью угловых детекторов, не зависящих от масштаба. Для цветного изображения тензор структуры вычисляется с использованием градиентных изображений отдельных цветовых плоскостей, что немного отличается от первого преобразования изображения в шкалу серого в соответствии с уравнением (3.11). На практике результат использования цвета не совпадает с ожиданиями – для большинства сцен это на удивление мало что меняет, но требует значительных вычислительных затрат. Функция icorner получает большое количество параметров: k, размеры производной и ядра сглаживания σD и σI, абсолютный и/или относительный порог силы углов и принудительное соблюдение минимального расстояния между углами. Опции 'st' и 'noble' позволяют вычислять угловые меры по уравнению (5.15) и (5.17) соответственно. Подробности приведены в онлайн-документации. 5.3.2 У гловые детекторы в масштабируемом пространстве Угловой детектор Харриса, представленный в предыдущем разделе, очень хорошо работает на практике со статичными изображениями, но плохо реагирует на изменения масштаба. К сожалению, изменение масштаба из-за изменения расстояния от камеры до сцены или оптического приближения/отдаления является обычным явлением во многих реальных приложениях. 302 Глава 5 · Извлечение признаков изображения Мы также заметили, что детектор Харриса сильно реагирует на мелкие текстуры, такие как листья деревьев на рис. 5.21, хотя намного полезнее возможность обнаруживать признаки, связанные с крупномасштабной структурой сцены, такой как окна и балконы. Рисунок 5.24 иллюстрирует фундаментальный принцип обнаружения пространственных признаков. Сначала мы загружаем синтетическое изображение >> im = iread('scale-space.png', 'double'); которое показано на рис. 5.24а. Изображение содержит четыре квадрата разного размера: 5´5, 9´9, 17´17 и 33´33. Последовательность масштабных представлений вычисляется путем применения ядра Гаусса с увеличением σ, что приводит к тому, что области становятся все более размытыми и меньшие участки постепенно исчезают из поля зрения. На каждом шагу последовательности сглаженное по Гауссу изображение свертывается На самом деле мы вычисляем разность с ядра Лапласа (4.5), что дает сильные отрицательные отклики аппроксимации на эти яркие блобы . гауссиана и лаплаС помощью Toolbox мы вычисляем последовательность мас- сиана гауссиана, как показано на штабного пространства рис. 5.27. >> [G,L,s] = iscalespace(im, 60, 2); где входными аргументами являются количество шагов масштаба для вычисления и σ ядра Гаусса, которое должно применяться на каждом последующем шаге. Функция возвращает два трехмерных изображения, представляющих собой последовательность двухмерных изображений, где последний индекс обозначает масштаб. G – изображение im при возрастающих уровнях сглаживания, L – лапласиан этих сглаженных изображений, а s – соответствующий масштаб. Например, пятое изображение в последовательности лапласианов (LoG) отображается с по­мощью команды >> idisp(L(:,:,5), 'invsigned') и имеет масштаб >> s(5) ans = 4.0311 На рис. 5.24b–e показан лапласиан гауссиана в четырех разных точках последовательности масштабного пространства. На рис. 5.24f показана величина отклика лапласиана как функция масштаба, взятая в точках, соответствующих центру a v (пиксели) v (пиксели) Признаки, извлекаемые из точек 303 b c d u (пиксели) u (пиксели) ||LoG|| v (пиксели) e u (пиксели) v (пиксели) v (пиксели) u (пиксели) u (пиксели) f Масштаб Рис. 5.24. Пример масштабного пространства: a) синтетическое изображение I с блоками размером 5×5, 9×9, 17×17 и 33×33; b–e) нормированный лапласиан гауссиана σ2L∗G(σ)∗I для возрастающих значений масштаба, значение σ указано внизу слева. Используется синтетический цвет: красный – отрицательный, синий – положительный; f) величина лапласиана в центре каждого квадрата (обозначена знаком «+») в зависимости от σ 304 Глава 5 · Извлечение признаков изображения каждого квадрата на входном изображении. Каждая кривая имеет хорошо выраженный пик, и масштаб, связанный с пиком, пропорционален размеру области – характеристическому масштабу области. Если мы рассматриваем трехмерное изображение L как объем, то характерной точкой (признаком) масштабного пространства будет любой пиксель, являющийся трехмерным максимумом. Это элемент, который больше, чем его 26 соседей во всех трех измерениях, – его пространственные соседи в текущем масштабе и в масштабе выше и ниже. Такие точки обнаруживаются функцией iscalemax >> f = iscalemax(L, s) f = (64,64), scale=2.91548, strength=1.96449 (128,64), scale=4.06202, strength=1.72512 (128,128), scale=18.1246, strength=1.54391 (64,128), scale=8.97218, strength=1.54057 (96,128), scale=15.5081, strength=0.345028 (97,128), scale=14.7139, strength=0.34459 которая возвращает массив объектов ScalePointFeature, являющихся подклассом PointFeature. Каждый объект имеет свойства для координаты, силы и масштаба признака. Признаки расположены в порядке убывания силы, и мы видим, что четыре из них имеют значительную силу и соответствуют четырем белым объектам. Мы можем наложить обнаруженные признаки на исходное изображение. >> idisp(im) >> f(1:4).plot('g+') v (пиксели) Результат показан на рис. 5.25. u (пиксели) Рис. 5.25. Синтетическое изображение с наложенным центром признака и индикатором масштаба Признаки, извлекаемые из точек 305 Масштаб, связанный с признаком, можно легко визуализировать с по­мощью кругов, имеющих радиус, равный масштабу признака: >> f(1:4).plot_scale('r') Результат также показан на рис. 5.25. Мы видим, что обнаруженные признаки расположены в центре каждого объекта и что масштаб признака связан с размером объекта. Область внутри круга называется опорной областью (support region) объекта. Возьмем для примера реальное изображение: >> im = iread('lena.pgm', 'double'); Вычислим масштабное пространство за восемь больших шагов с σ = 8 >> [G,L] = iscalespace(im, 8, 8); которые мы можем сгладить и отобразить: >> idisp(G, 'f latten', 'wide', 'square'); >> idisp(L, 'f latten', 'wide', 'square', 'invsigned'); как показано на рис. 5.26. Слева направо мы видим восемь уровней масштаба. Изображения в гауссовой последовательности становятся все более размытыми. В лапласиане темные глаза представляют собой сильно положительные (синие) пятна при слабом размытии, а светлая шляпа становится сильно отрицательным (красным) пятном при сильном размытии. Свертка исходного изображения с ядром Гаусса с увеличениРис. 5.26. ем σ приводит к увеличению размера ядра и, следовательно, Последовательность объема вычислений на каждом шаге масштабирования. в масштабном Как вы уже знаете, свертка двух гауссианов является еще одпространстве для σ = 2; ним более широким гауссианом. Вместо свертки нашего исходвверху – гауссова ного изображения с более широкими гауссианами мы можем последовательность, многократно применять один и тот же гауссиан к предыдущему внизу – лапласиан гауссовой результату. Вы также знаете, что ядро LoG аппроксимируется v (пиксели) последовательности v (пиксели) u (пиксели) u (пиксели) 306 Глава 5 · Извлечение признаков изображения разностью двух гауссианов. Используя свойства свертки, мы можем написать: (G(σ1) – G(σ2)) ∗ I = G(σ1) ∗ I – G(σ2) ∗ I, где σ1 > σ2. Разность операторов Гаусса, примененных к изображению, эквивалентна разнице между изображениями при двух разных уровнях сглаживания. Если мы выполним сглаживание последовательным применением гауссианов, то получим последовательность изображений с нарастающим уровнем сглаживания. Таким образом, разница между шагами в последовательности является приближением к лапласиану гауссиана. На рис. 5.27 это показано в виде диаграммы. Гауссова последовательность Лапласиан гауссиана (LoG) 5.3.2.1 Рис. 5.27. Схема для расчета гауссиана и лапласиана гауссовой пространственномасштабной последовательности Получение признаков из точек в масштабном пространстве Рассмотренные выше концепции масштабного пространства лежат в основе ряда популярных детекторов признаков, которые находят характерные точки в изображении и определяют их масштаб, а также их ориентацию. Масштабно-инвариантное преобразование признаков (Scale-Invariant Feature Transform, SIFT) основано на максимумах разности гауссовой последовательности. Ускоренное робастное выделение признаков (Speeded Up Robust Feature, SURF) основано на максимумах в приближенной гессовой или гауссовой последовательности. Чтобы проиллюстрировать эти подходы, вычислим признаки по методу SURF для изображения здания, которое использовалось ранее: >> sf1 = isurf(b1, 'nfeat', 200) 2667 corners found (0.3%), 200 corner features saved sf1 = Признаки, извлекаемые из точек 307 200 features (listing suppressed) Properties: image_id theta scale u v strength descriptor который возвращает массив из 200 объектов SurfPointFeature, являющихся подклассом SurfPointFeature. Например, вот первый признак: >> sf1(1) ans = (117.587,511.978), theta=0.453513, scale=2.16257, strength=0.0244179, descrip= .. Каждый объект содержит координату признака (с точностью до субпикселя), масштаб, ориентацию и дескриптор, который представляет собой вектор из 64 элементов. Ориентация определяется доминирующим направлением кромки в опорной области. Это изображение содержит около 3000 признаков SURF, но, как мы делали ранее с угловыми признаками Харриса, мы запросили 200 самых сильных и нанесли их на график >> idisp(b1, 'dark'); >> sf1.plot_scale('g', 'clock') v (пиксели) Результат показан на рис. 5.28. Метод plot_scale рисует круг вокруг местоположения признака с радиусом, который соответствует масштабу – размеру опорной области. Опция 'clock' рисует радиальную линию, указывающую ориентацию признака SURF. Рис. 5.28. Дескрипторы SURF, показывающие опорную область (масштаб) и ориентацию в виде радиальной линии u (пиксели) Масштаб признаков широко варьируется, а гистограмма >> hist(sf1.scale, 100); показанная на рис. 5.29, указывает на наличие множества мелких признаков, связанных с мелкими деталями и текстурой изображения. Большинство признаков имеет масштаб менее Количество элементов 308 Глава 5 · Извлечение признаков изображения Масштаб Рис. 5.29. Гистограмма масштабов признаков показана с логарифмической вертикальной шкалой 25 пикселей, но некоторые превышают 40 пикселей. Функция isurf получает ряд параметров, описанных в онлайн-документации. Алгоритм SURF – это больше, чем просто масштабно-инвариантный детектор признаков, он также вычисляет очень устойчивый дескриптор. Дескриптор представляет собой вектор из 64 элементов, кодирующий градиент изображения в подобластях опорной области таким образом, который не зависит от яркости, масштаба и поворота. Это позволяет однозначно сопоставлять дескрипторы признаков с дескриптором той же точки мира на другом изображении, даже если их масштаб и ориентация сильно различаются. Разница в положении, масштабе и ориентации совпадающих объектов дает некоторое представление об относительном движении камеры между двумя кадрами. Сопоставление признаков между сценами имеет решающее значение для решения задач, которые мы рассмотрим в главе 7. 5.4 Подведение итогов В этой главе мы обсудили извлечение признаков из изображения. Вместо того чтобы рассматривать изображение как миллионы независимых значений пикселей, мы кратко описываем области внутри изображения, которые соответствуют различным объектам. Например, мы можем найти области, однородные по интенсивности или цвету, и описать их с по­мощью таких характеристик, как ограничивающая рамка, центроид, эквивалентный эллипс, соотношение сторон, округлость и форма периметра. Признаки обладают свойствами инвариантности по отношению к перемещению, вращению вокруг оптической оси и масштабу, что особенно важно для распознавания объектов. Подведение итогов 309 Прямые линии являются распространенными визуальными признаками в искусственных средах, и мы показали, как находить и описывать отчетливые прямые линии на изображении с по­мощью преобразования Хафа. Мы также показали, как находить опорные точки, которые могут надежно ассоциироваться с определенными точками в мире независимо от ракурса камеры. Это ключ к таким методам, как оценка движения камеры, стереозрение, поиск изображений, отслеживание и создание мозаики, которые мы обсудим в главе 7. Примечания к MATLAB Иерархия классов пространственных объектов, используемых в Toolbox, показана на рис. 5.30. Список функций Toolbox и эквивалентов MATLAB приведен в табл. 5.2. Последние происходят из пакетов Image Processing и Computer Vision System Toolbox, имеющих большое количество дополнительных функций. Некоторые функции поддерживают генерацию кода или работу с Simulink. Рис. 5.30. Иерархия классов пространственных объектов, используемая в Toolbox Таблица 5.2. Список функций извлечения признаков и эквивалентных функций MATLAB Image Processing Toolbox и Computer Vision System Toolbox Операция Признаки из региона анализ блобов связанность порог Оцу порог Ниблака Признаки из линии Преобразование Хафа Признаки из точки Харрис SURF SIFT RVC Toolbox MATLAB iblobs ilabel otsu niblack regionprops, bwperim bwlabel graythresh Hough hough icorner isurf isift detectHarrisFeatures detectSURFeatures 310 Глава 5 · Извлечение признаков изображения Таблица 5.2 (окончание) Операция FAST MSER BRISK a) RVC Toolbox imsera) MATLAB detectFASTFeatures detectMSERFeatures detectBRISKFeatures Нуждается в установке VLFeat. Дополнительное чтение В этой главе представлен классический восходящий подход к извлечению признаков, начиная с пикселей и продвигаясь к понятиям более высокого уровня, таким как области и линии. Принс (Prince, 2012) и Шелиски (Szeliski, 2011) предлагают хорошее введение в высокоуровневое зрение с использованием вероятностных методов, которые можно применять к таким задачам, как распознавание объектов, например распознавание лиц и поиск изображений. За последние несколько лет компьютерное зрение, особенно распознавание объектов, претерпело революцию благодаря использованию глубоких сверточных нейронных сетей. Они продемонстрировали очень высокий уровень точности в обнаружении и распознавании объектов на сложном фоне, несмотря на изменение точки зрения и освещения. Ресурсы доступны на http://deeplearning.net. Признаки региона. Сегментация изображений на основе областей и анализ блобов являются классическими методами, описанными во многих книгах и статьях. Гонсалес и Вудс (Gonzalez and Woods, 2008) и Шелиски (Szeliski, 2011) подробно рассматривают методы, представленные в этой главе, в частности пороговые и граничные дескрипторы. Алгоритм Оцу для определения порога был представлен в статье (Otsu, 1975), а алгоритм Ниблэка для адаптивного определения порога был представлен в статье (Niblack, 1985). Книга Никсона и Агуадо (Nixon and Aguado, 2012) расширяет материал, рассмотренный в этой главе, и знакомит с такими методами, как деформируемые шаблоны и дескрипторы границ. Цепной код Фримена был впервые описан в работе (Freeman, 1974). Флюссер (Flusser, 2000) показал, что семь моментов, предложенных Ху (Hu, 1962), на самом деле не являются независимыми, поскольку φ3 = (φ52 + φ72)/φ43. В дополнение к однородности областей, основанной на интенсивности и цвете, также возможно охарактеризовать текстуру областей – пространственный образец интенсивности пикселей, статистику которого можно описать (Gonzalez and Woods, 2008). Затем области можно сегментировать в соответствии с текстурой – например, выделить гладкую дорогу или текстурированную траву. Подведение итогов 311 Кластеризация данных – важная тема машинного обучения (Bishop, 2006). В этой главе мы использовали простую реализацию k-средних, которая далека от современной методики кластеризации и требует, чтобы количество кластеров было известно заранее. Более продвинутые алгоритмы кластеризации являются иерархическими и используют для ускорения поиска соседних точек структуры данных, такие как kd-деревья. Инициализация центров кластера также имеет решающее значение для производительности. Шелиски (Szeliski, 2011) представляет более общие методы кластеризации, а также методы компьютерного зрения на основе графов. Алгоритм рассечения графов для сегментации был описан Фельзеншвальбом и Хуттенлокером (Felzenszwalb and Huttenlocher, 2004), а реализация графических разрезов Toolbox основана на коде Педро Фельзеншвальба и доступна по адресу http:// cs.brown.edu/~pff/segment/. Алгоритм максимально робастной экстремальной области (MSER) описан Матасом и соавт. (Matas et al., 2004), а реализация Toolbox основана на работе Андреа Ведальди и Брайана Фулкерсона, которая доступна по адресу http://vlfeat.org. Набор данных Berkeley Segmentation Dataset по адресу http://www.eecs.berkeley.edu/Research/Projects/CS/ vision/bsds содержит множество сложных изображений реального мира, каждое из которых имеет несколько сегментаций, выполненных человеком. Ранняя работа по использованию распознавания текста для робототехники описана Познером и соавт. (Posner et al., 2010), а Лэм и соавт. (Lam et al., 2015) описывают применение OCR для анализа планов этажей зданий для навигации роботов. Основная проблема OCR реальных сцен состоит в том, чтобы определить, какие части сцены содержат текст и должны быть переданы в механизм OCR. Мощным детектором текста является преобразование ширины штриха, описанное Ли и соавт. (Li et al., 2014). Функция MATLAB ocr основана на движке OCR Tesseract с открытым исходным кодом, который доступен по адресу https://github.com/tesseract-ocr и описан Смитом (Smith, 2007). Признаки линии. Преобразование Хафа было впервые описано в патенте США 3069654 «Метод и средства распознавания сложных образов» Пола Хафа, а его история обсуждается в статье Харта (Hart, 2009). Первоначальное приложение было предназначено для анализа фотографий пузырьковой камеры и использовало проблематичную параметризацию линий на основе пересечения и наклона. Известная в настоящее время параметризация (θ, ρ) была впервые описана Дудой и Хартом (Duda and Hart, 1972) как «обобщенное преобразование Хафа». Статья доступна по адресу http://www.ai.sri.com/pubs/files/tn036-duda71. 312 Глава 5 · Извлечение признаков изображения pdf. Преобразование Хафа описано в учебниках таких авторов, как Шелиски (Szeliski, 2011) и Гонсалес и Вудс (Gonzalez and Woods, 2008). В последнем есть хорошее обсуждение подгонки формы в целом и вычислений, которые являются устойчивыми по отношению к точкам выбросов. Базовое преобразование Хафа было расширено во многих аспектах, и по нему имеется обширная литература. Полезный обзор преобразования и его вариантов представлен в работе Ливерса (Leavers, 1993). Преобразование может быть распространено на другие формы (Ballard, 1981), такие как круги фиксированного размера, где голоса отдаются за координаты центра круга. Для кругов неизвестного размера требуется трехмерный массив голосования с учетом центра и радиуса круга. Признаки точки. Литература по операторам опорных точек восходит к ранним работам Моравека (Moravec, 1980) и Фёрстнера (Förstner and Gülch, 1987; Förstner, 1994). Угловой детектор Харриса (Harris and Stephens, 1988) стал очень популярным в роботизированном зрении в конце 1980-х гг., поскольку он мог работать в режиме реального времени на компьютерах того времени, а его признаки были достаточно стабильными от кадра к кадру (Tissainayagam and Suter, 2004). Детектор Нобля описан в (Noble, 1988). Исследования Ши, Томаси, Лукаса и Канаде (Shi and Tomasi, 1994; Tomasi and Kanade, 1991) привели к созданию детектора Ши–Томаси и трекера Канаде–Лукаса– Томаси (KLT). Хорошими обзорами относительной производительности многих детекторов углов являются работы Дерише и Жиродо (Deriche and Giraudon, 1993) и Миколайчика и Шмида (Mikolajczyk and Schmid, 2004). Концепции масштабного пространства давно известны в компьютерном зрении. Кёндеринк (Koenderink, 1984), Линдеберг (Lindeberg, 1993) и Тер-Хаар Ромени (ter Haar Romeny, 1996) написали доступные введения в тему. Понятие масштабного пространства применялось к классическим угловым детекторам для создания гибридных детекторов, такие как масштабный детектор Харриса (Mikolajczyk and Schmid, 2004). Важным достижением в области детекторов пространственных признаков стало масштабно-инвариантное преобразование признаков (SIFT), представленное в начале 2000-х гг. Лоу (Lowe, 2004) и значительно улучшившее работу таких приложений, как отслеживание и распознавание объектов. Необычно и, возможно, к сожалению, алгоритм запатентован и не мог быть использован в этой книге. Природа не терпит пустоты, и вскоре была разработана эффективная альтернатива (SURF) (Bay et al. 2008). Функция isurf в Toolbox представляет собой реализацию MATLAB Дирка-Яна Кроона и доступна по адресу http://www.mathworks. Подведение итогов 313 com/matlabcentral/fileexchange/28300-opensurf-include-imagewarp, она, в свою очередь, основана на реализациях OpenSurf в C++ и C# Криса Эванса, которые сейчас размещены на https:// github.com/amarburg. Также были разработаны параллельные реализации на базе GPU. Детекторы SIFT и SURF дают разные результаты, и они сравниваются в работе Бауэра и соавт. (Bauer et al., 2007). Функция детектора SIFT Toolbox isift возвращает вектор признаков класса SiftPointFeature и представляет собой оболочку для реализации MATLAB с http://www.vlfeat.org, которую вам нужно загрузить и скомпилировать. Кроме вышеупомянутых, существуют и продолжают появляться многие другие детекторы опорных точек и признаков. Алгоритм FAST Ростена и соавт. (Rosten et al., 2010) имеет очень низкие требования к вычислительным ресурсам и высокую воспроизводимость, а программные ресурсы C и MATLAB доступны по адресу http://www.edwardrosten.com/work/fast.html. CenSurE от Агравала и соавт. (Agrawal et al. 2008) предлагает более высокую производительность, чем SIFT, SURF и FAST, при меньших затратах. Алгоритм BRIEF, который предложили Калондер и соавт. (Calonder et al., 2010), не является детектором признаков, но представляет собой недорогой и компактный дескриптор признаков, требующий всего 256 бит вместо 64 чисел с плавающей запятой на признак. К другим дескрипторам признаков относятся гистограмма ориентированных градиентов (histogram of oriented gradients, HOG), ориентированный FAST и повернутый BRIEF (ORB), бинарная робастная инвариантно масштабируемая ключевая точка (binary robust invariant scaleable keypoint, BRISK), быстрый алгоритм ключевой точки сетчатки (fast retina keypoint, FREAK), агрегированные характеристики канала (aggregate channel features, ACF), вектор локально агрегированных дескрипторов (vector of locally aggregated descriptors, VLAD), случайные «листы папоротника» и многие-многие другие. Локальные признаки имеют много преимуществ и довольно стабильны от кадра к кадру, но в сценариях наружного применения расположение признаков и их дескрипторы значительно различаются в зависимости от условий освещения (например, Valgren and Lilienthal, 2010). Очевидные примеры – ночь и день, но даже в течение нескольких часов дескрипторы значительно меняются. С течением времени внешний вид сцены может резко меняться: деревья с листьями или без них; земля, покрытая травой или снегом, влажная или сухая. Поиск способов надежного распознавания элементов сцены, несмотря на их меняющийся внешний вид, является областью исследований надежного распознавания, которая представлена в статье Лоури и соавт. (Lowry et al., 2015). 314 Глава 5 · Извлечение признаков изображения Упражнения 1. Классификация областей в градациях серого. a. Поэкспериментируйте со значениями параметра ithresh на изображениях castle.png и castle2.png. b. Поэкспериментируйте с алгоритмом Ниблэка и измените значение k и размер окна. c. Примените функцию iblobs к выходным данным сегментации MSER. Разработайте алгоритм, который использует ширину и высоту ограничивающих прямоугольников для извлечения только тех блобов, которые являются бук­ вами. d. Функция imser имеет много параметров: 'Delta', 'MinDiversity', 'MaxVariation', 'MinArea', 'MaxArea'. Исследуйте эффекты их изменения. e. Примените функцию igraphcut к изображению castle2.png. Изучите назначение параметров и настройте их для повышения производительности. f. Загрузите изображение adelson.png (врезка к разделу 3.3.1) и попытайтесь сегментировать буквы A и B. 2. Классификация областей на цветных изображениях. a. Измените количество кластеров k в примерах классификации по цвету. Существует ли лучшее значение? b. Алгоритм k-средних с параметрами 'random' или 'spread' выполняет рандомизированную инициализацию. Запустите алгоритм k-средних несколько раз и определите, насколько различаются итоговые кластеры. c. Напишите функцию, определяющую, какой из кластеров представляет цели, т. е. желтый или красный. d. Примените функцию igraphcut к изображению посадочной мишени и сада. Как она работает? Изучите назначение параметров и настройте их для повышения производительности. e. Поэкспериментируйте с параметрами морфологической «очистки», используемой для изображений посадочной мишени и сада. f. Напишите код, который перебирает изображения, снятые с камеры вашего компьютера, применяет классификацию и показывает результат. Критерием классификации может служить пороговое значение оттенков серого или цветовая кластеризация в заранее изученный набор цветовых кластеров (см. colorkmed). 3. Работа с блобами. Создайте изображение объекта с несколькими отверстиями. Вы можете нарисовать его и сделать снимок, экспортировать из программы для рисования или написать код для его создания. Подведение итогов 315 a. Определите внешние, внутренние и общие границы объекта. b. Поместите небольшие предметы в отверстия в предметах. Напишите код для отображения топологической иерархии блобов в сцене. c. Для одной и той же формы в разных масштабах постройте график изменения округлости в зависимости от масштаба. Объясните форму этой кривой. d. Создайте квадратный объект и постройте предполагаемый и истинный периметр как функцию длины стороны квадрата. Что происходит, когда площадь мала? e. Создайте изображение простой сцены с несколькими объектами различной формы. Используйте признаки, инвариантные к форме (соотношение сторон, круглость), для создания простого классификатора формы. Насколько хорошо он работает? Повторите решение, используя функции момента Ху. f. Повторите пример сопоставления границ с некоторыми созданными вами объектами. Измените код, чтобы создать график зависимости угла край–сегмент (k) от θ, и повторите пример сопоставления границ. g. Другой часто используемой функцией, не поддерживаемой Toolbox, является совмещенный прямоугольник (aligned rectangle). Это наименьший прямоугольник, стороны которого выровнены с осями эквивалентного эллипса и который полностью охватывает блоб. Соотношение сторон этого прямоугольника и отношение площади блоба к площади прямоугольника являются свойствами, не зависящими от масштаба и поворота. Напишите код для вычисления этого прямоугольника, наложения прямоугольника на изображение и вычисления двух признаков. h. Напишите код для отслеживания периметра блоба. 4. Поэкспериментируйте с функцией ocr. a. Каков эффект от увеличения наблюдаемой области? b. Получите собственное изображение и попытайтесь прочитать текст на нем. Как точность зависит от размера, контраста или ориентации текста? 5. Преобразование Хафа. a. Поэкспериментируйте с изменением размера накопителя Хафа. b. Поэкспериментируйте с использованием краевого оператора Собеля вместо оператора Кэнни. c. Поэкспериментируйте с изменением параметров 'suppress', 'interpSize', 'EdgeThresh', 'houghThresh'. d. Примените преобразование Хафа к одному из ваших собственных изображений. 316 Глава 5 · Извлечение признаков изображения e. Напишите код, который перебирает изображения, снятые камерой вашего компьютера, находит две доминирующие линии и накладывает их на изображение. 6. Угловые датчики a. Поэкспериментируйте с детектором Харриса, изменяя параметры k, σD и σI. b. Сравните характеристики угловых детекторов Харриса, Нобля и Ши–Томаси. c. Реализуйте детектор Моравека и сравните его с детектором Харриса. d. Создайте сглаженную вторую производную Iuu, Ivv и Iuv. Часть III Геометрия зрения Глава 6 Глава 7 Формирование изображения Использование нескольких изображений Часть III Геометрия зрения Камеры (и наши глаза) проецируют трехмерный мир в двухмерное изображение, и это уменьшение размерности имеет последствия. Например, параллельные прямые могут казаться сходящимися, а круги, рассматриваемые под углом, выглядят как эллипсы. В главе 6 говорится о том, как изображение мира формируется на сенсоре и преобразуется в цифровое изображение, состоящее из дискретных пикселей, – то, что мы считали само собой разумеющимся в предыдущих главах. Мы рассмотрим множество различных камер, включая перспективные камеры, похожие на глаза, а также широкоугольные панорамные камеры и новые технологии, такие как камеры светового поля. Вследствие уменьшения размерности, глядя на изображение, мы не можем точно определить размер объектов или их расстояние от камеры. Фактически размер и расстояние становятся связанными. В чисто геометрическом смысле большой далекий объект кажется таким же, как и меньший, расположенный ближе. На практике наша зрительная система использует знания и опыт, а также множество хитростей, чтобы разрешить эту двусмысленность. Например, если мы знаем размер объекта из опыта, мы чувствуем, как далеко он находится, или, наоборот, если мы знаем из других источников, как далеко он находится, то чувствуем его размер. Особенно важный трюк, который мы используем для оценки размера объектов и расстояния до них, заключается в использовании тонкой разницы во внешнем виде сцены при просмотре с двух разных точек. Эти различия в изображениях нашего левого и правого глаза содержат богатую информацию о трехмерной структуре мира – мы называем это стереозрением и знаем, что у большинства животных более одного глаза. В главе 7 обсуждается, как можно использовать несколько видов мира с одной движущейся камеры или нескольких камер, наблюдающих за сценой с разных точек, для понимания трехмерной структуры мира. Глава 6 Формирование изображения Все, что мы видим, – это не истина, а лишь перспектива. Марк Аврелий В этой главе мы обсудим, как формируются и считываются изображения, – первый шаг в восприятии мира роботом и человеком. Из изображений мы можем вывести размер, форму и положение объектов в мире, а также другие характеристики, такие как цвет и текстура, что в конечном итоге позволяет нам распознавать сцену. Давно известно, что простое маленькое отверстие способно создать идеальное перевернутое изображение на стене затемненной комнаты. У некоторых морских моллюсков, например у наутилуса, есть глаза-камеры с точечным отверстием. У всех позвоночных имеется хрусталик, формирующий перевернутое изображение на сетчатке, где располагаются светочувствительные клетки палочки и колбочки, показанные ранее на рис. 3.6. Цифровая камера устроена по аналогичному принципу – стеклянная или пластиковая линза формирует изображение на поверхности массива светочувствительных полупроводниковых устройств для преобразования света в цифровое изображение. Процесс формирования изображения в глазу или в камере включает проекцию трехмерного мира на двухмерную поверхность. Информация о глубине теряется, и мы больше не можем определить по изображению, представляет ли оно большой объект, расположенный далеко, или меньший, но расположенный ближе. Это преобразование из трехмерного представления в двухмерное называется перспективной проекцией и обсуждается в разделе 6.1. Раздел 6.2 знакомит с темой калибровки камеры – оценки параметров преобразования перспективы. В разделах с 6.3 по 6.5 представлены альтернативные типы камер, способных снимать широкоугольные, панорамные или светопольные изображения. Раздел 6.6 знакомит с некоторыми продвинутыми концепциями, такими как проецирование прямых и коник, а также с неперспективными камерами. 320 Глава 6 · Формирование изображения 6.1 Перспективная камера 6.1.1 Перспективная проекция объект Рис. 6.1. Сравнение светосборной способности камерыобскуры и объектива с линзой изображение линза изображение объект точечное отверстие Небольшое отверстие в стене затемненной комнаты будет отбрасывать на противоположную стену тусклое перевернутое изображение внешнего мира – так устроена простейшая проективная камера с точечным отверстием (pinhole), известная также как камера-обскура. Такая камера дает очень тусклое изображение, поскольку ее мощность излучения равна яркости сцены в единицах Вт/м2, умноженной на площадь точечного отверстия. На рис. 6.1а показано, что только небольшая часть света, покидающего объект, участвует в создании изображения. Камера-обскура не имеет регулировки фокуса – все объекты находятся в фокусе независимо от расстояния. Ключом к получению более ярких изображений является использование объектива, который собирает свет от объекта на большей площади и направляет его на плоскость изображения, как показано на рис. 6.1b. Выпуклая линза может формировать В V в. до н. э. философ Мози из древнего Китая упомянул об эффекте перевернутого изображения, формирующегося через точечное отверстие. Камера-обскура – это затемненная комната, в которой свет, проникающий через маленькое отверстие, отбрасывает на стену неясное перевернутое изображение мира. Они были популярными туристическими достопримечательностями в викторианские времена, особенно в Британии, и многие из них функционируют до сих пор. (Изображение справа взято из коллекции Drawing with Optical Instruments на http://vision.mpiwg-berlin.mpg.de/elib.) Перспективная камера 321 Реальные объективы изображение точно так же, как точечное отверстие, а базовый камеры состоят из геометрический принцип формирования изображения при понескольких линз, но все же имеют точки мощи тонкой линзы показан на рис. 6.2. Положительная ось фокусировки на z – это оптическая ось камеры. каждой стороне составного объектива. луч от то чеч объект ног оо тве эквивалент точечного отверстия рст ия Рис. 6.2. Геометрический принцип формирования изображения с по­мощью тонкой выпуклой линзы, показанный в поперечном сечении. Линза имеет две фокусные точки на расстоянии f по обеим сторонам линзы. По соглашению оптическая ось камеры – это ось z плоскость изображения точка фокуса идеальная тонкая линза перевернутое изображение Координата z объекта и его изображение относительно цент­ ра линзы связаны уравнением тонкой линзы: (6.1) Величина, обратная где zo – расстояние до объекта, zi – расстояние до изображения, фокусному рас- f – фокусное расстояние линзы . Если объект расположен на стоянию, называется диоптрией. расстоянии zo > f перевернутое изображение формируется на Для тонких линз, плоскости изображения при zi < −f. расположенных В фотоаппарате плоскость изображения совпадает с чувствиблизко друг к другу, тельной поверхностью оптического сенсора, поэтому кольцо их общая диоптрия фокусировки камеры перемещает объектив вдоль оптической близка к сумме их индивидуальных оси на расстояние zi от плоскости изображения – для бесконечдиоптрий. но удаленного объекта zi = f. Недостатком использования объектива является необходимость фокусировки. Наш собственный глаз имеет единственную выпуклую линзу, состоящую из прозрачных белков-кристаллинов, а фокусировка достигается за счет мышц, которые изменяют ее форму, – этот процесс называется аккомодация. Объектив камеры высокого качества представляет собой составное устройство, состоящее из нескольких стеклянных или пластиковых линз. В компьютерном зрении обычно используется модель визуализации в центральной перспективе, показанная на рис. 6.3. 322 Глава 6 · Формирование изображения Рис. 6.3. Модель центральной проекции. Плоскость изображения находится на расстоянии f перед началом координат камеры, и на ней формируется не перевернутое изображение. Система координат камеры правосторонняя с осью z, определяющей центр поля зрения опт иче ска я ос ь ная глав ка точ ия ажен обр ть из скос начало координат камеры пло Лучи сходятся в начале системы координат камеры {C}, и неинвертированное изображение проецируется на плоскость изображения, расположенную в точке z = f. Ось z пересекает плоскость изображения в главной точке (principal point), которая является началом системы координат двухмерного изображения. Используя принцип подобия треугольников, мы можем показать, что точка с мировыми координатами P = (X, Y, Z) проецируется в точку изображения p = (x, y) согласно формуле (6.2) которая представляет собой проективное преобразование, или, точнее, перспективную проекцию. Это отображение из трехмерного мира в двухмерное изображение имеет последствия, которые мы можем видеть на рис. 6.4, – параллельные прямые сходятся, а окружности становятся эллипсами. Более формально можно сказать, что преобразование из наблюдаемого мира в плоскость изображения имеет следующие свойства. 1.Оно выполняет отображение из трехмерного пространства в двухмерную плоскость изображения: �: �3 ↦ �2. 2.Прямые линии мира проецируются на прямые линии на плоскости изображения. 3.Параллельные прямые в мире проецируются на прямые, которые пересекаются в точке схода, как показано на Перспективная камера 323 а b Рис. 6.4. Эффект трансформации перспективы: a) параллельные прямые сходятся; b) окружности становятся эллипсами Конические сечения, или коники, – это семейство кривых, полученных пересечением плоскости с конусом. К ним относятся окружности, эллипсы, параболы и гиперболы. рис. 6.4а. В рисовании этот эффект известен как ракурс. Исключением являются фронто-параллельные линии – лежащие в плоскости, параллельной плоскости изображения, – которые всегда остаются параллельными. 4.Коники наблюдаемого мира проецируются на коники на плоскости изображения. Например, круг проецируется как круг или эллипс, как показано на рис. 6.4b. 5.Размер (площадь) фигуры не сохраняется и зависит от расстояния. 6.Отображение не является взаимно однозначным, и не существует единственного обратного отображения. То есть, зная (x, y), мы не можем однозначно определить (X, Y, Z). Все, что можно сказать, – это то, что мировая точка лежит где-то вдоль красного выступающего луча, показанного на рис. 6.3. Это важная тема, к которой мы вернемся в главе 7. Апертура объектива. Так называемое f-число (диафрагменное число), обычно указанное на корпусе объектива, представляет собой безразмерную величину F = f/d, где d – диаметр линзы (часто обозначается символом φ на оправе линзы). Это число обратно пропорционально светосиле объектива. Чтобы уменьшить количество света, падающего на плоскость изображения, эффективный диаметр уменьшают за счет механической апертуры или диафрагмы, что увеличивает f-число. Освещенность на плоскости изображения обратно пропорциональна F 2, так как зависит от площади сбора света. Чтобы уменьшить освещенность в два раза, f-число должно быть увеличено в два раза, или «на один стоп». Градуировка f-числа увеличивается на 2 на каждый «стоп». f-число обычно записывают в виде f/1.4 для F = 1.4. 324 Глава 6 · Формирование изображения Фокус и глубина резкости. В идеале группа световых лучей из точки сцены встречается в точке изображения. При несовершенном фокусе лучи вместо этого образуют пятно конечного размера, называемое кругом нерезкости (circle of confusion), которое является функцией рассеяния точки оптической системы. Принято считать, что если размер круга нерезкости примерно равен пикселю, то изображение приемлемо сфокусировано. Камера-обскура не имеет управляемой фокусировки и всегда создает сфокусированное изображение объектов независимо от их расстояния. Объектив не обладает этим свойством – кольцо фокусировки изменяет расстояние между объективом и плоскостью изображения и должно быть отрегулировано так, чтобы интересующий объект был приемлемо сфокусирован. Фотографы используют понятие глубины резкости, представляющей собой диапазон расстояний до объектов, для которых формируются приемлемо сфокусированные изображения. Глубина резкости высока при малой диафрагме, когда объектив больше похож на точечное отверстие, но это означает меньшее количество света и более шумные изображения или более длительное время выдержки и размытие движения. Это дилемма, с которой постоянно сталкивается фотограф! 7.Преобразование не конформное – не сохраняет форму, так как внутренние углы не сохраняются. Перенос, вращение и масштабирование являются примерами конформных преобразований. 6.1.2 Моделирование перспективной камеры Мы можем записать координаты точки плоскости изображения в однородной форме p̃ = (x̃, ỹ, z̃), где x̃ = f X, ỹ = f Y, z̃ = f Z, где тильда обозначает однородную величину, – в разделе C.2 кратко говорится об однородных координатах. В матричной форме предыдущая запись будет выглядеть так: (6.3) Неоднородные координаты плоскости изображения записываются так: Их часто называют координатами плоскости изображения сетчатки. В случае, когда f = 1, координаты называются норма- Перспективная камера 325 лизованными, ретинальными или каноническими координатами плоскости изображения. Если мы запишем мировую координату также в однородной форме CP̃ = (X, Y, Z, 1)T, то перспективную проекцию можно будет записать в линейной форме как (6.4) или p̃ = C CP̃, (6.5) где C – матрица 3´4, известная как матрица камеры. Обратите внимание, что мы пишем CP̃, чтобы подчеркнуть тот факт, что это координата точки относительно системы координат камеры {C}. Матрицу камеры можно разложить на множители где вторая матрица является матрицей проекции. Toolbox позволяет нам создать модель камеры центральной перспективы. Например, >> cam = CentralCamera('focal', 0.015); возвращает экземпляр объекта CentralCamera с объективом 15 мм. По умолчанию камера находится в начале мировой системы координат, а ее оптическая ось указывает в направлении оси z мира, как показано на рис. 6.3. Определяем мировую точку >> P = [0.3, 0.4, 3.0]'; в метрах, и получаем соответствующие координаты на плоскости изображения >> cam.project(P) ans = 0.0015 0.0020 Точка на плоскости изображения находится на расстоянии (1.5, 2.0) мм по отношению к главной точке. Это очень небольшое смещение, но оно соизмеримо с размером типичного сенсора изображения. 326 Глава 6 · Формирование изображения В общем случае камера будет иметь произвольное положение ξC относительно системы мировых координат, как показано на рис. 6.5. Положение точки относительно камеры: P = (⊖ξ�) • 0P C (6.6) или, если использовать однородные координаты: P = TC–1 0P. C Мы можем легко продемонстрировать это, переместив нашу камеру на 0.5 м влево: >> cam.project(P, 'pose', SE3(-0.5, 0, 0) ) ans = 0.0040 0.0020 где третий аргумент – положение камеры ξC как однородное преобразование. Мы видим, что координата x увеличилась с 1.5 мм до 4.0 мм, т. е. точка изображения сместилась вправо. Рис. 6.5. Системы координат камеры 6.1.3 Дискретная плоскость изображения В цифровой камере плоскость изображения представляет собой сетку размером W´H светочувствительных элементов, называемых фотоячейками, которые непосредственно соответствуют элементам изображения (или пикселям), как показано на рис. 6.6. Координаты пикселя представляют собой вектор (u, v) неотрицательных целых чисел, и по соглашению начало координат находится в верхнем левом углу плоскости изображения. Не забывайте, что в MATLAB® верхний левый пиксель равен Перспективная камера 327 (1, 1). Пиксели имеют одинаковый размер и равномерно расположены на сетке, поэтому координата пикселя связана с координатой плоскости изображения соотношением где ρw и ρh – ширина и высота каждого пикселя соответственно, а (u0, v0) – главная точка – пиксельная координата точки, в которой оптическая ось пересекает плоскость изображения относительно нового начала координат. Мы можем записать уравнение 6.4 через координаты пикселей путем добавления матрицы параметров камеры K: (6.7) Матрицу K часто где p̃ = (ũ, ṽ, w̃) – однородная координата мировой точки P записывают с ко- в пиксельных координатах . Неоднородные координаты пикнечным значением K1,2 для представ- селя в плоскости изображения равны: ления перекоса, т. е. того факта, что оси (6.8) u и v не ортогональны, что крайне маловероятно при Например, если пиксели представляют собой квадрат со стоточных процессах изготовления полу- роной 10 мкм, а массив пикселей имеет размер 1280´1024 пикпроводников. опт иче ска я ос ь ная глав ка ч то ения браж изо ость лоск Рис. 6.6. Модель центральной проекции, представляющая плоскость изображения и дискретные пиксели п начало координат камеры 328 Глава 6 · Формирование изображения Оптический сенсор. Светочувствительные элементы в чипе камеры – фотоячейки – обычно имеют квадратную форму с длиной стороны в диапазоне 1–10 мкм. Профессиональные камеры имеют большие фотоячейки для повышения светочувствительности, тогда как камеры мобильных телефонов имеют маленькие сенсоры и, следовательно, маленькие менее чувствительные ячейки. Отношение количества пикселей по горизонтали к вертикали совпадает с отношением сторон и обычно составляет 4:3 или 16:9. Размер датчика измеряется по диагонали массива и обычно выражается в дюймах, например 1/3, 1/4 или 1/2 дюйма. Однако активная чувствительная область чипа имеет диагональ, которая обычно составляет около 2/3 заявленного размера. селя с главной точкой в координатах плоскости изображения (640, 512), следующий код >> cam = CentralCamera('focal', 0.015, 'pixel', 10e-6, ⮠ 'resolution', [1280 1024], 'centre', [640 512], 'name', 'mycamera') cam = name: mycamera [central-perspective] focal length: 0.015 pixel size: (1e-05, 1e-05) principal pt: (640, 512) number pixels: 1280 x 1024 pose: t = (0,0,0), RPY/yxz = (0,0,0) deg выводит параметры модели камеры, включая положение камеры T. Соответствующие неоднородные координаты плоскости изображения ранее определенной мировой точки равны: >> cam.project(P) ans = 790 712 6.1.4 Матрица камеры Объединив уравнения (6.6) и (6.7), мы можем записать проекцию камеры в общем виде как (6.9) Перспективная камера 329 Члены f/ρw и f/ρh где все члены свернуты в матрицу камеры C . Она представляпредставляют собой ет собой гомогенное преобразование 3´4, которое выполняет фокусное расстояние, выражен- масштабирование, перемещение и перспективную проекцию. ное в единицах Ее часто также называют проекционной матрицей или калибропикселей. вочной матрицей камеры. Перспективной проекции присуща фундаментальная неоднозначность – мы не можем отличить большой удаленный объект от меньшего более близкого объекта. Уравнение (6.9) можно переписать в виде p̃ = (CH –1)(HP̃) = C ¢P̃¢, где H – произвольная невырожденная матрица размера 3×3. Это означает, что бесконечное число комбинаций камеры C¢ и координат мировой точки P̃¢ дадут одну и ту же проекцию p̃ на плоскость изображения. В этом и заключается главная трудность определения трехмерных мировых координат по двухмерным проекционным координатам. Ее можно преодолеть, только обладая информацией о камере или трехмерном объекте. Проекция также может быть записана в функциональной форме как p = �(P, K, ξC), (6.10) где P – вектор координат точки в мировой системе координат. K представляет собой матрицу параметров камеры и хранит внутренние характеристики камеры и сенсора, такие как f, ρw, ρh, u0 и v0. ξC представляет собой положение камеры и содержит как минимум шесть внешних параметров, которые описывают перемещение и ориентацию камеры в SE(3). Существует 5 внутренних и 6 внешних параметров (итого 11 независимых параметров) для описания камеры. Матрица камеры состоит из 12 элементов, поэтому одна степень свободы – общий коэффициент масштабирования – не ограничена и может быть выбрана произвольно. На практике параметры камеры неизвестны и должны оцениваться с по­мощью про­ цеду­ры калибровки камеры, которую мы обсудим в разделе 6.2. Матрица внутренних параметров K для текущей камеры равна: >> cam.K ans = 1.0e+03 * 1.5000 0 0 1.5000 0 0 0.6400 0.5120 0.0010 330 Глава 6 · Формирование изображения Поле зрения объектива представляет собой незамкнутую прямоугольную усеченную пирамиду, образующую углы θh и θv в горизонтальной и вертикальной плоскостях соответственно. Нормальный объектив имеет поле зрения около 50°, тогда как широкоугольный объектив имеет поле зрения >60°. За пределами 110° трудно создать линзу, поддерживающую перспективную проекцию, поэтому широкоугольные линзы обычно являются неперспективными. Для очень широкоугольных объективов чаще описывают поле зрения как телесный угол, который измеряется в стерадианах (ср). Это площадь поля зрения, спроецированного на поверхность единичной сферы. Полусферическое поле зрения равно 2π ср, а полное сферическое поле равно 4π ср. Если мы аппроксимируем поле зрения камеры конусом с углом при вершине θ, соответствующий телесный угол равен 2π(1 − cos θ/2) ср. Камера с полем зрения больше полной полусферы называется всенаправленной, или панорамной. Матрица камеры неявно создается при создании объекта камеры Toolbox и для этого примера имеет вид: >> cam.C ans = 1.0e+03 * 1.5000 0 0 1.5000 0 0 0.6400 0.5120 0.0010 0 0 0 Матрица камеры C ⊂ �3´4 имеет некоторые важные структуру и свойства: ее можно разбить C = (M | c4) на невырожденную матрицу M ⊂ �3´3 и вектор, где c4 = −Mc, а c – начало координат в системе координат камеры. Мы можем восстановить его как c = −M −1c4; нуль-пространство C равно c̃; пиксель с координатой p соответствует лучу в пространстве, параллельному вектору M −1p̃; матрица M = KR является произведением внутренних характеристик камеры и инверсной ориентации камеры. Мы можем выполнить RQ-разложение M = RQ, где R – верхнетреугольная матрица (которая есть K) и ортогональная матрица Q (которая есть R ); нижний ряд C определяет главную плоскость, которая параллельна плоскости изображения и содержит начало координат камеры; если строки M являются векторами mi, то: – m3T – вектор, нормальный к главной плоскости и параллельный оптической оси, а Mm3T – главная точка в однородной форме; – если камера имеет нулевой перекос, т. е. К1,2 = 0, то (m1´m3) · (m2´m3) = 0; – если камера имеет квадратные пиксели, т. е. ρu = ρv, то ||m1´m3|| = ||m2´m3|| = f/ρ. Да, здесь R имеет два разных значения. MATLAB не обеспечивает RQ-раз­ло­же­ние, но его можно определить путем преобразования входных данных и результатов встроенной в MATLAB функции QR-разложения qr. Однако при этом есть много тонкостей: отрицательные масштабные коэффициенты в матрице K или det R = −1, подробности см. в Hartley and Zisserman (2003) или в коде реализации invC. Перспективная камера 331 Поле зрения камеры зависит от ее фокусного расстояния f. Широкоугольный объектив имеет маленькое фокусное расстоя­ ние, телеобъектив имеет большое фокусное расстояние, а зумобъектив – регулируемое фокусное расстояние. Поле зрения можно определить по геометрической схеме рис. 6.6. В горизонтальном направлении половинный угол обзора равен где W – количество пикселей в горизонтальном направлении. Отсюда мы можем написать: (6.11) Отметим, что поле зрения также является функцией размеров чипа камеры, которые записываются как Wρw´Hρh. Поле зрения вычисляется методом fov объекта камеры >> cam.fov() * 180/pi ans = 46.2127 37.6930 в градусах по горизонтали и вертикали соответственно. 6.1.5 Точки проекции Класс CentralCamera является подклассом класса Camera и наследует возможность проецировать несколько точек или линий. С помощью Toolbox создадим сетку точек 3´3 в плоскости xy с общей длиной стороны 0.2 м и центром в точке (0, 0, 1) >> P = mkgrid(3, 0.2, 'pose', SE3(0, 0, 1.0)); которая возвращает матрицу 3´9 с одним столбцом на точку сетки, где каждый столбец содержит координаты в порядке X, Y, Z. Выведем на печать первые четыре столбца: >> P(:,1:4) ans = -0.1000 -0.1000 -0.1000 0 1.0000 1.0000 -0.1000 0.1000 1.0000 0 -0.1000 1.0000 По умолчанию mkgrid создает сетку в плоскости xy с центром в начале координат. Необязательный последний аргумент – это однородное преобразование, которое применяется к точкам по 332 Глава 6 · Формирование изображения умолчанию и позволяет произвольно располагать и ориентировать плоскость. Координаты вершин в плоскости изображения >> cam.project(P) ans = 490 490 490 362 512 662 640 362 640 512 640 662 790 362 790 512 790 662 которые также можно вывести на график >> cam.plot(P) получив вид виртуальной камеры, показанный на рис. 6.7а. Положение камеры >> Tcam = SE3(-1,0,0.5)*SE3.Ry(0.9); дает косой вид на плоскость >> cam.plot(P, 'pose', Tcam) показанный на рис. 6.7b. Здесь ясно виден эффект перспективной проекции, которая исказила форму квадрата – верхний и нижний края, которые являются параллельными линиями, были спроецированы на линии, которые сходятся в точке схода. Точка схода линии может быть определена по проекции ее идеальной линии. Верхняя и нижняя линии сетки параллельны мировой оси x или вектору (1, 0, 0). Соответствующая идеальная прямая имеет однородные координаты (1, 0, 0, 0) и существует на бесконечности благодаря последнему нулевому элементу. Точка схода – это проекция упомянутого вектора >> cam.project([1 0 0 0]', 'pose', Tcam) ans = 1.0e+03 * Рис. 6.7. Два вида плоской сетки точек: a) вид спереди, b) вид сбоку a mycamera v (пиксели) v (пиксели) mycamera u (пиксели) b u (пиксели) Перспективная камера 333 1.8303 0.5120 т. е. точка с координатами (1803, 512) справа от плоскости видимого изображения. Метод plot может дополнительно возвращать координаты плоскости изображения >> p = cam.plot(P, 'pose', Tcam) так же как и метод project. При просмотре под углом координаты плоскости изображения >> p(:,1:4) ans = 887.7638 887.7638 364.3330 512.0000 887.7638 659.6670 955.2451 374.9050 Это не совсем верно имеют дробную составляющую. Это означает, что точка не продля КМОП-сенсоров, ецируется на центр пикселя. Однако пиксель реагирует на свет где транзисторы уменьшают све- одинаково по площади своей поверхности, поэтому дискретточувствительную ную координату пикселя можно получить путем округления. область на коэфТрехмерный объект в виде куба можно определить и спрофициент заполнеецировать аналогичным образом. Вершины куба со стороной ния – долю площади каждой фотоячейки, 0.2 м и центром в точке (0, 0, 1) можно определить при помощи чувствительную строки кода к свету. >> cube = mkcube(0.2, 'pose', SE3(0, 0, 1) ); которая возвращает матрицу 3´8 с одним столбцом на вершину. Точки плоскости изображения могут быть построены, как и раньше, с по­мощью команды: >> cam.plot(cube); В качестве альтернативы мы можем создать реберное представление куба с по­мощью команды >> [X,Y,Z] = mkcube(0.2, 'pose', SE3(0, 0, 1), 'edge'); и отобразить его >> cam.mesh(X, Y, Z) как показано на рис. 6.8, вместе с косым видом, созданным коман­дами >> Tcam = SE3(-1,0,0.5)*SE3.Ry(0.8); >> cam.mesh(X, Y, Z, 'pose', Tcam); Ребра имеют тот же формат трехмерной сетки , что и соз- Элементы сетки (i, j) имеют координаты данные встроенными функциями MATLAB, такими как sphere, (Xi, j, Yi, j, Zi, j). ellipsoid и cylinder. 334 Глава 6 · Формирование изображения mycamera v (пиксели) v (пиксели) mycamera a u (пиксели) b u (пиксели) Последовательные вызовы plot перерисовывают точки или Рис. 6.8. куба сегменты линий и обеспечивают простейшую анимацию. Ко- Представление отрезками линий: роткий фрагмент кода a) вид спереди; 1 2 3 4 5 6 theta = [0:500]/100*2*pi; [X,Y,Z] = mkcube(0.2, [], 'edges'); for th=theta T_cube = SE3(0, 0, 1.5)*SE3.rpy(th*[1.1 1.2 1.3]) cam.mesh( X, Y, Z, 'objpose', T_cube ); drawnow end показывает куб, кувыркающийся в пространстве. Куб определяется с центром в начале координат, а его вершины преобразуются на каждом временном шаге. 6.1.6 Дисторсия объектива Идеальные объективы не существуют, а недорогие объективы, используемые во многих веб-камерах, особенно далеки от совершенства. Недостатки объектива приводят к различным дисторсиям (искажениям), включая хроматическую аберрацию (цветовая окантовка), сферическую аберрацию или астигматизм (разброс фокуса по сцене), а также геометрическую дисторсию, когда точки на плоскости изображения смещаются от того мес­ та, где они должны быть в соответствии с уравнением 6.3. Геометрическая дисторсия, как правило, является наиболее проблематичным эффектом, с которым мы сталкиваемся в роботизированных приложениях, и состоит из двух компонентов: радиального и тангенциального. Радиальная дисторсия приводит к смещению точек изображения по радиальным линиям от главной точки. Радиальная ошибка хорошо аппроксимируется полиномом: b) вид сбоку Перспективная камера 335 δr = k1r 3 + k2r 5 + k3r 7 + ¼, (6.12) где r – расстояние точки изображения от главной точки. Бочкообразная дисторсия возникает, когда увеличение снижается по мере удаления от главной точки, что приводит к искривлению прямых линий у края изображения наружу. Подушкообразная дисторсия возникает, когда увеличение нарастает с расстоянием от главной точки и вызывает изгиб прямых линий у края изображения внутрь. Тангенциальная дисторсия, или децентрирующее искажение, возникает под прямым углом к радиусам, но, как правило, менее значительна, чем радиальная. Примеры искаженного и неискаженного изображения показаны на рис. 6.9. Координата точки (u, v) после искажения определяется выражением: ud = u + δu, v d = v + δv, (6.13) где смещение (6.14) a v (пиксели) v (пиксели) Этот вектор смещения может быть построен для различных значений (u, v), как показано на рис. 6.13b. Векторы указывают смещение, необходимое для исправления дисторсии в различных точках изображения, фактически (–δu, –δv), и показывают преобладающее радиальное искажение. На практике для описания радиальной дисторсии достаточно трех коэффициентов, а модель дисторсии определяется параметрами (k1, k2, k3, p1, p2), u (пиксели) b u (пиксели) Рис. 6.9. Дисторсия объектива: a) искаженное изображение, кривизна верхнего ряда квадратов заметно выражена, b) неискаженное изображение. Это калибровочное изображение № 19 из набора инструментов для калибровки камеры Bouguet (Bouguet, 2010) 336 Глава 6 · Формирование изображения Человечеству потребовалось много времени, чтобы понять природу света, цвета и человеческого зрения. У древних греков было две научные школы. Теория эмиссии, поддержанная Евклидом и Птолемеем, утверждала, что зрение работает за счет того, что глаз испускает лучи света, которые взаимодействуют с миром примерно так же, как осязание. Теория интромиссии, поддерживаемая Аристотелем и его последователями, предполагала, что физические формы входят в глаз от объекта. Евклид Александрийский (325–265), возможно, правильно понял геометрические принципы формирования изображения, но его лучи исходили от глаза, а не от объекта. Клавдий Птолемей (100–170 гг.) написал «Оптику» и обсуждал вопросы отражения, преломления и цвета, но сегодня остался лишь плохой арабский перевод его работы. Арабский философ Хасан ибн аль-Хайтам (он же Альхазен, 965–1040) написал семитомный трактат «Китаб аль-Маназир» («Книга оптики») около 1020 г. Он объединил математические лучи Евклида, медицинские знания Галена и теорию интромиссии Аристотеля. Он писал, что «из каждой точки каждого цветного тела, освещенного каким-либо светом, исходит свет и цвет по каждой прямой линии, которую можно провести из этой точки». Он понимал явление преломления лучей, но полагал, что хрусталик глаза, а не сетчатка, получает изображение – как и многие ранние мыслители, он боролся с идеей перевернутого изображения на сетчатке. Латинский перевод его работы оказал большое влияние на более поздних европейских ученых. Только в 1604 г. геометрическая оптика и человеческое зрение объединились, когда немецкий астроном и математик Иоганн Кеплер (1571–1630) опубликовал Astronomiae Pars Optica («Оптическая часть астрономии»). Он был первым, кто понял, что изображения переворачиваются и проецируется хрусталиком глаза на сетчатку, а изображение затем корректируется «в полостях мозга». (Изображение из Astronomiae Pars Optica, Иоганн Кеплер, 1604 г.) которые рассматриваются как дополнительные внутренние параметры. Дисторсия может быть смоделирована классом CentralCamera с использованием параметра 'distortion', например: >> cam = CentralCamera('focal', 0.015, 'pixel', 10e-6, ... 'resolution', [1280 1024], 'centre', [512 512], ... 'distortion', [k1 k2 k3 p1 p2] ) 6.2 Калибровка камеры Модель проекции камеры (6.9) имеет ряд параметров, которые на практике неизвестны. Как правило, главная точка находится Согласно стандарту не в центре массива фотоячеек. Точность фокусного расстояния ANSI PH3.13-1958 «Маркировка фообъектива составляет всего 4 %, и оно соответствует заявлен- кусного расстояния ному только в том случае, если объектив сфокусирован на бес- объективов». Калибровка камеры 337 При изменении фо- конечность. Также общеизвестно, что внутренние параметры куса линза смещаизменяются, если объектив отсоединяется и снова прикрепляется по оптической оси. В некоторых ется или регулируется по фокусу или апертуре . Единственконструкциях изме- ными внутренними параметрами, которые возможно получить нение фокуса приаприори, являются размеры фотоячейки ρw и ρh, известные из водит к повороту объектива, поэтому, технической документации производителя сенсора. Внешние если он не идеально параметры и положение камеры оставляют открытым вопрос симметричен, это о том, где именно находится центральная точка камеры. приведет к смеКалибровка камеры – это процесс определения внутренних щению искажений относительно пло- и внешних параметров камеры по отношению к мировой сискости изображения. стеме координат. Методы калибровки основаны на наборах Изменение диафрагмы изменяет мировых точек, относительные координаты которых известны части линзы, через и чьи соответствующие координаты в плоскости изображения которые проходят также известны. Современные методы, такие как Calibration световые лучи, и, следовательно, Toolbox Bouguet для MATLAB (Bouguet, 2010), просто используискажение, которое ют изображения плоской клетчатой мишени в виде шахматной они несут. доски, показанной на рис. 6.12. С ее помощью, как обсуждалось в разделе 6.2.4, можно оценить параметры (включая параметры дисторсии), а также относительное положение клетчатой доски на каждом изображении. Классические методы калибровки требуют одного вида трехмерной калибровочной мишени, но не могут оценить модель искажения. Однако эти методы просты для понимания, и мы перейдем к их обсуждению в следующем разделе. 6.2.1 Метод гомогенного преобразования Метод гомогенного преобразования позволяет напрямую найти матрицу камеры C в уравнении (6.9). Элементы этой матрицы являются функциями внутренних и внешних параметров. Приняв p = (u, v, 1), расширив уравнение (6.9) и подставляя в уравнение (6.8), получаем: C11X + C12Y + C13Z + C14 - C31uX - C32uY - C33uZ - C34u = 0; (6.15) C21X + C22Y + C23Z + C24 - C31uX - C32uY - C33uZ - C34u = 0, где (u, v) – координаты пикселя, соответствующие мировой точке (X, Y, Z), и Cij – элементы неизвестной матрицы камеры. Для калибровки требуется трехмерная мишень, изображенная на рис. 6.10. Положение центра каждого маркера (Xi, Yi, Zi), i ∈ [1, N] относительно целевой системы координат {T} должно быть известно, но сама {T} неизвестна. Во время калибровки выполняется захват изображения и определяются соответствующие координаты плоскости изображения (ui, vi). Принимая C34 = 1, мы суммируем два уравнения (6.15) для каждого из N маркеров, чтобы сформировать матричное уравнение 338 Глава 6 · Формирование изображения (6.16) которое можно решить для элементов матрицы камеры C11 ⋯ C33. Уравнение (6.16) имеет 11 неизвестных, и для его решения требуется N ≥ 6. Часто используется более 6 точек, что приводит к переопределенной системе уравнений, которая решается методом наименьших квадратов. Если точки компланарны, то левая матрица уравнения (6.16) становится матрицей неполного ранга. Вот почему цель калибровки должна быть трехмерной, обычно это массив точек или квадратов в двух или трех плоскостях, как показано на рис. 6.10. Рис. 6.10. Трехмерная калибровочная мишень, представляющая систему координат {T}. В качестве калибровочных точек принимаются центроиды окружностей. Обратите внимание, что калибровочные точки расположены в трех плоскостях (фото предоставлено Фабьеном Шпиндлером) Проиллюстрируем калибровку на примере. Калибровочной мишенью служит куб, маркеры являются его вершинами, а его система координат {T} параллельна граням куба с началом в центре куба. Координаты маркеров относительно {T} равны >> P = mkcube(0.2); Теперь калибровочная мишень находится в некотором «неизвестном положении» CξT по отношению к камере, которое мы принимаем следующим: >> T_unknown = SE3(0.1, 0.2, 1.5) * SE3.rpy(0.1, 0.2, 0.3); Далее создаем перспективную камеру, параметры которой мы попытаемся оценить: Калибровка камеры 339 >> cam = CentralCamera('focal', 0.015, ... 'pixel', 10e-6, 'resolution', [1280 1024], 'noise', 0.05); Мы также указали, что к координатам (u, v) добавляется гауссов шум с нулевым средним значением с σ = 0.05 для моделирования шума камеры и ошибок в алгоритмах компьютерного зрения. Координаты калибровочной мишени в плоскости изображения в ее «неизвестном» положении: >> p = cam.project(P, 'objpose', T_unknown); Теперь, используя только модель объекта P и наблюдаемые признаки изображения p, вычислим матрицу камеры: >> C = camcald(P, p) maxm residual 0.066733 pixels. C = 853.0895 -236.9378 634.2785 740.0438 222.6439 986.6900 295.7327 712.0152 -0.1304 0.0610 0.6495 1.0000 Максимальная невязка в этом случае составляет менее 0.1 пикселя, т. е. наихудшая ошибка между проекцией мировой точки с использованием матрицы камеры С и фактическим положением плоскости изображения очень мала. Линейные методы, подобные этому, не могут оценить параметры дисторсии объектива. Дисторсия внесет ошибки в элементы матрицы камеры, но во многих ситуациях они являются приемлемо низкими. Параметры искажения часто находят с по­мощью нелинейной оптимизации по всем параметрам, обычно по 16 или более, а линейное решение используют в качестве начальной оценки параметра. Где находится центр камеры? Составной объектив имеет множество основных точек, включая фокальные точки, узловые точки, главные точки и плоскости, входной и выходной зрачки. Входной зрачок (entrance pupil) – это точка на оптической оси системы составных линз, которая является ее центром перспективы или точкой отсутствия параллакса. Мы можем рассматривать эту точку как виртуальное точечное отверстие. Вращение камеры и объектива вокруг этой точки не изменит относительную геометрию мишеней на разных расстояниях на перспективном изображении. Вращение вокруг входного зрачка важно в панорамной фотографии, чтобы избежать ошибок параллакса в окончательной сшитой панораме. Ряд веб-страниц посвящен обсуждению методов определения положения этой точки. Некоторые сайты даже приводят таблицу положения входного зрачка для популярных объективов. В большинстве этих онлайн-публикаций авторы ошибочно называют эту точку узловой точкой (nodal point), хотя приведенные методы на самом деле определяют входной зрачок. В зависимости от конструкции объектива входной зрачок может находиться позади, внутри или перед системой линз. 340 Глава 6 · Формирование изображения 6.2.2 Разложение калибровочной матрицы камеры Элементы матрицы камеры являются функциями внутренних и внешних параметров. Однако при наличии матрицы камеры большинство значений параметров можно восстановить. Нуль-пространство C – это начало мира в кадре камеры. Если использовать данные из приведенного выше примера, это: >> null(C)' ans = 0.0809 -0.1709 -0.8138 0.5495 Это представление в однородных координатах можно преобразовать в декартову форму >> h2e(ans)' ans = 0.1472 -0.3110 -1.4809 что близко к истинному значению: >> T_unknown.inv.t' ans = 0.1464 -0.3105 -1.4772 Чтобы восстановить ориентацию, а также внутренние параметры, мы можем разложить ранее найденную матрицу камеры >> est = invcamcal(C) est = name: invcamcal [central-perspective] focal length: 1504 pixel size: (1, 0.9985) principal pt: (646.8, 504.4) pose: t = (0.147, -0.311, -1.48), RPY/zyx⮠ = (-1.87, -12.4, -16.4) deg Эти величины измеряются в пик­ поскольку и получить объект CentralCamera с его параметрами, имеющими селях, ρ измеряется значения, которые приводят к той же самой матрице камеры. в m/пиксель. В лиСразу отметим, что фокусное расстояние очень велико по срав- тературе довольно считается, что нению с истинным фокусным расстоянием нашего объектива, часто ρ = 1, а фокусное которое составляло 0.015 м, и что размеры пикселей очень ве- расстояние указылики. Из уравнения (6.9) мы видим, что фокусное расстояние вается в пикселях. пиксели не и размер пикселя всегда появляются вместе как коэффициенты Если квадратные, то для f/ρw и f/ρh . Функция invcamcal установила ρw = 1, но отношения горизонтального и вертикального нанайденных параметров правлений должны использоваться >> est.f/est.rho(1) разные фокусные ans = расстояния fu и fv 1.5044e+03 соответственно. Калибровка камеры 341 очень близки к соотношению для истинных параметров камеры >> cam.f/cam.rho(2) ans = 1.500e+03 Небольшая ошибка в найденных значениях параметров связана с зашумленными значениями координат плоскости изображения, которые мы использовали в процессе калиб­ ровки. Положение оцениваемой камеры рассматривается относительно калибровочной системы {T} и, следовательно, равно TξˆC. Истинное положение цели относительно камеры равно CξT. Если наша оценка точна, то CξT ⊕ TξˆC будет равно 0. Ранее мы присвоили переменной T_unknown значение CξT и для нашего примера находим, что >> trprint(T_unknown*est.T) t = (4.13e-05, -4.4e-05, -0.00386), ⮠ RPY/zyx = (0.296, 0.253, -0.00557) deg что является относительным положением между истинным и предполагаемым положением камеры. Положение камеры оценивается с погрешностью менее 5 мм по положению и в долях градуса по ориентации. Мы можем изобразить калибровочные маркеры в виде маленьких красных сфер >> hold on; plot_sphere(P, 0.03, 'r') >> trplot(eye(4,4), 'frame', 'T', 'color', 'b', 'length', 0.3) а также построить систему {T}, которую мы установили в начале мировой системы координат. Наложим на график предполагаемое положение камеры: >> est.plot_camera() Параметр 'frustum' Результат показан на рис. 6.11 . Задача определения полопоказывает камеру жения камеры относительно калибровочного объекта является в виде прямоугольной пирамиды, как важной задачей фотограмметрии, которую часто называют завидно на рис. 6.13а, дачей определения местоположения камеры. а не в виде значка камеры. 6.2.3 Вычисление положения Задача вычисления положения состоит в том, чтобы определить положение CξT системы координат мишени {T} относительно камеры. Известна геометрия мишени, т. е. известно положение ряда точек (Xi, Yi, Zi), i ∈ [1, N] на мишени относительно {T}. Также известны внутренние параметры камеры. 342 Глава 6 · Формирование изображения Выполняется захват изображения, и соответствующие координаты плоскости изображения (ui, vi) определяются с использованием алгоритмов компьютерного зрения. Вычисление положения с использованием (ui, vi), (Xi, Yi, Zi) и внутренних параметров камеры называется задачей n-то­чеч­ной перспективы (Perspective-n-Point) или PnP для краткости. Это более простая задача, чем калибровка камеры и декомпозиция, поскольку для вычислений требуется меньше параметров. Чтобы проиллюстрировать вычисление положения, создадим калиброванную камеру с известными параметрами: >> cam = CentralCamera('focal', 0.015, 'pixel', 10e-6, ... 'resolution', [1280 1024], 'centre', [640 512]); Объект, положение которого мы хотим определить, представляет собой куб со стороной 0.2 м, а координаты маркеров относительно {T} равны >> P = mkcube(0.2); Это можно рассматривать как простую геометрическую модель объекта. Объект находится в произвольном и неизвестном положении C ξT относительно камеры: Рис. 6.11. Калибровочные целевые точки и расчетное положение камеры относительно системы {T}, которая, как предполагается, находится в начале мировой системы координат >> T_unknown = SE3(0.1, 0.2, 1.5) * SE3.rpy(0.1, 0.2, 0.3); >> T_unknown.print t = (0.1, 0.2, 1.5), RPY/zyx = (5.73, 11.5, 17.2) deg Координаты точек объекта в плоскости изображения при его неизвестном положении равны: >> p = cam.project(P, 'objpose', T_unknown); Теперь, используя только модель объекта P, наблюдаемые характеристики изображения p и откалиброванную камеру cam, вычислим относительное положение CξT объекта >> T_est = cam.estpose(P, p).print t = (0.1, 0.2, 1.5), RPY/zyx = (5.73, 11.5, 17.2) deg что совпадает (с точностью до четырех знаков после запятой) с неизвестным положением T_unknown объекта. В действительности система технического зрения не идеально определяет координаты объектов изображения, и это можно Калибровка камеры 343 смоделировать, добавив гауссов шум с нулевым средним значением к координатам объектов изображения, как мы сделали в примере с калибровкой камеры. Графический интерфейс использовать не обязательно, а функции Toolbox Популярным и практичным инструментом для калибровки каможно вызывать из ваших собственных мер с использованием плоской мишени в виде шахматной допрограмм. Функция ски является Camera Calibration Toolbox. Необходимо сделать calib_gui_nor- несколько снимков мишени, обычно 20, на разных расстояниях mal показывает сопоставление и с разных ракурсов, как показано на рис. 6.12. После запуска инструмента калибровки имен кнопок GUI с именами функций Calibration Toolbox. >> calib_gui Обратите внимание, что большинство отображается графический интерфейс пользователя (GUI) . функций на самом деле являются Первым шагом является загрузка изображений с по­мощью скриптами, а пере- кнопки Image Names . Второй шаг – кнопка Extract Grid Corners , менные состояния программы хранятся которая предлагает вам выбрать углы калибровочной мишени в рабочей области. на каждом из изображений. Это немного утомительно, но нуж- 6.2.4 Инструменты для калибровки камеры Рис. 6.12. Кадры-примеры из набора инструментов калибровки Bouguet, показывающие калибровочную мишень в различных ракурсах. Это изображения 2, 5, 9, 18 из примера Calibration Toolbox 344 Глава 6 · Формирование изображения но делать это аккуратно. На последнем шаге кнопка Calibration использует информацию о калибровочной мишени для оценки значений параметров камеры: Focal Length: fc = [ 657.39071 657.74678 ] ⮠ ± [ 0.37195 0.39793 ] Principal point: cc = [ 303.22367 242.74729 ] ⮠ ± [ 0.75632 0.69189 ] Skew: alpha_c = [ 0.00000 ] ± [ 0.00000 ] ⮠ => angle of pixel axes = 90.00000 ± 0.00000 degrees Distortion: kc = [ -0.25541 0.12617 -0.00015 0.00006 ⮠ 0.00000 ] ± [ 0.00290 0.01154 0.00016 0.00015 0.00000 ] Pixel error: err = [ 0.13355 0.13727 ] Для каждого параметра вычисляется и отображается неопределенность (границы 3σ). Положение камеры относительно цели вычисляется для каждого калибровочного изображения и может отображаться с по­мощью кнопки Show Extrinsic . Этот ориентированный на мишень вид показан на рис. 6.13а и указывает предполагаемое относительное положение камеры для каждого входного изоРис. 6.13. Результаты бражения. калибровки Вектор дисторсии kc содержит параметры в порядке (k1, k2, p1, на примере p2, k3) – обратите внимание, что k3 следует не по порядку. Карту калибровочных средств Bouguet: дисторсии можно отобразить с по­мощью команды >> visualize_distortions как видно на рис. 6.13b. Она показывает смещение от истинных до искаженных координат плоскости изображения, которое в данном случае происходит преимущественно в радиальном направлении. Это согласуется с тем, что k1 и k2 на несколько порядков больше, чем p1 и p2, что типично для большинства объективов. Кнопку Undistort Image можно использовать для восстановления набора изображений; искаженное и неиска- а b a) предполагаемое положение камеры относительно цели для каждого калибровочного изображения, b) карта дисторсии с векторами, показывающими, как точки на изображении будут перемещаться из-за искажения Изображения с широким полем зрения 345 женное изображение сравниваются на рис. 6.9b. Детали этого преобразования с использованием деформации изображения обсуждались в разделе 4.7.4. 6.3 Изображения с широким полем зрения Мы подробно обсудили перспективные изображения, поскольку они соответствуют модели наших собственных глаз и почти всех камер, с которыми мы сталкиваемся. Однако перспективное изображение принуждает нас к фундаментально ограниченному полю зрения. Уравнение тонкой линзы (6.1) является сингулярным для точек с Z = f, что ограничивает поле зрения не более чем одним полушарием – реальные линзы достигают гораздо меньшего. По мере уменьшения фокусного расстояния устранять радиальные искажения становится все труднее, и в конце концов достигается предел, выше которого практически невозможно изготовить линзу. Единственный выход из этой ситуации – отказаться от ограничения перспективного изображения. В разделе 6.3.1 будет рассмотрена геометрия формирования изображения с по­мощью широкоугольных объективов. Альтернативой преломляющей оптике является использование отражающей поверхности для формирования изображения, как показано на рис. 6.14. Ньютоновские телескопы основаны на отражении от вогнутых зеркал, а не на преломлении линзами. Зеркала не дают цветной окантовки на изображении, и их легче масштабировать до больших размеров, чем линзы. Природа тоже использует отражающую оптику: у рыб-призраков и некоторых морских гребешков глаза основаны на отражателях, образованных из кристаллов гуанина. В разделе 6.3.2 описана геометрия формирования изображения при комбинации линз и зеркал. Зеркальное отражение происходит, как следует из названия, при падении света на зеркальную поверхность. Входящие лучи отражаются так, что угол падения равен углу отражения, или θr = θi. Speculum в переводе с латыни означает зеркало, а классический металл для изготовления зеркал (2/3 меди, 1/3 олова) представляет собой сплав, который хорошо полируется. Его использовали Ньютон и Гершель для изогнутых зеркал в своих телескопах-рефлекторах (48-дюймовое металлическое зеркало из 40-футового телескопа Гершеля, изготовленное в 1789 г., сейчас находится в Британском музее науки, фото Майка Пила (mikepeel.net), лицензия CC-BY-SA). 346 Глава 6 · Формирование изображения Камеры постоянно дешевеют, поэтому альтернативным подходом является объединение вывода нескольких камер в одно изображение. Этот подход кратко описан в разделе 6.5.1. Рис. 6.14. Формирование изображений путем отражения от искривленной поверхности (Cloud Gate, Чикаго, Аниш Капур, 2006). Обратите внимание, что прямые линии стали кривыми 6.3.1 Камера с объективом «рыбий глаз» Изображение, полученное через объектив типа «рыбий глаз» показано на рис. 6.17. Создадим модель, используя обозначения, показанные на рис. 6.15, где камера расположена в начале координат O, а ее оптическая ось – это ось z. Мировая точка P представлена в сферических координатах (R, θ, φ), где θ – угол наружу от оптической оси, а φ – угол поворота вокруг оптической оси. Мы можем написать: На плоскости изображения камеры изобразим проекцию p в полярных координатах (r, φ) относительно главной точки, где r = r(θ). Декартовы координаты плоскости изображения: u = r(θ)cos φ, v = r(θ)sin φ, а точный характер функции r(θ) зависит от разновидности объектива «рыбий глаз». Некоторые распространенные проекционные модели перечислены в табл. 6.1, и все они имеют параметр масштабирования k. Изображения с широким полем зрения 347 Таблица 6.1. Проекционные модели с объективом «рыбий глаз» Сопоставление Равноугольное (equiangular) Стереографическое (stereographic) Равнотельное (equisolid) Полиномиальное (polinimial) Уравнение r = kθ r = k tan(θ/2) r = k sin(θ/2) r = k1θ + k2θ 2 + … Используя Toolbox, мы можем создать камеру типа «рыбий глаз» >> cam = FishEyeCamera('name', 'fisheye', ... 'projection', 'equiangular', ... 'pixel', 10e-6, ... 'resolution', [1280 1024]) которая возвращает экземпляр объекта FishEyeCamera, являющийся подклассом объекта Camera Toolbox и полиморфный классу CentralCamera, рассмотренному ранее. Если значение k не указано, как в этом примере, то оно вычисляется таким образом, что полусферическое поле зрения проецируется в максимальный круг на плоскости изображения. Как и в случае с перспективными камерами, такие параметры, как главная точка и размеры в пикселях, как правило, неизвестны и должны оцениваться с по­мощью процедуры калибровки. Создадим реберную модель куба со стороной 0.2 м >> [X,Y,Z] = mkcube(0.2, 'centre', [0.2, 0, 0.3], 'edge'); опт иче ска я ос ь главная точка Рис. 6.15. Формирование изображения в камере с объективом «рыбий глаз». Мировая точка P представлена в сферических координатах (R, θ, φ) относительно начала координат камеры ния раже пло об ть из скос 348 Глава 6 · Формирование изображения и спроецируем ее на плоскость изображения камеры «рыбий глаз»: >> cam.mesh(X, Y, Z) Результат показан на рис. 6.16. Мы видим, что прямые линии мира уже не являются прямыми линиями на изображении. v (пиксели) рыбий глаз u (пиксели) Рис. 6.16. Куб, спроецированный с по­мощью класса FishEyeCamera. Прямые ребра куба являются отрезками кривых на плоскости изображения Существуют широкоугольные объективы с углом обзора 180° и даже 190°, однако они имеют некоторые практические недостатки. Во-первых, пространственное разрешение ниже, поскольку пиксели камеры распределены по более широкому полю зрения. Мы также видим на рис. 6.17, что поле зрения представляет собой круглую область, а это означает, что почти 25 % прямоугольной плоскости изображения теряется. Рис. 6.17. Изображение, полученное через объектив «рыбий глаз». Обратите внимание, что прямые линии мира больше не проецируются как прямые изображения. Также заметьте, что поле зрения отображается в круглую область на плоскости изображения Изображения с широким полем зрения 349 Во-вторых, изображения на открытом воздухе с большей вероятностью будут захватывать яркое небо, поэтому камера автоматически уменьшит экспозицию, и, как следствие, некоторые части сцены, не относящиеся к небу, будут сильно недоэкспонированы (затемнены). 6.3.2 Катадиоптрическая камера От греческих слов, Катадиоптрическая система получения изображений содержит обозначающих как отражающие, так и преломляющие элементы – зеркало кривое зеркало (катоптрика) и линзу и линзу, как показано на рис. 6.18a. Пример катадиоптрическо(диоптрика). го изображения см. на рис. 6.18b. Геометрическая схема на рис. 6.19 довольно сложна. Луч проходит из точки P к фокусу зеркала в точке O, которая является началом системы координат камеры. Луч имеет угол возвышения вверх от оптической оси и пересекает зеркало в точке М. Отраженный луч образует угол ψ по отношению к оптической оси, который является функцией угла падающего луча, т. е. ψ(θ). Соотношение между θ и ψ определяется касательной к зеркалу в точке M и зависит от формы зеркала. Для катадиоптрической съемки используются зеркала различных форм – сферические, параболические, эллиптические а b Рис. 6.18. Катадиоптрическая схема: a) система катадиоптрического изображения, включающая обычную перспективную камеру, которая смотрит в зеркало вверх; b) катадиоптрическое изображение. Обратите внимание на темное пятно в центре, которое обусловлено опорой, удерживающей зеркало над объективом. Пол – в центре изображения, а потолок – на краю (фотографии Майкла Милфорда) 350 Глава 6 · Формирование изображения и гиперболические. В общем случае функция ψ(θ) нелинейна, но интересным классом зеркал являются равноугольные зеркала, для которых θ = αψ. Отраженный луч попадает в объектив камеры под углом ψ к оптической оси, и, исходя из геометрии объектива, можно записать: r = λ tan ψ, что является расстоянием от главной точки. Полярные координаты точки плоскости изображения равны p = (r, φ), а соответствующие декартовы координаты u = r cos φ, v = r sin φ, где φ – азимутальный угол: На рис. 6.19 мы предположили, что все лучи проходят через одну фокальную точку, или точку наблюдения, – в данном случае O. Эта схема называется центральной системой, и полу- оптическая ось зеркало опорная точка зрения камеры объектив плоскость изображения Рис. 6.19. Формирование катадиоптрического изображения. Луч из точки P под углом места θ и азимутом ϕ в сторону O отражается от поверхности зеркала в точке M и проецируется линзой на плоскость изображения в точке p Изображения с широким полем зрения 351 ченное катадиоптрическое изображение может быть правильно преобразовано в перспективное. Равноугольное зеркало не удовлетворяет этому ограничению и, следовательно, представляет собой нецентральную систему – фокусная точка меняется в зависимости от угла падающего луча и лежит вдоль короткой траектории внутри зеркала, известной как каустическая линия (caustic). Конические, сферические и равноугольные зеркала нецентральны. На практике изменение точки зрения очень мало по сравнению с мировым масштабом, и многие такие зеркала хорошо аппроксимируются центральной моделью. Toolbox предоставляет модель катадиоптрических камер. Например, мы можем создать равноугольную катадиоптрическую камеру: >> cam = CatadioptricCamera('name', 'panocam', ... 'projection', 'equiangular', ... 'maxangle', pi/4, ... 'pixel', 10e-6, ... 'resolution', [1280 1024]) Этот код возвращает экземпляр объекта CatadioptricCamera, который является подклассом объекта Camera Toolbox и полиморфен классу CentralCamera, рассмотренному ранее. Опция maxangle задает максимальный угол места θ, из которого определяются параметры α и f, так что наибольший угол места соответствует окружности, которая максимально совпадает с плоскостью изображения. Параметры можно задавать по отдельности с использованием опций 'alpha' и 'focal'. Также поддерживаются модели параболической и сферической проекции, и каждый тип камеры имеет различные параметры, как описано в онлайн-документации. Создадим модель куба на основе ребер >> [X,Y,Z] = mkcube(1, 'centre', [1, 1, 0.8], 'edge'); которую спроецируем на плоскость изображения: >> cam.mesh(X, Y, Z) Результат показан на рис. 6.20. Преимуществом катадиоптрических камер является обзор на 360° по азимуту, но они также имеют некоторые практические недостатки. Им присущи многие проблемы объективов типа «рыбий глаз», такие как уменьшенное пространственное разрешение, потеря пикселей в плоскости изображения и ограничение экспозиции. В некоторых конструкциях также есть слепая зона из-за опоры зеркала, которая обычно представляет собой центральную ножку или несколько боковых опор. 352 Глава 6 · Формирование изображения v (пиксели) панорамная камера u (пиксели) 6.3.3 Рис. 6.20. Куб, спроецированный с помощью равноугольной катадиоптрической камеры Сферическая камера Объективы типа «рыбий глаз» и катадиоптрические системы, которые только что обсуждались, направляют световые лучи из большого поля зрения на плоскость изображения. В конечном счете двухмерная плоскость изображения является ограничивающим фактором, и лучше вместо нее рассматривать сферу изображения, как показано на рис. 6.21. Мировая точка P проецируется лучом в начало единичной сферы. Проекция – это точка p, в которой луч пересекает поверхность сферы. Если мы примем p = (x, y, z), то линия долготы линия широты а то э кв р Рис. 6.21. Формирование сферического изображения. Мировая точка P отображается в p на поверхности единичной сферы и представлена углами дополнительной широты θ и долготы ϕ Изображения с широким полем зрения 353 (6.17) – радиальное расстояние до мировой где точки. Поверхность сферы описывается уравнением x2 + y2 + z2 = 1, поэтому одна из трех декартовых координат избыточна. Минимальное двухпараметрическое представление точки на поверхности сферы (φ, θ) включает в себя угол дополнительной широты (colatitude), измеренный вниз от северного полюса: θ = sin-1r, θ ∈ [0, π], где (6.18) а азимутальный угол (или долгота) (6.19) И наоборот, декартовы координаты точки p = (φ, θ) задаются формулой: x = sin θ cos φ, y = sin θ sin φ, z = cos θ. (6.20) С помощью Toolbox мы можем создать сферическую камеру >> cam = SphericalCamera('name', 'spherical') которая возвращает экземпляр объекта SphericalCamera, являющийся подклассом объекта Camera Toolbox и полиморфный классу CentralCamera, обсуждавшемуся ранее. Как и ранее, мы можем создать модель куба на основе ребер >> [X,Y,Z] = mkcube(1, 'centre', [2, 3, 1], 'edge'); и спроецировать его на сферу >> cam.mesh(X, Y, Z) Результат показан на рис. 6.22. Для облегчения визуализации поверхность сферического изображения развернута в прямоугольник – линии долготы и широты отображаются как вертикальные и горизонтальные линии соответственно. Верхний и нижний края соответствуют северному и южному полюсам соответственно. Купить сферическую камеру пока невозможно, хотя ее прототипы были продемонстрированы в нескольких лабораториях. Сферическая камера более полезна в качестве концептуальной конструкции для упрощения обсуждения широкоугольных изображений. Как будет показано в следующем разделе, мы 354 Глава 6 · Формирование изображения можем преобразовывать изображения из перспективы, камеры «рыбий глаз» или катадиоптрической камеры в сферу, где обрабатывать их единообразно. доп. широта θ, рад сферическая долгота φ, рад 6.4 Рис. 6.22. Куб, спроецированный сферической камерой. Плоскость сферического изображения представлена в декартовых координатах У нифицированная модель формирования изображений В этой главе были представлены различные модели формирования изображений. Теперь мы обсудим, как преобразовать изображение, снятое камерой одного типа, в изображение, которое было бы снято камерой другого типа. Например, учитывая проекцию объектива «рыбий глаз», мы создадим соответствующую проекцию для сферической или перспективной камеры. Унифицированная модель формирования изображений обеспечивает мощную основу для рассмотрения очень разных типов камер, таких как стандартная перспектива, катадиоптрические и многие разновидности объективов типа «рыбий глаз». Унифицированная модель формирования изображений представляет собой двухэтапный процесс, схематически показанный на рис. 6.23. Первым шагом является сферическая проекция мировой точки P на поверхность единичной сферы p¢, как обсуждалось в предыдущем разделе и описывается уравнениями (6.17) и (6.18). Точка обзора O – это центр сферы, который находится на расстоянии m от плоскости изображения по ее нормали к оси z. Единая точка обзора подразумевает наличие центральной камеры. На втором этапе точка p¢ = (θ, φ) перепроецируется на плоскость изображения p с использованием точки обзора F, которая находится на расстоянии ℓ по оси z выше точки O. Полярные координаты точки плоскости изображения равны p = (r, φ), где Унифицированная модель формирования изображений 355 (6.21) Унифицированная модель формирования изображения имеет только два параметра: m и ℓ, и они зависят от типа камеры, как указано в табл. 6.2. У перспективной камеры точка обзора F совпадает с O, а геометрия становится такой же, как у центральной перспективной модели, показанной на рис. 6.3. Таблица 6.2. Унифицированные параметры модели изображения ℓ и m в зависимости от типа камеры. ε – конический эксцентриситет, а 4p – фокальный параметр Система Песпективная Стереографическая «Рыбий глаз» Катадиоптрическая (эллиптическая, 0 < ε <1) Катадиоптрическая (параболическая, ε =1) Катадиоптрическая (гиперболическая, ε >1) ℓ 0 1 >1 2ε 1 + ε2 1 2ε 1 + ε2 m f f f 2ε(2p – 1) 1 + ε2 2p – 1 2ε(2p – 1) 1 + ε2 У катадиоптрических камер с коническими зеркалами фокальная точка F лежит между центром сферы и северным полюсом, т. е. 0 < ℓ < 1. Эта проекционная модель несколько проще ге- а то э кв главная ось р Рис. 6.23. Унифицированная модель формирования изображений Гейера плоскость изображения и Даниилидиса (2000 г.) главная точка 356 Глава 6 · Формирование изображения ометрии катадиоптрической камеры, показанной на рис. 6.19. Длина хорды, Изображение параметризуется коническим эксцентриситетом параллельной директрисе и проε и фокальным параметром 4p . ходящей через Проекция с F на северном полюсе называется стереографиче- фокальную точку. ской проекцией и используется во многих областях для проецирования поверхности сферы на плоскость. Многие линзы типа «рыбий глаз» очень хорошо аппроксимируются F над северным полюсом. 6.4.1 Сопоставление широкоугольных изображений со сферой Мы можем использовать унифицированную модель формирования изображений в обратном порядке. Рассмотрим изображение, полученное камерой с широким полем зрения, например изображение «рыбий глаз», показанное на рис. 6.24а. Если мы знаем местоположение F, то можем спроецировать каждую точку изображения на сферу, чтобы создать сферическое изображение, даже если у нас нет сферической камеры. Чтобы получить это обратное отображение, нам нужно знать некоторые параметры камеры, снявшей изображение. Общей чертой изображений, снятых с по­мощью объектива «рыбий глаз» или катадиоптрической камеры, является то, что внешняя Рис. 6.24. граница изображения представляет собой круг. Этот круг мож- Изображение плоской но найти и довольно точно определить его центр – это главная калибровочной точка. На рис. 6.24a показан вариант процедуры калибровки мишени глаз»: камеры, описанной в разделе 6.2.4, в котором используются со- «рыбий a) изображение ответствующие точки мира и плоскости изображения из пла- типа «рыбий нарной калибровочной мишени. Эта конкретная камера имеет глаз» (любезно поле зрения 190°, и ее калибровочные параметры оценивают- предоставлено Питером Хансеном); ся следующим образом: главная точка (528.1214, 384.0784), ℓ = b) изображение преобразовано 2.7899 и m = 996.4617. v (пиксели) доп. широта θ, рад в координаты (φ, θ) a u (пиксели) b долгота φ, рад Унифицированная модель формирования изображений 357 Проиллюстрируем это с по­мощью изображения, показанного на рис. 6.24а: >> f isheye = iread('f isheye_target.png', 'double', 'grey'); а также определим рабочую область входного изображения: >> [Ui,Vi] = imeshgrid(f isheye); Для сопоставления будем использовать деформацию изображения. Деформация подробно обсуждалась в разделе 4.7.4, но сейчас будет удобнее кратко рассмотреть эту тему еще раз. Выходная область покрывает всю сферу с долготой от −π до +π рад и широтой от 0 до π рад с 500 шагами в каждом направлении: >> n = 500; >> theta_range = linspace(0, pi, n); >> phi_range = linspace(-pi, pi, n); >> [Phi,Theta] = meshgrid(phi_range, theta_range); Для деформации нам нужна функция, которая возвращает координаты точки на входном изображении, получая координаты точки на выходном сферическом изображении. Эта функция является вторым шагом унифицированной модели получения изображений (6.21), который мы реализуем как >> r = (l+m)*sin(Theta) ./ (l-cos(Theta)); откуда соответствующие декартовы координаты на входном изображении равны >> U = r.*cos(Phi) + u0; >> V = r.*sin(Phi) + v0; Деформация изображения выполняется с по­мощью одной встроенной функции MATLAB: >> spherical = interp2(Ui, Vi, f isheye, U, V); где первые три аргумента определяют входную область, а последние два – это координаты, для которых значения шкалы серого будут интерполированы из входного изображения и возвращены. Теперь нужно отобразить результат >> idisp(spherical) как показано на рис. 6.24b. Изображение кажется отраженным относительно экватора. Дело в том, что отображение точки на плоскости изображения в сферу имеет двойное значение – поскольку F находится над северным полюсом, луч пересекает сферу дважды. Верхний и нижний ряд этого изображения соответствуют главной точке, а темная полоса над экватором соответствует круглому внешнему краю входного изображения. 358 Глава 6 · Формирование изображения Изображение сильно искажено, но эта система координат очень удобна для наложения текстуры на сферу: >> sphere >> h = f indobj('Type', 'surface'); >> set(h, 'CData', f lipud(spherical), 'FaceColor', 'texture'); >> colormap(gray) Результат показан на рис. 6.25. Используя панель инструментов MATLAB, мы можем вращать сферу и смотреть на изображение с разных точек зрения. Рис. 6.25. Изображение «рыбий глаз» сопоставлено с единичной сферой. Хорошо видно плоскую клетчатую мишень, лежащую на столе, потолочный светильник, дверь и доску для заметок Любое широкоугольное изображение, которое можно выразить через параметры центрального изображения, можно аналогичным образом спроецировать на сферу. То же самое можно сделать с несколькими перспективными изображениями, полученными с по­мощью массива камер, как показано на рис. 6.27. 6.4.2 реобразование сферического изображения П в перспективное Допустим, у нас есть сферическое изображение, и нужно реконструировать перспективный вид в определенном направлении. Мы можем рассматривать эту операцию как взгляд изнутри сферы на небольшой участок поверхности, который близок к плоскому и приближается к виду камеры в перспективе. Это второй шаг унифицированной модели визуализации, где F находится в центре сферы, и в этом случае рис. 6.23 становится похожим на рис. 6.3. Оптической осью перспективной камеры является отрицательная ось z сферы. Унифицированная модель формирования изображений 359 В этом примере мы будем использовать сферическое изображение, созданное в предыдущем разделе. Нам нужно создать перспективное изображение размером 1000´1000 пикселей и с полем зрения 45°. Поле зрения можно записать через ширину изображения W и унифицированный параметр изображения m как Для угла обзора 45° требуется >> W = 1000; >> m = W / 2 / tan(45/2*pi/180) m = 1.2071e+03 а для перспективной проекции необходимо >> l = 0; Нам также нужно, чтобы главная точка находилась в центре изображения: >> u0 = W/2; v0 = W/2; Область выходного изображения будет следующей: >> [Uo,Vo] = meshgrid(0:W–1, 0:W–1); Полярная координата (r, φ) каждой точки выходного изображения равна >> [phi,r ]= cart2pol(Uo–u0, Vo–v0); и соответствующие сферические координаты (φ, θ) равны >> Phi_o = phi; >> Theta_o = pi - atan(r/m); Теперь перейдем от сферических координат к плоскости перспективного изображения: >> perspective = interp2(Phi, Theta, spherical, Phi_o, Theta_o); Результат преобразования >> idisp(perspective) показан на рис. 6.26а. Это вид перспективной камеры в центре сферы, смотрящей вниз через южный полюс. Мы видим, что линии на клетчатой калибровочной мишени теперь прямые, как и следовало ожидать от перспективного изображения. a v (пиксели) v (пиксели) 360 Глава 6 · Формирование изображения u (пиксели) b u (пиксели) Конечно, мы не ограничиваемся только взглядом вдоль от- Рис. 6.26. Перспективная рицательной оси z сферы. На рис. 6.25 можно видеть некото- проекция рые другие элементы комнаты, такие как дверь, белая доска сферического для заметок и несколько потолочных светильников. Мы можем изображения рис. 6.25 с полем направить нашу виртуальную перспективную камеру в их на- зрения 45°: a) правлении, сначала повернув сферическое изображение: обратите внимание, что линии на клетчатой мишени теперь прямые; b) так что теперь отрицательная ось z указывает на дальнюю сте- перспективный вид на дверь и доску ну. Повторяя процесс преобразования, мы получаем результат, для заметок >> spherical = sphere_rotate(spherical, SE3.Ry(0.9)*SE3.Rz(–1.5) ); показанный на рис. 6.26b, в котором можно ясно видеть дверь Из одного широко­ и доску . угольного изобра­ Исходное широкоугольное изображение содержит много жения можно деталей, хотя их трудно разглядеть из-за искажений. После со- создать перспективпоставления изображения со сферой мы можем создать вирту- ный вид в любом направлении, не альный перспективный вид камеры (где прямые линии мира используя механидействительно прямые) вдоль любой линии обзора. Это воз- ческий механизм можно только в том случае, если исходное изображение было поворота/наклона, – это просто выснято центральной камерой с одной точкой обзора. Теоретиче- числение. На самом ски мы не можем создать перспективное изображение из не- деле несколько центрального широкоугольного изображения, но на практике, пользователей моодновременно если каустика мала, ошибки параллакса, вносимые в перспек- жет смотреть в разных тивное изображение, будут незначительными. направлениях. 6.5 Новые типы камер 6.5.1 Многокамерные массивы Стоимость камер и вычислений продолжает снижаться, что позволяет отказаться от нестандартных и дорогих линз и зеркал, Новые типы камер 361 о которых мы говорили до сих пор, и вместо этого использовать вычисления для объединения изображений с нескольких камер в цилиндрическую или сферическую плоскость изображения. Пример такого массива камер показан на рис. 6.27а; использование этого массива для съемки панорамы на 360° показано на рис. 6.27с. Массив на рис. 6.27b использует шесть камер, чтобы получить почти сферическое поле зрения. a b c Рис. 6.27. Всенаправленный массив камер: а) пять перспективных камер обеспечивают панораму 360° с полем зрения по вертикали 72° (камера Occam Vision Group); b) массив панорамных камер использует шесть перспективных камер, чтобы обеспечить 90 % сферического поля зрения; c) бесшовное панорамное изображение (3760×480 пикселей), выводимое камерой (a) (фотографии (a) и (c) Эдварда Пепперелла; изображение (b) предоставлено Point Grey Research) Эти массивы камер не являются центральными камерами, поскольку лучи света сходятся в фокусных точках отдельных камер, а не в центре сборки камер. Это может создать проблемы при отображении объектов на небольшом расстоянии, но при обычном использовании расстояние между фокусными точками камеры (каустика) мало по сравнению с расстояниями в сцене. Однако разные точки зрения камер дают реальное преимущество, когда дело доходит до съемки по технологии светового поля. 6.5.2 Камеры светового поля Как было сказано в начале этой главы, традиционная перспективная камера – аналоговая или цифровая – фиксирует представление сцены, используя два измерения пленки или 362 Глава 6 · Формирование изображения сенсора. Полученное изображение можно рассматривать как двухмерную функцию �(X, Y), которая описывает свет, излучаемый трехмерной сценой. Функция является скалярной �(·) ∈ � для монохромного изображения и векторной �(·) ∈ �3 для трех- Мы могли бы добавить дополницветного . тельные измерения Камера-обскура на рис. 6.1 пропускает через апертуру лишь для представления очень небольшое количество световых лучей, однако простран- поляризации света. ство заполнено бесчисленными световыми лучами, дающими более богатое и полное описание мира. Это подробное геоме- Слово «пленоптический» происходит трическое распределение света называется пленоптической от латинского слова функцией . Яркость на самом деле является функцией поло- «plenus», означаюжения и направления в трехмерном пространстве, например щего «полный». �(X, Y, Z, θ, φ). Линии в трехмерном пространстве имеют только сцена сочетыре параметра (см. раздел C.1.2.2), поэтому пленоптическая Если держит препятствия, функция может быть записана как �(s, t, u, v) с использованием то лучи становятся двухплоскостной параметризации, показанной на рис. 6.29a . отрезками прямой длины, что Изображение обычной камеры дает лишь двухмерный срез пол- конечной увеличивает разной пленоптической функции. мерность светового Хотя идеи, лежащие в основе светового поля, известны уже не- поля с 4D до 5D. для записи сколько десятилетий, технология съемки световых полей стала Однако такого светового широко доступной только в последние годы. Первые камеры све- поля камера должна тового поля (пленоптические камеры) представляли собой масси- находиться одново всех вы обычных камер, расположенных в плоскости, как показано на временно точках сцены, рис. 6.28, или на сфере, окружающей сцену, но они были большими, ничего не заслоняя, сложными и дорогими в изготовлении. Совсем недавно на рынке что невозможно. Рис. 6.28. Массив камер 8×12, описанный в (Wilburn et al., 2005 г.) (фото предоставлено Марком Левоем, Стэнфордский университет) Новые типы камер 363 появились недорогие и компактные камеры светового поля, основанные на массивах микролинз. Главным преимуществом потребительских камер светового поля обычно считают возможность перефокусировать изображение после съемки, но у изображения, полученного по технологии светового поля, есть много других достоинств, включая синтез новых видов, 3D-реконструкцию, получение изображения при слабом освещении и способность видеть сквозь частицы, затемняющие предметы. Массив микролинз представляет собой регулярную сетку крошечных линз, обычно состоящую из сотен тысяч линз, размещенную на расстоянии в доли миллиметра над поверхностью матрицы фотоячеек камеры. Основная линза объектива фокусирует изображение на поверхности массива микролинз, как показано на рис. 6.29b. Микролинза направляет падающий свет на один из небольших участков пикселей, допустим 8´8, в соответствии с его направлением. Результирующее изображение фиксирует информацию как о происхождении луча (линза), так и его направлении (конкретный пиксель под линзой). Напротив, в стандартной перспективной камере все лучи, независимо от направления, вносят свой вклад в значение пикселя. Пиксели камеры светового поля иногда называют ракселями (raxel), а разрешение этих камер обычно выражается в мегалучах (megaray). a Рис. 6.29. а) Луч света Φ проходит через плоскость изображения в точке (u, v) и через центр камеры в точке (s, t). Это похоже на модель центральной проекции, показанную на рис. 6.3. Любой луч можно описать двумя точками, в данном случае (u, v) и (s, t); b) путь световых лучей от объекта через линзу главного объектива и матрицу линз к матрице пикселей (изображения предоставлены Дональдом Дансеро) b 364 Глава 6 · Формирование изображения Необработанное изображение с массива датчиков выглядит, как показано на рис. 6.30а, но его можно декодировать в четырехмерное световое поле, как показано на рис. 6.30b, и использовать для отображения новых видов. a b 6.6 Дополнительные темы 6.6.1 роецирование произвольных линий П в трехмерном пространстве В разделе 6.1 мы проецировали на плоскость изображения отдельные точки трехмерного пространства, а также отображали сегменты 3D-линий, просто проецируя их конечные точки и соединяя их на плоскости изображения. Как спроецировать произвольную линию в трехмерном пространстве? Прежде всего нужно решить, как представить такую линию. Есть много разных вариантов, которые обсуждаются в разделе С.1.2.2. Одним из полезных способов записи параметров являются координаты Плюккера – шестимерный вектор, во многом похожий на кручения. Мы можем легко создать прямую линию Плюккера с по­ мощью Toolbox. Линия, проходящая через (0, 0, 1) и (1, 1, 1), создается при помощи кода >> L = Plucker([0 0 1], [1 1 1]) L = { -1 1 0; -1 -1 0 } который возвращает объект Plucker, представленный в виде шестимерного вектора с двумя компонентами: вектором момента Рис. 6.30. a) Крупный план изображения, сформированного на матрице сенсора с по­мощью матрицы линз; b) массив изображений, полученных из светового поля для разных точек зрения камеры (изображения предоставлены Дональдом Дансеро) Дополнительные темы 365 и вектором направления. Используя эти параметры, можно указать линию с по­мощью точки и направления или пересечения двух плоскостей. Направление линии Плюккера – это вектор: >> L.w' ans = -1 -1 0 Объект Plucker имеет методы для построения графиков, а также определения пересечения с плоскостями или другими линиями Плюккера. Существует много представлений линии Плюккера, включая шестимерный вектор, использованный выше, минимальный четырехмерный вектор и кососиммет­ ричную матрицу 4´4, вычисленную с использованием метода L. Последний используется для проецирования линии согласно уравнению ℓ = ⋁(C[L]´C T ), где C – матрица камеры, и в результате получается двухмерная линия, выраженная в однородных координатах. Наблюдение за этой линией с камерой по умолчанию >> cam = CentralCamera('default'); >> l = cam.project(L)' l = 1 -1 0 дает диагональную линию, пересекающую плоскость изображения. Ее можно построить, используя plot_homline или на плоскости виртуального изображения камеры с по­мощью команды >> cam.plot(l) Квадрики (quadric, квадратичная поверхность), образуют богатое семейство трехмерных поверхностей. Существует 17 стандартных типов, включая сферы, эллипсоиды, гиперболоиды, параболоиды, цилиндры и конусы, описываемые в общем виде как x̃TQ x̃ = 0, где Q ∈ �4´4 симметричен. Контур квадрики проецируется на плоскость изображения: c∗ = CQ∗CT, где (·)∗ представляет сопряженную операцию (приложение B), а c является матрицей, представляющей коническое сечение на плоскости изображения 366 Глава 6 · Формирование изображения p̃Tcp̃ = 0, которое можно записать как Au2 + Buv + Cv2 + Du + Ev + F = 0, где Определитель верхней левой подматрицы указывает тип коники: отрицательный для гиперболы, 0 для параболы и положительный для эллипса. В качестве примера определим камеру, смотрящую в начало координат, >> cam = CentralCamera('default', 'pose', SE3(0.2,0.1, -5)*SE3.Rx(0.2)); и единичную сферу в начале координат >> Q = diag([1 1 1 -1]); затем вычислим ее проекцию на плоскость изображения >> Qs = inv(Q)*det(Q); % adjugate >> cs = cam.C * Qs * cam.C'; >> c = inv(cs)*det(cs); % adjugate которая представляет собой матрицу 3´3, описывающую конику. Определитель >> det(c(1:2,1:2)) ans = 2.2862e+14 является положительным, что указывает на эллипс, и простой способ построить его – использовать Symbolic Math Toolbox™ >> syms x y real >> ezplot([x y 1]*c*[ x y 1]', [0 1024 0 1024]) >> set(gca, 'Ydir', 'reverse') 6.6.2 Неперспективные камеры Матрица камеры (6.9) представляет особое подмножество всех возможных матриц камер – конечных проективных или евк­ лидовых камер, – где левая матрица 3´3 не вырождена. Мат­ Дополнительные темы 367 рицу проекции камеры C из уравнения 6.9 можно записать в общем виде который имеет произвольный масштаб, поэтому один элемент, обычно C3,4, принимают равным единице – эта матрица имеет 11 уникальных элементов, или 11 степеней свободы. Мы могли бы рассматривать каждую возможную матрицу как соответствующую камеру какого-либо типа, но большинство из них будет давать сильно искаженные изображения. Ортогональная (параллельная) проекция – это простая проекция 3D-точек без перспективы на плоскость, как «вид в плане». Для небольших объектов, близких к камере, эта проекция может быть достигнута с по­мощью телецентрического объектива. Видимый размер объекта не зависит от расстояния до него. В случае робота в воздухе, летящего высоко над относительно ровной местностью, изменение глубины ∆Z мало по сравнению – – со средней глубиной сцены Z , т. е. DZ ≪ Z . В данном случае можно использовать масштабированную ортогональную проекцию, которая является ортогональной проекцией с последую­щим – равномерным масштабированием m = f/Z . Эти две неперспективные камеры являются частными случаями более общей аффинной модели камеры, описываемой матрицей вида которую можно разложить следующим образом: Можно показать, что главная точка для такой модели камеры не определена, что упрощает внутреннюю матрицу, но мы ввели параметр перекоса для случая неортогональных осей датчика. Проекционная матрица отличается от случая перспективной проекции в уравнении (6.9) – столбец нулей переместился 368 Глава 6 · Формирование изображения из столбца 4 в столбец 3. Этот нулевой столбец эффективно удаляет третью строку и столбец внешней матрицы, что дает и оставляет не более 8 степеней свободы . Независимость от Подматрица 2×3 глубины полностью очевидна, так как tz отсутствует. Случай, матрицы вращения имеет шесть когда перекос s = 0 и mx = my = 1, является ортогональной про- элементов, но екцией и имеет только 5 степеней свободы, в то время как мас- три ограничения строки имеют штабированный ортогональный вариант, когда s = 0 и mx = my, (две единичные нормы имеет 6 степеней свободы. Случай, когда mx ≠ my, называется и ортогональны) слабой перспективной проекцией, хотя этот термин иногда также и, следовательно, 3 степени используется для описания масштабированной ортогональной имеет свободы. проекции. 6.6.3 Камера и движение изображения Рассмотрим камеру по умолчанию >> cam = CentralCamera('default'); и мировую точку >> P = [1 1 5]'; для которой координаты изображения: >> p0 = cam.project( P ) p0 = 672 672 Теперь, если мы немного сместим камеру в направлении x, координаты пикселей станут следующими: >> px = cam.project( P, 'pose', SE3(0.1,0,0) ) px = 656 672 В соответствии с соглашением о координатах камеры на рис. 6.5 камера сместилась вправо, поэтому точка изображения сместилась влево. Чувствительность движения изображения к движению камеры Дополнительные темы 369 >> ( px - p0 ) / 0.1 ans = -160 0 что является приближением к производной ∂p/∂x. Она показывает, что смещение камеры на 1 м приведет к движению объектов на −160 пикселей в направлении u. Мы можем повторить эти вычисления для перемещения по оси z >> ( cam.project( P, 'pose', SE3(0, 0, 0.1) ) - p0 ) / 0.1 ans = 32.6531 32.6531 что говорит о равном смещении в направлениях u и v. При вращении по оси x >> ( cam.project( P, 'pose', SE3.Rx(0.1) ) - p0 ) / 0.1 ans = 40.9626 851.8791 движение изображения происходит преимущественно в направлении v. Понятно, что движение камеры вдоль и поперек различных степеней свободы в SE(3) вызывает совершенно разное движение точек изображения. Ранее в уравнении (6.10) мы выразили перспективную проекцию в следующей аналитической форме: p = �(P, K, ξC), а ее производная по времени равна ṗ = Jp(P, K, ξC)ν, где ν = (vx, vy, vz, ωx, ωy, ωz) ∈ �6 – скорость камеры, т. е. пространственная скорость, которую мы ввели в разделе 3.1. Jp, – объект, подобный якобиану, но, поскольку мы взяли производную по положению ξ ∈ SE(3), а не по вектору, технически он называется матрицей взаимодействия. Однако в мире роботизированного зрения его чаще называют якобианом изображения или матрицей чувствительности. Рассмотрим камеру, движущуюся со скоростью тела ν = (υ, ω) в мировой системе координат и наблюдающую мировую точку P с относительными координатами камеры P = (X, Y, Z). Скорость точки относительно системы координат камеры равна Ṗ = –ω ´ P – υ. (6.22) 370 Глава 6 · Формирование изображения Это уравнение можно записать в скалярной форме как Ẋ = Yωz Z – ωy – vx; Ẏ = Zωx – Xωz – vy; (6.23) Ż = Yωy – Yωx – vz. Уравнение перспективной проекции (6.2) для нормализованных координат плоскости изображения а производная по времени, с учетом правила частного, равна Подставляя уравнение 6.23, X = xZ и Y = yZ, мы получаем выражение в матричной форме (6.24) которое связывает пространственную скорость камеры со скоростью объекта в нормированных координатах изображения. Нормализованные координаты плоскости изображения связаны с координатами пикселя уравнением (6.7) в котором мы выполняем перестановку: (6.25) –=u−u и– v = v − v0 – координаты пикселя относительно где u 0 главной точки. Производная по времени равна (6.26) Дополнительные темы 371 и подстановка уравнений (6.25) и (6.26) в уравнение (6.24) дает и для типичного случая, когда ρu = ρv = ρ, мы можем выразить фокусное расстояние в пикселях f ¢= f/ρ и записать (6.27) в координатах пикселя относительно главной точки. Это выражение можно записать в краткой матричной форме: ṗ = Jp(p, Z )v, (6.28) Обычно это выраже- где Jp – якобиан изображения 2´6 для точечного объекта с коорние записывают че- динатой p и расстоянием до камеры Z. рез u и v, а не – u и– v, Класс Toolbox CentralCamera предоставляет метод visjac_p для но мы используем верхнюю черту, вычисления якобиана изображения, и для приведенного выше чтобы показать, примера он будет следующим: что координаты относятся к главной >> J = cam.visjac_p([672; 672], 5) точке, а не к началу изображения, J = -160 0 32 32 -832 160 которое обычно находится в верхнем 0 -160 32 832 -32 -160 левом углу. где первый аргумент – координата значимой точки в пикселях, а второй – глубина точки. Приблизительные значения, которые мы вычислили ранее, появляются в столбцах один, три и четыре соответственно. Для заданной скорости камеры скорость точки является функцией координаты точки, ее глубины и параметров камеры. Каждый столбец якобиана указывает скорость характерной точки изображения, создаваемую одной единицей соответствую­щего компонента вектора скорости. Метод flowfield класса Central- 372 Глава 6 · Формирование изображения Camera показывает скорость плоскости изображения для сетки точек мира, спроецированных на плоскость изображения для определенной скорости камеры. Для поступательной скорости камеры в направлении x поле скорости имеет вид >> cam.f lowf ield( [1 0 0 0 0 0] ); как показано на рис. 6.31a. Как и ожидалось, перемещение камеры вправо приводит к тому, что все характерные точки перемещаются влево. Движение точек на плоскости изображения называют оптическим потоком (optical flow). Он может быть вычислен из последовательностей изображений, как будет показано в разделе 7.7.4. Уравнение (6.27) часто называют уравнением оптического потока. Для перемещения в направлении z >> cam.flowfield( [0 0 1 0 0 0] ); точки исходят наружу от главной точки – эффект искривления «Звездного пути» – как показано на рис. 6.31e. Вращение вокруг оси z >> cam.flowfield([0 0 0 0 0 1] ); заставляет точки изображения вращаться вокруг главной точки, как показано на рис. 6.31f. Вращательное движение вокруг оси y >> cam.flowfield( [0 0 0 0 1 0] ); показано на рис. 6.31b и очень похоже на случай переноса по оси x с небольшой кривизной для точек, удаленных от главной точки. Это сходство связано с тем, что первый и пятый столбцы якобиана изображения в этом случае примерно равны. Для точки, проецирующейся на центр изображения (главную точку) и находящейся на глубине 1 м, визуальный якобиан равен >> cam.visjac_p(cam.pp', 1) ans = -800.0000 0 0 -800.0000 0 0 0 -800.0000 800.0000 0 0 0 и мы видим, что первый и пятый столбцы точно совпадают. Это означает, что перемещение в направлении x вызывает такое же движение изображения, как и вращение вокруг оси y. Вы можете легко продемонстрировать эту эквивалентность, наблюдая за тем, как движется мир, если вы переместите голову вправо или повернете ее вправо – в обоих случаях кажется, что мир движется влево. По мере увеличения фокусного расстояния пятый столбец Дополнительные темы 373 приближается к скалярному умножению первого столбца. Мы можем легко продемонстрировать это, увеличив фокусное расстояние до f = 20 мм (фокусное расстояние по умолчанию равно 8 мм), и поле потока >> cam.f = 20e-3; >> cam.f lowf ield( [0 0 0 0 1 0] ); показанное на рис. 6.31c, будет почти идентично показанному на рис. 6.31a. И наоборот, для малых фокусных расстояний (широкоугольные камеры) движение изображения из-за этих движений камеры будет более непохожим: >> cam.f = 4e-3; >> cam.f lowf ield( [0 0 0 0 1 0] ); Наша зрительная и, как показано на рис. 6.31d, кривизна гораздо более выражена. система использует То же самое относится ко второму и четвертому столбцам, за дополнительную информацию от исключением разницы в знаках – существует эквивалентность внутренних биоло- между перемещением в направлении y и вращением вокруг гических сенсоров, оси x . чтобы помочь разМатрица Якоби уравнения (6.27) обладает некоторыми интерешить эту двусмысленность, – пропри- ресными свойствами. Он вообще не зависит от мировых коороцепции от мышц динат X или Y, а только от координат плоскости изображения нашего тела, а также оценки движения (u, v). Однако первые три столбца зависят от глубины точки Z, от инерциальных и это отражает тот факт, что для движущейся камеры скорость датчиков в нашей плоскости изображения обратно пропорциональна глубине. Вы вестибулярной системе. можете легко продемонстрировать это себе – наклоните голову вбок и заметьте, что ближние предметы больше двигаются в вашем поле зрения, чем дальние. Однако, если вы поворачиваете голову, все предметы, близкие и дальние, перемещаются в вашем поле зрения одинаково. Ранг не может быть Матрица имеет ранг 2 и, следовательно, имеет нульменьше 2, даже пространство (null space) размерности 4. Нуль-пространство если Z → ∞. содержит набор векторов пространственной скорости, которые по отдельности или в любой линейной комбинации не вызывают движения изображения. Рассмотрим простой случай мировой точки, лежащей на оптической оси, которая проецируется в главную точку: >> J = cam.visjac_p(cam.pp', 1); v (пиксели) 374 Глава 6 · Формирование изображения u (пиксели) b u (пиксели) u (пиксели) d u (пиксели) u (пиксели) f u (пиксели) v (пиксели) a v (пиксели) c e Рис. 6.31. Векторы скорости в плоскости изображения для канонических скоростей камеры, где все соответствующие мировые точки лежат во фронто-параллельной плоскости: a) перемещение по оси x; b) вращение по оси y, f = 8 мм; c) вращение по оси y, f = 20 мм; d) вращение по оси y, f = 4 мм; e) перемещение по оси z; f) вращение по оси z. Обратите внимание, что векторы потока нормализованы – они показаны в правильном относительном масштабе в пределах каждого участка, но не между участками Нуль-пространство якобиана: >> null(J) ans = 0 0 -0.7071 0 Подведение итогов 375 0 1.0000 0 0 0 0.7071 0 0.7071 0 0 0 0 0 0 0 0 0.7071 0 0 1.0000 Первый столбец показывает, что движение в направлении z по лучу к точке не приводит к движению изображения, как и вращение вокруг оси z, как указано в четвертом столбце. Столбцы два и три более сложны, сочетая вращение и перемещение. По сути, они используют упомянутую выше неоднозначность движения изображения. Поскольку смещение по оси x вызывает такое же движение изображения, как и вращение по оси y, столбец 3 указывает, что, если одно из них положительное, а другое отрицательное, результирующее движение изображения будет нулевым, т. е. смещение влево и вращение вправо. Мы можем рассмотреть движение двух точек, складывая их якобианы чтобы получить матрицу 4´6, которая будет иметь нульпространство с двумя столбцами. Одно из этих движений камеры соответствует вращению вокруг линии, соединяющей две точки. Для трех точек (6.29) матрица будет полноранговой невырожденной, пока точки не совпадают или не лежат на одной прямой. 6.7 Подведение итогов Мы обсудили первые шаги процесса компьютерного зрения – формирование изображения мира и его преобразование в мас- 376 Глава 6 · Формирование изображения сив пикселей, составляющих цифровое изображение. Знакомые нам изображения – это перспективные проекции мира, в которых три измерения сжаты в два. Это приводит к неоднозначности в отношении размера объекта – большой объект на расстоянии выглядит так же, как маленький объект вблизи. Прямые линии и коники не изменяются в этой проекции, но происходит искажение формы – параллельные прямые могут казаться сходящимися, а окружности могут выглядеть как эллипсы. Мы смоделировали процесс формирования перспективы и описали его с по­мощью 11 параметров – внутренних и внешних. Геометрическая дисторсия объектива добавляет в систему дополнительные параметры. Калибровка камеры представляет собой процесс оценки этих параметров. Мы рассмотрели два подхода к калибровке, а также обсудили вычисление положения, когда положение объекта с известной геометрией можно найти по перспективной проекции, полученной с по­мощью калиброванной камеры. Перспективные изображения ограничены полем зрения, и мы обсудили несколько широкоугольных зрительных систем, основанных на объективе «рыбий глаз», катадиоптрических камерах и массивах камер. Мы также обсудили идеальную широкоугольную камеру – сферическую, которая в настоящее время все еще остается теоретической конструкцией. Однако ее можно использовать в качестве промежуточного представления в унифицированной модели изображения, которая обеспечивает одну модель почти для всех геометрий камеры. Мы использовали унифицированную модель обработки изображений для преобразования изображения камеры «рыбий глаз» в сферическое изображение, а затем в перспективное изображение вдоль заданной оси обзора. Наконец, вы узнали о некоторых последних разработках в области камер, таких как массивы панорамных камер и камеры светового поля. Фотограмметрия – это наука о понимании геометрии мира по изображениям. Эти методы были разработаны французским инженером Эме Лосседа (1819–1907), работавшим в Инженерном корпусе армии в 1850-х гг. Он изготовил первую измерительную камеру и разработал математический анализ фотографий как перспективных проекций. Он был пионером в использовании аэрофотосъемки в качестве инструмента для съемки Парижа с крыш высоких зданий, а также беспилотных воздушных шаров и воздушных змеев. Фотограмметрия обычно связана с созданием карт из изображений, полученных с большого расстояния, но раздел ближней или наземной фотограмметрии работает с расстоянием от камеры до объекта менее 100 м, что имеет непосредственное отношение к робототехнике. (Изображение из La Métrophotographie, Aimé Laussedat, 1899 г.) Подведение итогов 377 В этой главе мы рассматривали отображение как чисто геометрическую задачу с небольшим количеством мировых точек или отрезков. В следующей главе мы обсудим взаимосвязь между изображениями сцен, наблюдаемых с разных точек зрения. Дополнительное чтение и ресурсы Учебники по компьютерному зрению, написанные Желиски (Szeliski, 2011 г.), Хартли и Зиссерманом (Hartley and Zisserma, 2003 г.), Форсайтом и Понке (Forsyth and Ponce, 2011 г.) и Гонзалезом и Вудсом (Gonzalez and Woods, 2008 г.), содержат более глубокое освещение тем, представленных в этой главе. Многие темы геометрического компьютерного зрения также изучались фотограмметрическим сообществом, но у них в ходу другие термины. Например, калибровка камеры называется резекцией камеры, а оценка положения – резекцией пространства. Обновленный классический учебник ДеВитта и Вольфа (DeWitt and Wolf, 2000) представляет собой тщательное и легко читаемое введение в фотограмметрию. Калибровка камеры. Калибровка гомогенного преобразования (Sutherland, 1974) из раздела 6.2.1 в фотограмметрической литературе также известна как прямое линейное преобразование (direct linear transform, DLT). Реализация функции camcald в Toolbox требует, чтобы центроиды калибровочных маркеров уже были определены, что является нетривиальной проблемой (Corke 1996b, § 4.2). Этот метод также не может оценить дисторсию объектива. Вольф (Wolf, 1974) описывает расширения линейной калибровки камеры с моделями, которые включают до 18 параметров и подходящие методы оценки нелинейной оптимизации. Более краткое описание нелинейной калибровки предоставлено Форсайтом и Понке (Forsyth and Ponce, 2011). Хартли и Зиссерман (Hartley and Zisserman, 2003) описывают, как можно получить модель линейной калибровки, используя такие признаки, как линии в сцене. В интернете есть несколько хороших наборов инструментов для калибровки камеры. MATLAB Toolbox, обсуждаемый в разделе 6.2.4, написан Жан-Ивом Буге и доступен по адресу http:// www.vision.caltech.edu/bouguetj/calib_doc. Он имеет обширную онлайн-документацию и включает примеры калибровочных изображений, которые использовались в разделе 6.2.4. Несколько инструментов автоматически находят клетчатую мишень, которую в противном случае было бы утомительно находить на каждом изображении. Например, это наборы инструментов AMCC и RADOCC и приложение MATLAB Camera Calibrator, входящее в состав Computer Vision System Toolbox™. MATLAB 378 Глава 6 · Формирование изображения Toolbox Янне Хейккиля доступен по адресу http://www.ee.oulu. fi/~jth/calibr/ и работает с плоскими или трехмерными мишенями с круглыми точками и оценивает дисторсию объектива. Оценка положения – классическая и сложная задача компьютерного зрения, которой посвящено очень много публикаций. Подходы к решению этой задачи можно разделить на аналитические и итерационные. Предполагая, что дисторсия объектива была скорректирована, Фишлер и Боллес (Fischler and Bolles, 1981), ДеМентон и Дэвис (DeMenthon and Davis, 1992) и Хоро и соавт. (Horaud et al., 1989) предлагают аналитические решения для трех и четырех неколлинеарных точек. Обычно существует несколько решений, но для четырех копланарных точек существует единственное решение. Шесть и более точек всегда дают уникальные решения, а также внутренние параметры калибровки камеры. Итеративные решения были описаны Розенфельдом (Rosenfeld, 1959) и Лоу (Lowe, 1991). Более позднее обсуждение, основанное на концепции корректировки пучка, проведено у Триггса и соавт. (Triggs et al., 2000). Оценка положения в Toolbox представляет собой оболочку функции эффективной неитеративной оценки положения по n точкам в перспективе, описанной у Лепти и соавт. (Lepetit et al., 2009) и доступной на http://cvlab.epfl.ch/EPnP. Для оценки положения требуется геометрическая модель объекта, и такие подходы компьютерного зрения известны как зрение на основе моделей. Интересный исторический обзор моделирования зрения представлен в видео 1987 г. Джо Манди (Joe Mundy), которое доступно по адресу http://www.archive.org/details/JosephMu1987. Камеры с широким углом обзора. Интерес к этому типу камер растет в последнее время, и сегодня доступны высококачественные легкие объективы типа «рыбий глаз» и системы катадиоптрических камер. Наяр (Nayar, 1997) дает прекрасные пояснения и введение в широкоугольные системы получения изображений. Очень полезным онлайн-ресурсом является страница проектирования катадиоптрических сенсоров по адресу http://www.math.drexel.edu/~ahicks/design и страница со ссылками на исследовательские группы, компании и семинары по адресу http://www.cis.upenn.edu/~kostas/omni.html. Равноугольные зеркальные системы были описаны Чалом и Шривасаном (Chahl and Srinivasan, 1997) и Оллисом с соавт. (Ollis et al., 1999). Природный орган, глаз-гребешок на основе отражателя, описан в статье Коликьи и соавт. (Colicchia et al., 2009). Начиная с 2000 г. был проведен ряд семинаров по всенаправленному зрению, и их материалы могут служить полезным введением в эту область. Книга Даниилидиса и Клетта (Daniilidis and Klette, 2006) представляет собой сборник статей по неперспективным изображениям, а книга Беносмана и Канга (Benosman and Kang, Подведение итогов 379 2001) – еще один, опубликованный немного раньше сборник статей. Некоторая информация доступна через CVonline по адресу http://homepages.inf.ed.ac.uk/rbf/CVonline в разделе Ima­ ge Physics («Физика изображения»). Набор инструментов MATLAB Toolbox для калибровки широкоугольных камер, разработанный Дэвидом Скарамуцца (Davide Scaramuzza) доступен по адресу https://sites.google. com/site/scarabotix/ocamcalib-toolbox. Он аналогичен набору инструментов Bouguet для перспективных камер. Другой набор инструментов MATLAB Toolbox, созданный Юхо Каннала (Juho Kannala), поддерживает работу с широкоугольными центральными камерами и доступен по адресу http://www.ee.oulu. fi/~jkannala/calibration. Унифицированная модель визуализации в контексте катадиоптрических камер была представлена Гейером и Даниилидисом (Geyer and Daniilidis, 2000). Позже Ин и Ху показали (Ying and Hu, 2004), что многие камеры типа «рыбий глаз» также могут быть описаны этой моделью. Калибровка камеры «рыбий глаз» в разделе 6.4.1 была описана Хансеном и соавт. (Hansen et al., 2010), которые оценивают ℓ и m, а не многочлен функция r(θ), как это делает приложение Скарамуццы. Существует огромное и постоянно растущее количество пуб­ ликаций по изображениям камер светового поля, но до сих пор нет учебника. Отличным введением в световые поля и их применение в робототехнике является диссертация Дансеро (Dansereau, 2014). У того же автора есть инструмент MATLAB, доступный по адресу http://mathworks.com/matlabcentral/fileexchange/49683. Интересное описание первого массива камер дано в статье Уилбурна и соавт. (Wilburn et al., 2005), а сопровождающее видео демонстрируют обширные возможности камер такого типа. Съемка в световом поле – это подмножество более крупной и растущей области вычислительной фотографии. Примечания к инструментам Все классы камеры Toolbox CentralCamera, FishEyeCamera и SphericalCamera являются производными от абстрактного суперкласса Camera. Общие методы всех классов показаны в табл. 6.3. Вид виртуальной камеры ведет себя аналогично фигуре в MATLAB. По умолчанию plot и mesh будут перерисовывать вид камеры. Если вид камеры не существует, он будет создан. Методы clf и hold аналогичны командам MATLAB clf и hold. Конструктор всех классов камер принимает ряд аргументов опций, перечисленных в табл. 6.4. Конкретные подклассы камер имеют уникальные параметры, которые описаны в онлайн-документации. Без аргументов параметры CentralCamera 380 Глава 6 · Формирование изображения по умолчанию настроены для изображения 1024´1024 объектива с фокусным расстоянием 8 мм и квадратных пикселей 10 мкм. Если главная точка не задана явно, предполагается, что она находится в середине плоскости изображения. Таблица 6.3. Общие методы для всех классов камер Toolbox Метод p = cam.project(P) cam.plot(P) cam.mesh(X, Y, Z) cam.showpose(T) cam.clf cam.hold cam.name cam.T Описание Проецирует мировую точку P на плоскость изображения p Строит мировые точки, определенные столбцами P Строит сетку, определенную X, Y и Z Показывает камеру в указанном положении Сбрасывает текущий вид камеры Сохраняет текущий вид камеры, следующие вызовы plot добавляются к виду камеры Свойство: имя камеры Свойство: преобразование камеры по умолчанию (чтение и запись) Таблица 6.4. Общие параметры конструкторов классов камер Параметр Описание 'name', name Название камеры, которое отображается в заголовке окна 'resolution', npix Размеры изображения. npix – скаляр для квадратного изображения, или двухмерный вектор 'centre', pp Координаты главной точки 'pixel', rho Размеры пикселя. rho – скаляр для квадратного пикселя, или двухмерный вектор 'noise', sigma Стандартное отклонение гауссового шума, добавляемого к координатам плоскости изображения 'pose', T Положение камеры по умолчанию (показано на рис. 11.2) 'image', im Задает размер плоскости изображения в соответствии с размерностью изображения и отображает изображение Упражнения 1. Создайте центральную камеру и мишень в виде куба и визуализируйте их для различных положений камеры и куба. Создайте и визуализируйте различные формы 3D-сетки, например сгенерированные функциями cylinder и sphere MATLAB. 2. Напишите скрипт, чтобы камера двигалась по орбите вокруг куба и всегда была направлена в сторону центра куба. 3. Напишите скрипт для полета камеры через куб. 4. Создайте центральную камеру с дисторсией объектива, которая видит плоскую сетку точек 10´10. Измените параметры искажения и посмотрите, как это повлияет на форму проецируемой сетки. Создайте подушкообразную и бочкообразную дисторсию. 5. Повторите упражнение по калибровке гомогенной камеры, описанное в разделе 6.2.1, и декомпозицию в разделе 6.2.2. Подведение итогов 381 Исследуйте влияние количества точек калибровки, шума и искажений камеры на невязку калибровки и расчетное положение мишени. 6. Определите телесный угол для прямоугольного пирамидального поля зрения, образующего углы θh и θv. 7. Выполните пример 1 из набора инструментов для калибровки камеры Bouguet. 8. Откалибруйте камеру на своем компьютере. 9. Выведите уравнение 6.14. 10. Для примера декомпозиции матрицы калибровки камеры (раздел 6.2.2) определите ошибку ориентации по кренутангажу-рысканию между истинным и предполагаемым положением камеры. 11. Оценка положения (раздел 6.2.3). a. Повторите упражнение по оценке положения для разных положений объекта (ближе, дальше). b. Повторите упражнение для разных уровней шума камеры. c. Что происходит, когда количество точек уменьшается? d. Противодействует ли увеличение количества точек эффекту увеличения шума? e. Измените внутренние параметры камеры перед вызовом метода estpose. Каков эффект изменения фокусного расстояния и главной точки, скажем, на 5 %? 12. Повторите упражнения 2 и 3 для камеры «рыбий глаз» и сферической камеры. 13. Выведите функцию ψ(θ) для параболического зеркала, используя рис. 6.19. 14. Выведите уравнение равноугольного зеркала z(x) в xzплоскости, используя рис. 6.19. 15. Квадрики. a. Напишите программу для построения квадрики по матрице 4´4. Подсказка: используйте meshgrid и isosurface. b. Напишите код для вычисления квадратичной матрицы для сферы в произвольном месте и произвольного ра­ диуса. c. Напишите код для вычисления квадратичной матрицы для произвольного круглого цилиндра. d. Напишите числовой код MATLAB для построения плоского конического сечения, описанного матрицей 3´3. 16. Спроецируйте эллипсоидальную или сферическую квадрику на плоскость изображения. Результатом будет неявное уравнение для конуса – напишите код для построения неявного уравнения. Глава 7 Использование нескольких изображений В предыдущей главе говорилось о детекторах углов, которые находят характерные точки сцены. Эти точки могут быть надежно обнаружены в разных видах одной и той же сцены независимо от угла обзора или условий освещения. Такие точки характеризуются высокими градиентами изображения в ортогональных направлениях и обычно располагаются на углах объектов. Однако трехмерная координата соответствующей мировой точки была потеряна в процессе перспективной проекции, которую мы обсуждали в главе 6, – мы сопоставили трехмерную мировую точку с двухмерной координатой изображения. Нам только известно, что мировая точка лежит на некотором луче в пространстве, соответствующем координате пикселя, как показано на рис. 6.6. Чтобы восстановить недостающее третье измерение, нам нужна дополнительная информация. В разделе 6.2.3 дополнительной информацией были параметры калибровки камеры плюс геометрическая модель объекта, что позволило нам оценить трехмерное положение объекта по данным двухмерного изображения. В этой главе мы рассмотрим альтернативный подход, при котором дополнительная информация поступает из нескольких видов одной и той же сцены. Как уже упоминалось, координаты пикселей, полученные из одного ракурса съемки, говорят нам лишь о том, что мировая точка лежит на некотором луче. Если мы сможем найти ту же мировую точку на другом изображении, полученном для иного, но известного положения, то сможем определить второй луч, на котором должна лежать эта мировая точка. Тогда истинным положением мировой точки будет пере- Глава 7 · Использование нескольких изображений 383 сечение этих двух лучей – процесс, называемый триангуляцией Почти! Мы можем или трехмерной реконструкцией. Более того, если мы наблюдаопределить переем достаточное количество точек, то можем оценить трехмермещение камеры только до неизвест- ное движение камеры между ракурсами, а также трехмерную ного масштабного структуру мира . коэффициента, т. е. Основная задача состоит в том, чтобы найти одну и ту же это перемещение 3 точку мира на нескольких изображениях. Это важная, но неλt ∈ � , где направление t известно, тривиальная задача сопоставления, которую мы обсудим а λ – нет. в разделе 7.1. В разделе 7.2 мы возвращаемся к фундаментальным геометрическим принципам формирования изображения, представленным в главе 6 для случая одной камеры. Если вы еще не читали эту главу или читали ее уже давно, было бы полезно (повторно) ознакомиться с этим материалом. Эта геометрическая схема будет расширена, чтобы охватить несколько плоскостей изображения и показать взаимосвязь между изображениями в стереопаре. Стереозрение – важный метод робототехники, при котором информация из двух изображений сцены, снятых с разных точек зрения, объединяется для определения трехмерной структуры мира. Мы подробно рассмотрим разреженный и плотный подходы к стереозрению и реконструкции в разделе 7.3. Групповая связка – очень обобщенный подход к объединению информации со многих камер, он представлен в разделе 7.4. Создаваемая трехмерная информация обычно представляется в виде облака точек – набора трехмерных точек, – а методы подгонки и объединения таких данных представлены в разделе 7.5. Для некоторых приложений мы можем использовать камеры RGBD, которые возвращают информацию о глубине и цвете. Основной принцип работы камеры структурированного света представлен в разделе 7.6. Эту главу и эту часть книги завершают четыре примера приложений, основанных на рассмотренных ранее концепциях. Раздел 7.7.1 описывает, как можно преобразовать изображение с очевидным искажением перспективы в изображение без искажения, синтезируя другой ракурс виртуальной камеры. В разделе 7.7.2 описывается создание мозаики, т. е. процесс получения последовательных изображений с движущейся камеры и объединения их для формирования одного большого виртуального изображения. В разделе 7.7.3 описывается поиск изображения из существующего набора, которое больше всего похоже на какое-то новое изображение. Робот может использовать этот прием, чтобы определить, посещал ли он конкретное место или видел тот же объект раньше. В разделе 7.7.4 рассказано, как можно обработать последовательность изображений с движущейся камеры, чтобы найти совпадающие точки мира и оценить движение камеры и трехмерную структуру мира. 384 Глава 7 · Использование нескольких изображений 7.1 Cовмещение признаков Совмещение признаков (feature correspondence) – это задача нахождения координат пикселей на двух разных изображениях, Это разновидность соответствующих одной и той же точке мира . Рассмотрим задачи объединения данных. пару реальных изображений: >> im1 = iread('eiffel2-1.jpg', 'mono', 'double'); >> im2 = iread('eiffel2-2.jpg', 'mono', 'double'); на рис. 7.1. Они показывают одну и ту же сцену, просматриваемую с двух разных ракурсов с по­мощью двух разных камер – размер пикселя, фокусное расстояние и количество пикселей для каждого изображения сильно различаются. Сцены сложные, и мы сразу видим, что поиск взаимного соответствия характерных точек не является тривиальным. Более половины пикселей в каждой сцене соответствуют голубому небу, и невозможно сопоставить синий пиксель на одном изображении с соответствующим синим пикселем на другом – эти пиксели недостаточно различимы. Это вполне обычная ситуация, которая может возникнуть с однородными областями изображения, такими как темные тени, ровная поверхность воды, снега или гладких искусственных объектов, таких как стены или кузова автомобилей. Решение состоит в том, чтобы выбрать только те точки, которые являются характерными. Мы можем использовать детекторы характерных точек, которые рассмотрели в предыдущей главе, чтобы найти угловые признаки Харриса: v (пиксели) v (пиксели) >> hf = icorner(im1, 'nfeat', 200); >> idisp(im1, 'dark'); hf.plot('gs'); а u (пиксели) b u (пиксели) Рис. 7.1. Два вида на Эйфелеву башню. Изображения были сняты примерно одновременно с по­мощью двух разных портативных цифровых камер: a) 7-мегапиксельной камеры с f = 7.4 мм; b) 10-мегапиксельной камеры с f = 5.2 мм (фото Люси Корк). Изображения имеют совершенно разный масштаб, высота башни 700 и 600 пикселей на (а) и (b) соответственно. Камеру, снявшую изображение (b), держит человек в правом нижнем углу (а) Cовмещение признаков 385 Детектор SURF не или признаки SURF может обрабатывать цветное изображе- >> sf = isurf(im1, 'nfeat', 200); ние, он преобразует >> idisp(im1, 'dark'); sf.plot_scale('g'); его в оттенки серого. Детектор Харриса Они показаны на рис. 7.2. Мы упростили задачу – вместо вычисляет квадраты градиентов для миллионов пикселей у нас всего 200 характерных точек. отдельных цветовых Рассмотрим общий случай двух наборов точек признаков: плоскостей по от- 1 2 … N1} на первом изображении и {2pj ∈ �2, j = 1 … N2} дельности, а затем { pi ∈ � , i = 1 объединяет их. Все на втором. Поскольку это отличительные точки изображения, детекторы в Toolbox мы ожидаем, что значительное количество точек на первом могут обрабатывать последовательность изображении будет соответствовать точкам, найденным на изображений, пред- втором. Задача состоит в том, чтобы определить, какие точки ставленную в виде 2 2 ( uj, vj) соответствуют точкам (1ui, 1vi). матрицы с более Мы не можем использовать для определения соответствия чем двумя измерениями. Существует координаты признаков – признаки будут иметь разные коорнеоднозначность динаты на каждом изображении. Например, на рис. 7.1 мы вимежду цветным изображением дим, что большинство признаков расположены ниже на правом и последователь- изображении. Мы также не можем использовать интенсивность ностью из трех или цвет пикселей. Различия в балансе белого, освещении и наизображений. Если третье измерение стройках экспозиции делают маловероятным совпадение знаизображения равно чений соответствующих пикселей. Даже если исключить изметрем, оно считается нение интенсивности, на другом изображении, вероятно, будут цветным изображением, а не по- десятки тысяч пикселей с точно таким же значением интенсивследовательностью. ности – оно недостаточно уникально. Нам нужен более надежЧетырехмерное ный способ описания каждого признака. изображение одноНа практике принято описывать область пикселей вокруг значно определяется как последователь- угловой точки, предоставляя четкое и уникальное описание ность цветных угловой точки и ее непосредственного окружения – дескриптор изображений. признака. В Toolbox дескриптор признака для угловой точки а v (пиксели) v (пиксели) Рис. 7.2. представляет собой вектор – свойство descriptor суперкласса Характерные точки, найденные PointFeature. Для угла Харриса используется дескриптор для рис. 7.1a: а) угловые признаки >> hf(1).descriptor' Харриса; b) угловые ans = признаки SURF, 0.0805 0.0821 0.0371 показывающие масштаб u (пиксели) b u (пиксели) 386 Глава 7 · Использование нескольких изображений представляющий собой трехмерный вектор, содержащий уникальные элементы структурного тензора (5.14). Этот дескриптор низкой размерности не требует больших вычислительных затрат, поскольку элементы уже были рассчитаны для определения надежности (силы) угла. Эти элементы дескриптора представляют собой градиенты, преимущество которых заключается в том, что они устойчивы к смещениям интенсивности изображения. Сходство двух дескрипторов основано на евклидовом расстоянии и равно нулю при идеальном совпадении. Допустим, сходство угловых признаков один и два равно >> hf(1).distance( hf(2) ) ans = 0.0518 но из этого значения трудно понять, представляет ли это значение сильное сходство, или нет. Обычно мы сравниваем признак 1fi ∈ �M со всеми признаками другого изображения {2fi ∈ �M, j = 1 ⋯ N2} и выбираем тот, который наиболее похож . Однако Если соответствуютакой короткий вектор дескриптора все еще недостаточно на- щая мировая точка не видна на втором дежен и склонен к неправильному сопоставлению. Дескрипто- изображении, то наиболее похожий ры признаков часто называют векторами признаков. Мы можем создать большой вектор-дескриптор, представив признак будет неправильным квадратное окно вокруг характерной точки в виде вектора. На- совпаде­нием. пример, код >> hf = icorner(im1, 'nfeat', 200, 'color', 'patch', 5) создает вектор дескриптора из 121 элемента для каждой угловой точки, входящей в окно заданной полуширины вокруг характерной точки – в данном случае окно 11´11. Значения пикселей смещаются на среднее значение, преобразуются в вектор, а затем нормализуются для создания единичного вектора. Мы можем использовать меру сходства ZNCC из табл. 4.1 в одномерной форме, чтобы сравнить эти векторы дескрипторов: (7.1) которые мы разложили в скалярное произведение единичных векторов дескриптора, связанных с каждым патчем изображения. Определение сходства двух дескрипторов с использованием нормализованной взаимной корреляции – это просто Cовмещение признаков 387 скалярное произведение двух дескрипторов, и результирующая мера сходства s ∈ [−1, 1] имеет определенное значение – идеальное совпадение при s = 1, а s ≥ 0.8 обычно считается просто хорошим совпадением. Если вернуться к предыдущему примеру, то >> hf(1).ncc( hf(2) ) ans = -0.0292 показатель корреляции указывает на плохое совпадение. Этот дескриптор обладает хорошей различающей способностью и инвариантен к изменениям интенсивности изображения, но не инвариантен к масштабу или повороту. К другим дескрипторам окружающей области, которые мы могли бы использовать, относятся последовательные и ранговые значения, а также гистограммы интенсивности или цвета. Преимущество гистограмм в том, что они инвариантны к вращению, но они ничего не говорят о пространственных отношениях между пикселями, т. е. одни и те же значения пикселей в совершенно другом пространственном расположении дают одну и ту же гистограмму. 128-элементный Алгоритм SURF вычисляет вектор дескриптора из 64 элевектор можно ментов для описания характерной точки таким образом, котосоздать, передав опцию 'extended' рый не зависит от масштаба и поворота, на основе пикселей в isurf. в пределах опорной области признака. Он создается из изображения в последовательности масштабного пространства, соответствующей масштабу объекта, и поворачивается в соответствии с ориентацией объекта. Вектор приводится к единичному вектору, чтобы повысить его инвариантность к изменениям интенсивности изображения. Сходство между дескрипторами основано на евклидовом расстоянии. Этот дескриптор совершенно инвариантен к интенсивности, масштабу и повороту изображения. SURF – это и детектор углов, и дескриптор, тогда как оператор Харриса – это просто детектор углов, который необходимо использовать с одним из множества различных деМожно использо- скрипторов . вать дескриптор В оставшейся части этой главы мы будем использовать приSURF с угловой точкой Харриса. знаки SURF. Они более затратны в вычислительном отношении, но окупаются с точки зрения качества совпадения между совершенно разными видами одной и той же сцены. Вычислив признаки SURF для каждого изображения >> sf1 = isurf(im1) sf1 = 1288 features (listing suppressed) Properties: theta image_id scale u v strength descriptor >> sf2 = isurf(im2) sf2 = 1426 features (listing suppressed) Properties: theta image_id scale u v strength descriptor 388 Глава 7 · Использование нескольких изображений получим два вектора объектов SurfPointFeature. На каждом изображении было обнаружено более тысячи угловых признаков. Детекторы или дескрипторы? При сопоставлении характерных точек мира (ориентиров) между разными ракурсами мы должны сначала найти точки, которые заслуживают внимания. Это работа детектора, результатом которой является координата точки (u, v) и, возможно, масштабный коэффициент или ориентация. Вторая задача состоит в том, чтобы описать область вокруг точки таким образом, чтобы ее можно было как можно точнее сопоставить с областью вокруг соответствующей точки в другом изображении. Это дескриптор, который обычно представляет собой длинный вектор, сформированный из значений пикселей, гистограмм, градиентов, гистограмм градиента и т. д. Существует широкий выбор детекторов: алгоритм Харриса и его варианты, алгоритм Ши–Томаси, FAST, AGAST, MSER и т. д.; и не менее широкий выбор дескрипторов: ORB, BRISK, FREAK, CenSurE (он же STAR), HOG, ACF и т. д. Некоторые алгоритмы, такие как SIFT и SURF, определяют и детектор, и дескриптор. Дескриптор SIFT является разновидностью дескриптора HOG. Теперь сопоставим два набора признаков SURF на основе расстояния между дескрипторами SURF: >> m = sf1.match(sf2) m = 644 сопоставленных точки (полный вывод скрыт) что дает нам вектор объектов FeatureMatch, который представляет 644 кандидата на совпадающие точки. Первые пять совпадеМы называем ний-кандидатов : >> m(1:5) ans = (819.56, 358.557) <-> (708.008, 563.342), dist=0.002137 (1028.3, 231.748) <-> (880.14, 461.094), dist=0.004057 (1027.6, 571.118) <-> (885.147, 742.088), dist=0.004297 (927.724, 509.93) <-> (800.833, 692.564), dist=0.004371 (854.35, 401.633) <-> (737.504, 602.187), dist=0.004417 В каждой строке показаны координаты признака на первом и втором изображениях, а также евклидово расстояние между двумя векторами признаков. Совпадения упорядочены по уменьшению сходства, и был применен порог сходства признаков. Мы можем наложить подмножество этих совпадений на исходную пару изображений: >> idisp({im1, im2}, 'dark') >> m.subset(100).plot('w') их кандидатами, потому что, хотя они, скорее всего, совпадают, это еще не подтверждено. Cовмещение признаков 389 Рис. 7.3. Взаимное соответствие признаков. Выбрано подмножество (100 из 1664) совпадений на основе схожести дескрипторов SURF. Отметим, что некоторые совпадения явно неправильные v (пиксели) Результат показан на рис. 7.3. Белые линии соединяют совпадающие признаки на каждом изображении, и отчетливо просматривается устойчивая закономерность. Большинство из этих связей выглядят вполне обоснованными, но некоторые из них явно неверны, и мы вскоре рассмотрим их. Обратите внимание, что мы передали idisp массив ячеек с изображениями, которые он отображает в виде горизонтальной мозаики как единое изображение. Метод subset класса FeatureMatch возвращает вектор с указанным числом объектов FeatureMatch, равномерно выбранных из исходного вектора. Если бы все соответствия были показаны, мы бы увидели сплошную белую массу. u (пиксели) Нужное количество совпадений можно вывести на экран: >> [m,corresp] = sf1.match(sf2); >> corresp(:,1:5) ans = 215 389 357 246 418 312 1044 1240 853 765 Фактически это матрица с одним столбцом на соответствие. В первом столбце указано, что признак 215 на первом изображении соответствует признаку 246 на втором и т. д. С точки зрения переменных рабочей области это sf1(215) и sf2(246). Евклидово расстояние между совпадающими дескрипторами признаков задается свойством distance, а их распределение без применения порогового значения равно >> m2 = sf1.match(sf2, 'all'); >> histogram(m2.distance, 'Normalization', 'cdf') как показано на рис. 7.4. Из гистограммы следует, что 35 % всех совпадений имеют расстояние между дескрипторами ниже 0.05, тогда как максимальное расстояние может быть более чем в десять раз больше, – такие совпадения с меньшей вероят­ ностью будут действительными. Мы можем указать пороговое значение расстояния 390 Глава 7 · Использование нескольких изображений >> mm = sf1.match(sf2, 'thresh', 0.05); но выбор оптимального порогового значения всегда проблематичен. По умолчанию метод выбирает все совпадения, расстояние которых меньше медианы всех расстояний. В качестве альтернативы можно взять N лучших совпадений: Интегральное распределение >> mm = sf1.match(sf2, 'top', N); Расстояние дескриптора SURF Рис. 7.4. Интегральное распределение расстояния между признаками Сопоставление признаков требует больших вычислительных ресурсов – это задача O(N 2), поскольку каждый дескриптор признака на одном изображении нужно сравнить с каждым дескриптором признака на другом изображении. Более сложные системы хранят дескрипторы в структуре данных, такой как kd-дерево, чтобы можно было легко найти похожие дескрипторы – ближайшие соседи в пространстве признаков. Хотя качество сопоставления, показанное на рис. 7.3, выглядит достаточно хорошим, в этом небольшом подмножестве есть несколько явно неверных совпадений. Мы можем различить закономерность в линиях, соединяющих совпадающие точки, они слегка сходятся и наклонены вниз вправо. Эта закономерность является следствием относительной разности положений камеры, и понимание данной закономерности является ключом к определению того, какие из возможных совпадений являются правильными. Этой теме посвящен следующий раздел. 7.2 Геометрия нескольких ракурсов Мы начнем с изучения геометрических отношений между изображениями одной точки P, наблюдаемыми с двух разных то- Геометрия нескольких ракурсов 391 чек зрения, как показано на рис. 7.5. Эта схема может представлять случай, когда две камеры одновременно просматривают одну и ту же сцену или одна движущаяся камера делает снимок Предположим, что с двух разных точек обзора . Центр каждой камеры – начаточка не движется. ло координат {1} и {2}, – а также мировая точка P определяют в пространстве эпиполярную плоскость (epipolar plane). Мировая точка P проецируется на плоскости изображения двух камер в точках 1p и 2p соответственно, и эти точки называются сопряженными. эпиполярная плоскость плос Рис. 7.5. Эпиполярная схема, показывающая две камеры со связанными координатными системами {1} и {2} и плоскостями изображения. Мировая точка P и центры двух камер образуют эпиполярную плоскость, а пересечение этой плоскости с плоскостями изображений образует эпиполярные линии кость изоб раже ния эпипо­ лярная линия ния раже б ь изо скост пло эпиполярная точка Рассмотрим первое изображение. Точка 1e изображения является признаком положения второй камеры. Точка 1p изображения является признаком мировой точки P. Центр камеры и точки 1e и 1p определяют эпиполярную плоскость и, следовательно, эпиполярную линию 2ℓ на втором изображении. По определению сопряженная точка 2p должна лежать на этой прямой. И наоборот, 1p должна лежать на эпиполярной линии на первом изображении 1ℓ, которая определяется точкой 2p на втором изображении. Это очень фундаментальное и важное геометрическое соотношение: если взять точку на одном изображении, нам известно, что ее сопряженная точка вынуждена лежать на определенной линии на другом изображении. Проиллюстрируем это на простом примере, имитирующем геометрию рис. 7.5: >> T1 = SE3(-0.1, 0, 0) * SE3.Ry(0.4); >> cam1 = CentralCamera('name', 'camera 1', 'default', ... ⮠ 'focal', 0.002, 'pose', T1) Этот код возвращает экземпляр класса CentralCamera, как обсуждалось ранее в разделе 6.1.2. Аналогично для второй камеры: 392 Глава 7 · Использование нескольких изображений >>>> T2 = SE3(0.1, 0,0)*SE3.Ry(-0.4); >> cam2 = CentralCamera('name', 'camera 2', 'default', ... ⮠ 'focal', 0.002, 'pose', T2); Визуализируем положение двух камер с по­мощью следующего кода: >> axis([-0.5 0.5 -0.5 0.5 0 1]) >> cam1.plot_camera('color', 'b', 'label') >> cam2.plot_camera('color', 'r', 'label') как показано на рис. 7.6. Определим произвольную мировую точку: >> P=[0.5 0.1 0.8]'; Отобразим ее как маленькую сферу >> plot_sphere(P, 0.03, 'b'); которая также показана на рис. 7.6. Проецируем эту точку на обе камеры >> p1 = cam1.plot(P) p1 = 561.6861 532.6079 >> p2 = cam2.plot(P) p2 = 746.0323 546.4186 Рис. 7.6. Моделирование двух камер и целевой точки. Исходные точки двух камер смещены по оси абсцисс, и камеры сближены, т. е. их оптические оси пересекаются Геометрия нескольких ракурсов 393 как показано на рис. 7.7. Эпиполи вычисляются путем проецирования центра каждой камеры на плоскость изображения другой камеры: >> cam1.hold >> e1 = cam1.plot( cam2.centre, 'Marker', 'd', ⮠ 'MarkerFaceColor', 'k') e1 = 985.0445 512.0000 >> cam2.hold >> e2 = cam2.plot( cam1.centre, 'Marker', 'd', ⮠ 'MarkerFaceColor', 'k') e2 = 38.9555 512.0000 v (пиксели) v (пиксели) Рис. 7.7. Моделирование эпиполярной схемы, показывающее плоскости виртуального изображения двух объектов Toolbox CentralCamera. Перспективная проекция точки P – черный кружок, проекция центра другой камеры – черный маркер ♦, а эпиполярная а линия показана красным Они показаны на рис. 7.7 черным маркером ♦. u (пиксели) 7.2.1 b u (пиксели) Фундаментальная матрица Эпиполярное отношение, показанное графически на рис. 7.5, может быть кратко и элегантно выражено в следующем виде: 2 T p̃ F 1p̃ = 0, (7.2) где 1p̃ и 2p̃ – точки изображения 1p и 2p, выраженные в однородной форме, а F ⊂ �3´3 называется фундаментальной матрицей. Мы можем переписать это выражение как 2 T 1 p̃ ℓ̃ = 0, (7.3) 394 Глава 7 · Использование нескольких изображений где 2 ℓ̃ ≃ F 1p̃ (7.4) 1 T (7.5) представляет собой уравнение эпиполярной линии, вдоль которой должна лежать сопряженная точка на втором изображении. Эта линия является функцией координаты точки 1p на первом изображении и уравнения (7.3) – мощный тест на то, является ли точка на втором изображении сопряженной. Выполнив транспонирование обеих частей уравнения (7.2), получаем p̃ F T 2p̃ = 0, откуда мы можем вывести эпиполярную линию для первой камеры 1 ℓ̃ ≃ F T 2p̃ (7.6) F ≃ K2–T[t ]´RK1–1, (7.7) Обратите внимание, Если оба изобраприменительно к точке обзора второй камеры. Фундаментальная матрица является функцией параметров жения были сняты одной и той же камеры и относительного положения камеры между видами камерой, то K1 = K2. где K1 и K2 – внутренние матрицы камеры, определенные в уравнении (6.7) , а 2ξ1 ∼ (R, t) – положение первой камеры относительно второй . Фундаментальная матрица, связывающая два вида, возвращается методом F класса CentralCamera, например >> F = cam1.F( cam2 ) F = 0 -0.0000 0.0010 -0.0000 0 0.0019 0.0010 0.0001 -1.0208 что это противоположно тому, что вы могли бы ожидать: вторая камера относительно первой, но с математической точки зрения так получается проще. Функции Toolbox всегда описывают положение камеры относительно мировой системы координат. Кратко о двухмерной проективной геометрии. Проективная плоскость ℙ2 – это множество всех точек (x1, x2, x3)T, xi ∈ � и xi не все равны нулю. Обычно трехэлементный кортеж считается вектором-столбцом. Точка p = (u, v) представлена в ℙ2 однородными координатами p̃ = (u, v, 1)T. Масштаб не имеет значения для однородных величин, и мы записываем это как p̃ ≃ λp̃, где оператор ≃ означает равенство с ненулевым масштабным коэффициентом (возможно, неизвестным). Точка в ℙ2 может быть представлена в неоднородной, или евклидовой, форме p = (x1/x3, x2 /x3)T в �2. Однородный вектор (u, v, f )T, где f – фокусное расстояние в пикселях, представляет собой вектор из начала координат камеры, указывающий на мировую точку P. Более подробная информация приведена в разделе приложения С.2. Функции e2h и h2e Toolbox преобразуют евклидовы и однородные координаты для точек (вектор-столбец) или наборов точек (матрица с одним столбцом на точку). Геометрия нескольких ракурсов 395 и для двух точек изображения, вычисленных ранее >> e2h(p2)' * F * e2h(p1) ans = 1.1102e-16 мы видим, что равенство 7.2 выполняется. Фундаментальная матрица обладает некоторыми интересными свойствами. Она вырожденная с рангом 2 >> rank(F) ans = 2 Матрица F ⊂ �3×3 и имеет семь степеней свободы . Эпиполи кодируются в нульимеет семь основ- пространстве матрицы. Эпиполь для первой камеры – это праных параметров, поэтому ее девять вое нуль-пространство F элементов не являются независимыми. >> null(F)' Общий масштаб ans = не определен, -0.8873 -0.4612 -0.0009 и существует ограничение, согласно в однородных координатах или которому det(F) = 0. >> e1 = h2e(ans)' e1 = 985.0445 512.0000 Это правое в евклидовых координатах – как показано на рис. 7.7. Эпиполь нуль-пространство для второй камеры – это левое нуль-пространство фундаментранспонированной матрицы. Функция тальной матрицы: MATLAB null возвращает правое >> null(F'); нуль-пространство. >> e2 = h2e(ans)' e2 = 38.9555 512.0000 Панель инструментов может отображать эпиполярные линии, используя методы plot_epiline класса CentralCamera >> cam2.plot_epiline(F, p1, 'r') которые показаны на рис. 7.7 красной линией в плоскости двух изображений камеры. Мы видим, как и ожидалось, что проекция P лежит на этой эпиполярной линии. Эпиполярная линия для первой камеры: >> cam1.plot_epiline(F', p2, 'r'); 396 Глава 7 · Использование нескольких изображений 7.2.2 Существенная матрица Эпиполярное геометрическое ограничение также может быть выражено через нормализованные координаты изображения: (7.8) 2 T x̃ E 1x̃ = 0, где E ⊂ �3´3 – существенная матрица (essential matrix), а 2x̃ и 1x̃ – сопряженные точки в однородных нормированных координатах изображения . Эта матрица – простая функция относи- Для камеры с фокусным расстоя­ тельного положения камеры: (7.9) E ≃ [t]´R, нием 1 и началом координат в главной точке см. раздел 6.1.2. где 2ξ1 ∼ (R, t) – положение первой камеры относительно второй. Существенная матрица вырождена, имеет ранг 2 и имеет два равных ненулевых сингулярных значения и одно нулевое. См. приложение B. Существенная матрица имеет только пять степеней свободы и полностью определяется тремя вращательными и двумя поступательными параметрами. Для чистого вращения, когда Трехмерный перенос (x, y, z) с неизt = 0, существенная матрица не определена. вестным масштабом Из уравнения (6.7) следует, что p̃ ≃ Kx̃, и, подставляя в урав- можно рассматривать как (x¢, y¢, 1). нение (7.8), получим (7.10) Приравнивание условий с уравнением (7.2) дает связь между двумя матрицами: E ≃ K2T FK1 (7.11) с точки зрения внутренних параметров двух задействованных камер . Это уравнение реализуется методом E класса Central- Если оба изображения были сняты Camera >> E = cam1.E(F) E = 0 -0.0779 -0.0779 0 0 -0.1842 одной и той же камерой, то K1 = K2. 0 0.1842 0.0000 где используются внутренние параметры первой камеры (которая совпадает со второй камерой). Как и матрицу камеры в разделе 6.2.2, существенную матрицу можно разложить, чтобы получить относительное положе- Геометрия нескольких ракурсов 397 Хотя уравнение 7.9 ние ξ2 в форме однородного преобразования . Обращение не записывается в виде уникально, и в общем случае существуют два решения: (R, t ) ∼ 2ξ1, функция Toolbox возвра­ >> sol = cam1.invE(E) щает 1ξ2. 1 sol(1) = 1.0000 0 0 0 0 -1.0000 0 0 sol(2) = 0.6967 0 0.7174 0 0 1.0000 0 0 0 -0.1842 0 0 -1 -0.07788 0 1 -0.7174 0 0.6967 0 0.1842 0 0.07788 1 Истинное положение первой камеры относительно второй >> inv(cam1.T) * cam2.T ans = 0.6967 0 -0.7174 0 1.0000 0 0.7174 0 0.6967 0 0 0 0.1842 0 0.07788 1 указывает на то, что в данном случае верно решение номер два. Необычно то, что мы точно восстановили перемещение камеры, но, поскольку E ≃ λE, поступательная часть матрицы однородного преобразования имеет неизвестный масштабный Как заметили коэффициент . В этом случае масштаб правильный, поскольку Хартли и Зиссерман основная матрица была определена непосредственно из отно(2003, стр. 259), нельзя определить сительного положения между камерами. даже знак t. В общем случае мы не знаем положения двух камер, так как же определить правильное решение на практике? Один из подходов состоит в том, чтобы определить, видна ли мировая точка. Обычно мы выбираем точку на оптической оси перед первой камерой >> Q = [0 0 10]'; и ее проекция на первую камеру >> cam1.project(Q)' ans = 429.7889 512.0000 является разумным значением. Мы можем протестировать каждое из возможных относительных положений в sol, используя их для перемещения первой камеры. Мы можем создать копию экземпляра первой камеры с произвольным смещением, используя метод move 398 Глава 7 · Использование нескольких изображений >> cam1.move(sol(1).T).project(Q)' ans = NaN NaN а значения NaN указывают на то, что точка Q не видна из этого положения камеры – на самом деле она находится за камерой. Второе решение >> cam1.move(sol(2).T).project(Q)' ans = 594.2111 512.0000 имеет конечное значение, следовательно, оно допустимо. Мы можем сделать то же самое более компактно, используя только тестовую точку: >> sol = cam1.invE(E, Q) sol = 0.6967 0 -0.7174 0 1.0000 0 0.7174 0 0.6967 0 0 0 0.1842 0 0.07788 1 В этом случае возвращается только допустимое решение. Таким образом, эти матрицы 3´3 – фундаментальная и существенная – кодируют параметры и относительное положение двух камер. Фундаментальная матрица и точка на одном изображении определяют эпиполярную линию на другом изображении, вдоль которой должны лежать ее сопряженные точки. Существенная матрица кодирует относительное положение центров двух камер, и положение может быть извлечено с двумя возможными значениями и с перемещением, масштабированным неизвестным коэффициентом. В данном примере фундаментальная матрица вычислялась по известному движению камеры и внутренним параметрам. В реальном мире все не так – движение камеры трудно измерить, и камера может быть не откалибрована. Вместо этого мы можем вычислить фундаментальную матрицу непосредственно из соответствующих Класс SE3, матрица 4×4, применяется точек изображения. 7.2.3 Вычисление фундаментальной матрицы по данным реального изображения Предположим, что у нас есть N пар соответствующих точек в двух проекциях одной и той же сцены (1pi, 2pi), i = 1 ⋯ N. В качестве демонстрационного примера создадим набор из 20 случайных точечных признаков в пределах куба 2´2´2 м, центр которого находится в 3 м перед камерами , к набору трехмерных точек, выраженных в виде матрицы 3×20. Оператор * для класса SE3 здесь работает правильно, он сначала преобразует вторую матрицу в однородную форму, выполняет матричное умножение, а затем возвращает обратно в евклидову форму. Геометрия нескольких ракурсов 399 >> P = SE3(-1, -1, 2)*(2 *rand(3,20) ); и спроецируем эти точки на две плоскости изображения камеры: >> p1 = cam1.project(P); >> p2 = cam2.project(P); Если N ≥ 8, фундаментальную матрицу можно найти по этим двум наборам соответствующих точек: >> F = fmatrix(p1, p2) maximum residual 2.645e-29 F = 0.0000 -0.0000 0.0239 -0.0000 -0.0000 0.0460 0.0239 0.0018 -24.4896 где невязка является максимальным значением левой части уравнения (7.2) и в идеале равна нулю. В данном случае значение не нулевое, но очень малое, и это связано с накоплением ошибок от арифметики конечной точности. Оцениваемая мат­ рица обладает требуемым свойством ранга: Пример устроен >> rank(F) таким образом, ans = что эпиполи лежат 2 внутри изображений, т. е. каждая Для второй камеры мы можем построить спроецированные камера может точки видеть центр другой камеры. В обычной геометрической >> cam2.plot(P); схеме оптические оси параллельны, и наложить эпиполярные линии, созданные каждой точкой на как показано на первом изображении рис. 7.19, и в этом случае эпиполи >> cam2.plot_epiline(F, p1, 'r') находятся на бесконечности (третий элемент однород- как показано на рис. 7.8. Мы видим семейство, или пучок, эпипоной координаты лярных линий, где каждая точка на втором изображении лежит на равен нулю), а все эпиполярной линии. Обратите внимание, как все эпиполярные эпиполярные линии параллельны. линии сходятся на эпиполе, что возможно в данном случае , по- тому что две камеры совмещены, как показано на рис. 7.6. Чтобы продемонстрировать важность правильного сопряжения точек, мы повторим приведенный выше пример, но введем две неправильные ассоциации данных, поменяв местами два элемента в p2: >> p2(:,[8 7]) = p2(:,[7 8]); Фундаментальная матрица >> fmatrix(p1, p2) maximum residual 0.000424 v (пиксели) 400 Глава 7 · Использование нескольких изображений u (пиксели) ans = 0.0000 0.0000 -0.0192 Рис. 7.8. Пучок эпиполярных линий на плоскости изображения второй камеры. Обратите внимание, как все эпиполярные линии проходят через эпиполь, который является проекцией центра камеры -0.0001 0.0628 -0.0000 0.0098 0.0511 -29.7672 теперь имеет невязку, которая более чем на 20 порядков превышает предыдущую. Это означает, что соответствие точек не может быть объяснено соотношением (7.2). Если бы мы знали фундаментальную матрицу, мы могли бы проверить, действительно ли пара соответствующих точеккан­дидатов сопряжена, измерив, насколько далеко одна из них находится от эпиполярной линии, определяемой другой: >> epidist(F, p1(:,1), p2(:,1)) ans = 1.5356e-13 >> epidist(F, p1(:,7), p2(:,7)) ans = 18.8228 Результат показывает, что точка 1 подходит хорошо, а точка 7 (которую мы поменяли местами с точкой 8) – плохо. Однако мы должны сначала найти фундаментальную матрицу, а для этого необходимо, чтобы было известно соответствие точек. Мы выходим из этого тупика с по­мощью гениального алгоритма под названием «Случайная выборка и консенсус» (Random Sampling and Consensus, RANSAC). Он основан на восхитительно простом принципе. Для оценки фундаментальной матрицы требуется восемь точек, поэтому мы случайным образом выбираем восемь возможных подходящих точек (выборка) и находим F для создания модели. Эта модель проверяется на соответствие всем другим парам кан- Геометрия нескольких ракурсов 401 В пределах опре- дидатов, и те, кто подходит , голосуют за эту модель. Процесс деленного порога t. повторяется несколько раз, и возвращается модель, которая поФункция Toolbox epidist возвращает лучила наибольшее количество голосов (консенсус). Поскольку расстояние между выборка мала, вероятность того, что она содержит все допуститочкой и эпиполяр- мые пары кандидатов, высока. Пары точек, которые поддержиной линией. вают модель, называются сторонниками (inlier), а те, которые не поддерживают, – противниками (outlier). RANSAC удивительно эффективен при поиске набора сторонников даже при наличии большого количества противников (более 50 %) и применим к широкому кругу задач. В Toolbox мы вызываем RANSAC как драйвер функции fmatrix >> [F,in,r] = ransac(@fmatrix, [p1; p2], 1e-6, 'verbose'); 15 trials 2 outliers 2.03262e-29 final residual и получаем отличную окончательную невязку. Функция также возвращает набор сторонников: >> in in = Columns 1 through 14 1 2 3 4 5 6 Columns 15 through 18 17 18 19 20 9 10 11 12 13 14 15 16 и надо отметить, что две неправильные связи, точки 7 и 8, отсутствуют в этом списке. Третьим параметром ransac является пороговое значение t, которое используется для определения того, поддерживает ли пара точек модель. Если выбрано слишком малое значение t, RANSAC требует намного больше испытаний, чем его максимальное значение по умолчанию, и это требует настройки дополнительных параметров. Имейте в виду также, что результаты RANSAC будут варьироваться от запуска к запуску из-за случайного характера подвыборки. Использование RANSAC связано с поиском оптимального порога методом проб и ошибок на основе окончательной невязки и количества противников. Есть также ряд других опций, которые описаны в онлайн-документации. Вернемся теперь к паре изображений Эйфелевой башни, показанной на рис. 7.3. Мы остановились на том, что нашли соответствия-кандидаты на основе сходства дескрипторов, но было несколько явно неверных совпадений. Алгоритм RANSAC доступен как метод ransac, который работает с вектором объектов FeatureMatch: >> F = m.ransac(@fmatrix, 1e-4, 'verbose') 1527 trials 312 outliers 402 Глава 7 · Использование нескольких изображений 0.000140437 final residual F = 0.0000 -0.0000 0.0098 0.0000 0.0000 -0.0148 -0.0121 0.0129 3.6393 Потребовалось небольшое количество проб и ошибок, что- Дисторсия объбы достичь точности 10−4. Чтобы сделать невязку еще меньше, ектива приводит к смещению требуется больше испытаний RANSAC и, следовательно, повы- точек на плоскости шение предела максимально допустимого числа испытаний, но изображения, что без каких-либо существенных изменений в результате. Также нарушает эпиполярную геометрию. нереалистично ожидать очень небольшой невязки, поскольку Изображения могут данные реального изображения подвержены случайным ошиб- быть исправлены кам, таким как шум датчика изображения, и систематическим путем деформации, как описано в разошибкам, таким как дисторсия объектива . деле 4.7.4, но это RANSAC выявил 312 противников или неправильных ассоци- требует больших аций данных на этапе сопоставления признаков SURF, что со- вычислительных ставляет почти 50 % совпадений-кандидатов, – предваритель- ресурсов. Более дешевая альтернатива ное сопоставление на самом деле хуже, чем казалось. Запуск состоит в том, чтобы RANSAC также обновил элементы вектора FeatureMatch найти координаты >> m.show ans = 644 corresponding points 332 inliers (51.6%) 312 outliers (48.4%) признаков в искаженном изображении и исправить их, используя обратную модель искажения (уравнение 6.13). который теперь отображает общее количество сторонников и противников. По сравнению с предыдущим вариантом элементы вектора >> m(1:5) ans = (819.56, 358.557) <-> (708.008, 563.342), dist=0.002137 + (1028.3, 231.748) <-> (880.14, 461.094), dist=0.004057 – (1027.6, 571.118) <-> (885.147, 742.088), dist=0.004297 + (927.724, 509.93) <-> (800.833, 692.564), dist=0.004371 + (854.35, 401.633) <-> (737.504, 602.187), dist=0.004417 + теперь имеют в конце знак плюса или минуса, который указывает, является ли соответствующее совпадение сторонником или противником соответственно . Мы можем нанести на изображение некоторые пары-сторонники, >> idisp({im1, im2}); >> m.inlier.subset(100).plot('g') или некоторые пары-противники, >> idisp({im1, im2}); >> m.outlier.subset(100).plot('r') как показано на рис. 7.9. Второе совпадение было определено как противник, несмотря на то что оно было вторым наиболее сильным кандидатом на основе схожести дескрипторов. Одного сходства недостаточно, соответствующие точки на двух изображениях должны соответствовать эпиполярной геомет­рии, представленной консенсусной фундаментальной матрицей. Геометрия нескольких ракурсов 403 Пример подгонки линии по методу RANSAC к данным, имеющим несколько выраженных ошибок в виде выбросов. Синяя пунктирная линия соответствует методу наименьших квад­ратов и явно смещена от истинной линии из-за выпадающих точек данных. Несмотря на то что 40 % точек не соответствуют модели, RANSAC находит параметры линии консенсуса, с которой согласует наибольшее количество точек: данные наименьшие квадраты RANSAC >> [theta,inliers] = ransac(@linef it, [x; y], 1e-3) theta = 3.0000 -10.0000 inliers = 1 3 4 5 9 10 а v (пиксели) v (пиксели) Линия проходит через точки, которые поддерживают эту модель. u (пиксели) b u (пиксели) Рис. 7.9. Результаты сопоставления Альтернативный способ создания объекта CentralCamera – из признаков SURF после RANSAC: изображения: a) подмножество всех правильных >> cam = CentralCamera('image', im1); сопоставлений; b) подмножество Размер массива пикселей выводится из изображения, а для неправильных сопоставлений, внутренних параметров устанавливаются значения по умолчанекоторые нию. Как и прежде, мы можем наложить эпиполярные линии, явно неверны, в то время как вычисленные из соответствующих точек, найденных на втором другие на первый изображении: взгляд выглядят правильными >> cam.plot_epiline(F', m.inlier.subset(20).p2, 'g'); Результат показан на рис. 7.10. Эпиполярные линии пересеМы наносим только небольшое подмно- каются в эпиполярной точке, которую мы ясно видим, это прожество эпиполярных линий, так как екция второй камеры на первом изображении . Эпиполь их слишком много, и они заслоняют >> h2e( null(F)) изображение. ans = 1.0e+03 * 1.0359 0.6709 >> cam.plot(ans, 'bo') 404 Глава 7 · Использование нескольких изображений v (пиксели) также накладывается на изображение. С помощью двух ручных камер и общего вида мы смогли точно определить вторую ка- При используемых фокусных расстомеру на первом изображении. Результат не совсем идеален – су- яниях смещение ществует горизонтальное смещение около 20 пикселей, веро- на 20 пикселей ятно, связанное с небольшой ошибкой наведения в одной или в плоскости изображения соответствует обеих камерах, которые были ручными и лишь приблизительно ошибке наведения менее 0.5°. синхронизированы . u (пиксели) 7.2.4 Рис. 7.10. Изображение с рис. 7.1а, показывающее эпиполярные линии, сходящиеся на проекции центра второй камеры. В этом случае вторая камера хорошо видна в правом нижнем углу изображения Планарная гомография В этом разделе мы рассмотрим камеру, наблюдающую за набором мировых точек Pi, лежащих на плоскости. На них смотрят две разные камеры, а проекции в камерах обозначены за 1pi и 2pi соответственно и связаны соотношением 1 p̃i ≃ H 1p̃i, (7.12) где H ⊂ �3´3 – невырожденная матрица, которая представляет Матрица гомограпроективное преобразование, называемое гомографией (ho- фии имеет произвольный масштаб mography), планарной гомографией или гомографией, индуци- и, следовательно, 8 степеней свободы. рованной плоскостью . касается уравНапример, снова рассмотрим пару камер из раздела 7.2, ко- Что нения (7.14), враторые теперь наблюдают за сеткой точек 3´3 щение, смещение >> Tgrid = SE3(0,0,1)*SE3.Rx(0.1)*SE3.Ry(0.2); >> P = mkgrid(3, 1.0, 'pose', Tgrid); где Tgrid – положение системы координат сетки {G}, а точки сетки центрированы в плоскости xy кадра. Точки проецируются на обе камеры: >> p1 = cam1.plot(P, 'o'); >> p2 = cam2.plot(P, 'o'); а изображения показаны на рис. 7.11a и b соответственно. и нормаль имеют 3, 3 и 2 степени свободы соответственно, всего 8. Гомографии образуют группу: произведение двух гомографий является другой гомографией, тождественная гомография является единичной матрицей, и обратная­операция определена. Геометрия нескольких ракурсов 405 Как и для фундаментальной матрицы, если N ≥ 8, мы можем оценить матрицу H по двум наборам соответствующих точек: >> H = homography(p1, p2) H = -0.4282 -0.0006 408.0894 -0.7030 0.3674 320.1340 -0.0014 -0.0000 1.0000 Согласно уравнению (7.12) мы можем предсказать положение точек сетки на втором изображении по соответствующим координатам первого изображения >> p2b = homtrans(H, p1); которые мы можем наложить на второе изображение как символы «+»: >> cam2.hold() >> cam2.plot(p2b, '+') Это показано на рис. 7.11b, и мы видим, что предсказанные точки идеально совпадают с реальной проекцией мировых точек. Обращенная матрица гомографии 1 p̃i ≃ H –1 2p̃i, (7.13) выполняет обратное отображение, от координат второго изображения к первому: >> p1b = homtrans(inv(H), p2); v (пиксели) Рис. 7.11. Виды косой плоской сетки точек с двух разных точек зрения. Точки сетки показаны как пустые круги. Знаки плюс в (b) обозначают точки, преобразованные из камеры в одну плоскость изображения с помощью гомографии а v (пиксели) Фундаментальная матрица заставляет сопряженную точку лежать на линии, а гомография говорит нам, где именно будет сопряженная точка на другом изображении, при условии, что точки лежат на плоскости. u (пиксели) b u (пиксели) 406 Глава 7 · Использование нескольких изображений Мы можем воспользоваться этой оговоркой в качестве про- Эти точки лежат верки того, лежат ли точки на плоскости. Добавим несколько вдоль луча от центра камеры до дополнительных мировых точек в наш пример дополнительного >> Q = [ -0.2302 -0.0545 0.3287 0.4523 0.4000 0.5000 ряда точек в плоскости сетки. Однако их координаты z были выбраны равными 0.4, 0.5 и 0.6 м соответственно. 0.2537 0.6024 0.6000 ]; которые отобразим в 3D >> axis([-1 1 -1 1 0 2]) >> plot_sphere(P, 0.05, 'b') >> plot_sphere(Q, 0.05, 'r') >> cam1.plot_camera('color', 'b', 'label') >> cam2.plot_camera('color', 'r', 'label') как показано на рис. 7.12. Новые точки, показанные красным цветом, явно не лежат в той же плоскости, что и исходные синие точки. Если взять вид с первой камеры >> p1 = cam1.plot([P Q], 'o'); как показано на рис. 7.13а, эти новые точки появляются в виде дополнительной строки в сетке точек, которую мы использовали выше. Однако во втором представлении >> p2 = cam2.plot([P Q], 'o'); как показано на рис. 7.13b, эти внеплоскостные точки больше не образуют правильную сетку. Если применить гомографию к точкам изображения первой камеры >> p2h = homtrans(H, p1); мы найдем, где они должны быть на изображении второй камеры, если бы они принадлежали плоскости, неявной в гомографии: >> cam2.plot(p2h, '+') Мы видим, что исходные девять точек перекрываются, а три новые точки – нет. Мы могли бы сделать автоматический тест на основе ошибки прогноза: >> colnorm( homtrans(H, p1)-p2 ) ans = 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 50.5969 0.0000 46.4423 0.0000 45.3836 Видно, что значения велики для этих последних трех точек – они не принадлежат плоскости, которая индуцировала гомографию. Геометрия нескольких ракурсов 407 v (пиксели) Рис. 7.13. Виды косой плоской сетки точек с двух разных ракурсов. Точки сетки показаны как пустые круги. Знаки «плюс» в (b) обозначают точки, преобразованные из плоскости изображения первой камеры с по­мощью гомографии. Нижняя часть ряда точек в каждом случае а не лежит в одной плоскости с другими точками v (пиксели) Рис. 7.12. Расположение точек мишени и два положения камер. Синие точки лежат в плоской сетке, а красные кажутся лежащими в сетке с точки зрения первой камеры u (пиксели) b u (пиксели) В этом примере мы нашли гомографию на основе двух наборов сопоставленных точек, которые были проекциями известных плоских точек. На практике мы не знаем заранее, какие точки принадлежат плоскости, поэтому снова можем использовать RANSAC: >> [H,in] = ransac(@homography, [p1; p2], 0.1) resid = 4.0990e-13 H = -0.4282 -0.0006 408.0894 -0.7030 0.3674 320.1340 -0.0014 -0.0000 1.0000 in = 1 2 3 4 5 6 7 8 9 который находит гомографию, лучше всего объясняющую взаимосвязь между наборами точек изображения. Он также иденти- 408 Глава 7 · Использование нескольких изображений фицировал те точки, которые поддерживают гомографию, и три точки вне плоскости 10–12, не вошедшие в список сторонников. Геометрическая схема, связанная с гомографией, показана на рис. 7.14. Мы можем выразить гомографию в нормированСм. раздел 6.1.2. ных координатах изображения : 2 x̃ ≃ HE 1x̃, где НЕ – евклидова гомография, которая описывается уравнением (7.14) при условии движения камеры (R, t) ∼ 2ξ1 и плоскости nTP + d = 0 относительно системы {1}. Евклидовы и проективные гомографии связаны соотношением HE ≃ K –1HK, где K – матрица внутренних параметров камеры. плоскость объекта эпиполярная плоскость плос кость изоб ения браж раже ния п изо ость лоск Рис. 7.14. Геометрическая схема гомографии, показывающая две камеры с соответствующими системами координат {1} и {2} и плоскостями изображения. Мировая точка P принадлежит плоскости с нормалью к поверхности n. H – это гомография, матрица 3×3, которая отображает 1p в 2p Что касается существенной матрицы, проективную гомо- Хотя уравнение 7.14 графию можно разложить, чтобы получить относительное по- записывается с использованием ложение 1ξ2 в форме однородного преобразования , а также (R, t) ∼ 2ξ1, функция нормаль к плоскости. Воспользуемся методом invH класса Cent­ Toolbox возвра­ щает 1ξ2. ralCamera Геометрия нескольких ракурсов 409 >> cam1.invH(H) solution 1 T =0.82478 0.01907 0.56513 0.00000 n = 0.95519 solution 2 T =0.69671 0.00000 0.71736 0.00000 n = -0.19676 -0.01907 0.99980 -0.00591 0.00000 0.00998 -0.56513 -0.00591 0.82498 0.00000 0.29582 -0.01966 -0.01917 0.19911 1.00000 0.00000 1.00000 -0.00000 0.00000 -0.09784 -0.71736 0.00000 0.69671 0.00000 0.97556 0.18513 -0.00000 0.07827 1.00000 который возвращает короткий массив структур. Опять же, есть несколько решений, и нам нужно применить дополнительную информацию, чтобы определить правильное. Как обычно, поступательный компонент матрицы преобразования имеет неизвестный масштабный коэффициент. Из рис. 7.12 мы знаем, что камера движется преимущественно в направлении x и что нормаль к плоскости примерно параллельна оптической оси камеры или оси z, и это знание помогает нам выбрать второе решение. Истинное преобразование из первой камеры во вторую >> inv(T1)*T2 ans = 0.6967 0 0 1.0000 0.7174 0 0 0 -0.7174 0 0.6967 0 0.1842 0 0.0779 1.0000 Масштабный соответствует нашему выбору . Положение сетки относителькоэффициент но первой камеры: перевода в этом примере довольно >> inv(T1)* Tgrid близок к единице, но в целом его ans = 0.9797 -0.0389 -0.1968 -0.2973 следует считать неиз­вестным. 0.0198 0.9950 -0.0978 0 0.1996 0 0.0920 0 0.9756 0 0.9600 1.0000 Поскольку точки а третий столбец – это нормаль сетки , которая соответствует находятся в пло- предполагаемой нормали, связанной со вторым решением. скости xy системы Мы можем применить эту методику к паре реальных изобракоординат сетки {G}, нормаль является жений: осью z. >> im1 = iread('walls-l.jpg', 'double', 'reduce', 2); >> im2 = iread('walls-r.jpg', 'double', 'reduce', 2); которые уменьшены в два раза в каждом измерении и показаны на рис. 7.15. v (пиксели) v (пиксели) 410 Глава 7 · Использование нескольких изображений а u (пиксели) b Начнем с поиска признаков по методу SURF >> sf1 = isurf(im1); >> sf2 = isurf(im2); и получим кандидатов на связанные точки: u (пиксели) Рис. 7.15. Две фотографии двора, сделанные с разных ракурсов. Изображение (b) было сделано примерно на 30 см правее изображения (a). Изображение (a) имеет наложенные признаки, лежащие на плоскости. Камера была ручной >> m = sf1.match(sf2, 'top', 1000) m = 1000 corresponding points (listing suppressed) Затем применим RANSAC, чтобы найти набор связанных точек, который лучше всего ложится на плоскость в мире: [H,r] = m.ransac(@homography, 4) H = 0.8463 0.0164 -150.4748 0.0050 1.0067 20.3413 -0.0000 -0.0000 1.0000 r = 1.6799 Количество сторонников (inlier) и противников (outlier) равно >> m.show ans = 1000 corresponding points 262 inliers (26.2%) 738 outliers (73.8%) В этом случае большинство пар точек не укладываются в модель, т. е. не принадлежат плоскости, индуцирующей гомографию H. Однако 262 точки принадлежат плоскости, и мы можем наложить их на изображение >> idisp(im1) >> plot_point(m.inlier.p1, 'ys') Стереозрение 411 как показано на рис. 7.15а. RANSAC нашел консенсус, который представляет собой плоскость, содержащую левую стену. Был установлен допуск величиной 4 пикселя, чтобы учесть искажение объектива и не идеально гладкие плоскости. Если мы удалим точки-сторонники из вектора FeatureMatch, оставим только точки-противники >> m = m.outlier и повторим шаг нахождения гомографии RANSAC, мы найдем следующую наиболее доминирующую плоскость в сцене, которая окажется правой стеной. Плоскости очень часто встречаются в искусственных средах, и мы вернемся к гомографиям и их разложению в разделе 7.7.1. 7.3 Стереозрение Стереозрение – это метод оценки трехмерной структуры мира по двум изображениям, снятым с разных ракурсов, как, например, показано на рис. 7.15. Человеческие глаза разнесены на 50– 80 мм, и разница между этими двумя точками зрения является важной, но не единственной частью того, как мы ощущаем расстояние. Мы обсудим два подхода, известных как разреженное (sparse) и плотное (dense) стереозрение соответственно. Разреженное стереозрение является естественным продолжением сопоставления признаков и восстанавливает мировую координату (X, Y, Z) для каждой соответствующей пары точек. Плотное стереозрение пытается восстановить мировую координату (X, Y, Z) для каждого пикселя изображения. 7.3.1 Разреженное стереозрение Чтобы проиллюстрировать разреженное стереозрение, вернемся к паре изображений, показанных на рис. 7.15. Мы уже нашли признаки SURF и установили возможные соответствия между ними. Теперь найдем фундаментальную матрицу >> [F,r] = m.ransac(@fmatrix,1e-4, 'verbose'); 102 trials 238 outliers 0.000132333 final residual которая отражает относительную геометрию двух ракурсов. Мы можем отобразить эпиполярные линии для подмножества точек правого изображения, наложенных на левое изображение 412 Глава 7 · Использование нескольких изображений >> cam = CentralCamera('image', im1); >> cam.plot_epiline(F', m.inlier.subset(40).p2, 'y'); v (пиксели) как показано на рис. 7.16. В этом случае эпиполярные линии приблизительно горизонтальны и параллельны, что ожидается для движения камеры, которое представляет собой чистое перемещение в направлении x. На рис. 7.17 показана эпиполярная геометрическая схема стереозрения. Ясно, что, по мере того как точки удаляются от камеры, сопряженные точки P и P¢ на правом изображении перемещаются вправо вдоль эпиполярной линии. Рис. 7.16. Изображение рис. 7.15а с наложенными эпиполярными линиями для подмножества точек правого изображения u (пиксели) эпиполярная плоскость плос кость изоб эпиполярная точка раже ния эпипо­ лярная линия пло я жени обра ь из скост Рис. 7.17. Эпиполярная геометрическая схема стереозрения. Мы можем ясно видеть, что по мере увеличения глубины мировой точки от P до P¢ проекция перемещается вдоль эпиполярной линии во второй плоскости изображения Каждая из точек 1p и 2p определяет луч в пространстве, который пересекается в мировой точке. Однако для определения этих лучей нам нужно знать два положения камеры и ее внут­ ренние параметры. Мы можем принять, что система координат первой камеры {1} является опорной, но положение второй Стереозрение 413 камеры остается неизвестным. Однако мы могли бы найти ее положение, разложив основную матрицу, вычисленную для перехода между двумя ракурсами. У нас есть фундаментальная матрица, но для определения существенной матрицы по уравнению 7.11 нам нужны внутренние параметры камеры. Немного поискав, мы можем их найти! Фокусное расстояние, использованное при съемке, сохраняется в метаданных изображения и может быть просмотрено: >> [~,md] = iread('walls-l.jpg'); где md – структура текстовых строк, содержащая различные характеристики изображения – его метаданные. Элемент DigitalCamera – это структура, описывающая камеру >> f = md.DigitalCamera.FocalLength f = 4.1500 откуда следует, что фокусное расстояние равно 4.15 мм. Размеры пикселей ρw´ρh не включены в заголовок изображения, но некоторые данные в интернете об этой модели камеры >> md.Model ans = iPhone 5s Мы удвоили раз- предположительно свидетельствуют, что эта камера имеет фомеры в пикселях, томатрицу с пикселями 1.5 мкм. Создадим объект CentralCamera чтобы учесть уменьшение вдвое на основе известного фокусного расстояния, размера пикселя разрешения изобра- и размера изображения жения при загрузке изображений. Изо- >> cam = CentralCamera('image', im1, 'focal', f/1000, ... бражение с низким 'pixel', 2*1.5e-6) разрешением cam = фактически имеет более крупные name: noname [central-perspective] focal length: 0.00415 пиксели. pixel size: principal pt: number pixels: pose: (3e-06, 3e-06) (816, 612) 1632 x 1224 t = (0,0,0), RPY/yxz = (0,0,0) deg При отсутствии какой-либо другой информации предполагается, что главная точка находится в центре изображения. Существенная матрица получается путем применения внут­ ренних параметров камеры к фундаментальной матрице: >> E = cam.E(F) E = 0.0143 1.1448 -1.1286 -0.1483 -0.2826 -6.0536 0.2380 6.0273 -0.1461 414 Глава 7 · Использование нескольких изображений а затем мы выполняем ее декомпозицию, чтобы определить движение камеры: >> T = cam.invE(E, [0,0,10]') T = 0.9999 0.0115 0.0027 -0.0115 0.9996 -0.0255 -0.0030 0.0254 0.9997 0 0 0 6.042 -0.3092 1.124 1 Мы выбрали тестовую точку 1P = (0, 0, 10) – удаленную точку вдоль оптической оси, – чтобы определить правильное решение для относительного движения камеры. Поскольку ориентация камеры оставалась довольно постоянной, ожидается, что вращательная часть преобразования будет близка к единичной матрице, как мы наблюдаем, а фактическое вращение >> T.torpy('yxz', 'deg') ans = -0.6569 1.4597 0.1561 составляет менее двух градусов поворота вокруг любой оси . Мы указали другой Предполагаемый перенос t из {1} в {2} имеет неизвестный порядок поворотакрена-тангажа YXZ. масштабный коэффициент. Поэтому снова внесем дополни- Учитывая то, как мы тельную информацию – когда мы делали снимки, камера сме- определили наши стилась примерно на 0.3 м в положительном направлении оси x. оси, ориентация камеры по отношению Вычисленный перенос имеет правильное направление, преоб- к мировой системе ладающее движение по оси x, но величина совершенно неверна. координат представляет собой рыПоэтому мы масштабируем перенос скание относитель>> t = T.t; >> T.t = 0.3 * t/t(1) T = 0.9999 0.0115 0.0027 -0.0115 0.9996 -0.0255 -0.0030 0.0254 0.9997 0 0 0 0.3 -0.01535 0.0558 1 но вертикали, или оси y, за ним идет тангаж относительно оси x, за которым следует крен вокруг оптической оси, или оси z. и у нас есть оценка 1ξ2 – относительное положение первой каме- Иногда называется ры по отношению ко второй, представленное как однородное раксель. Сущест­ вует множество преобразование. представлений, Каждая точка p изображения соответствует лучу в простран- включая координаты Плюккера, стве : P = αd + P0, ∀α > 0, где P0 – главная точка камеры, а d ∈ �3, ǁdǁ = 1 – единичный вектор в направлении луча. Рассмотрим теперь первую пару сопряженных точек m(1). Луч из первой камеры которые описаны в разделе С.1.2.2. Определение луча по координате пикселя описано в разделе 6.1.4. Стереозрение 415 >> r1 = cam.ray(m(1).p1) r1 = d=(0.37844, -0.0819363, 0.921992), P0=(0, 0, 0) который является экземпляром объекта Ray3D со свойствами d и P0, представляющими d и P0. Соответствующий луч от второй камеры: >> r2 = cam.move(T).ray(m(1).p2) r2 = d=(0.29936, -0.0826926, 0.95055), P0=(0.3, -0.0153494, 0.0557958) где метод move возвращает копию экземпляра cam объекта CentralCamera с относительным положением, которое мы только что нашли. Два луча пересекаются в точке >> [P,e] = r1.intersect(r2); P' ans = 1.2134 -0.2627 2.9563 Это точка с координатой z (глубиной) почти 3 м. Из-за ошибок в оценке положения второй камеры два луча на самом деле не пересекаются, но возвращается их ближайшая точка. В ближайшей точке >> e e = 0.0049 Даже небольшие лучи находятся на расстоянии почти 5 мм друг от друга. Учитыошибки в рас- вая отсутствие строгости в этом упражнении, всего два снимка четном вращении с ручной камеры и только приблизительное знание величины между положениями камеры смещения камеры, восстановленную информацию о глубине приведут к большим можно считать весьма точной . ошибкам замыкаИзвлечем подмножество из ста сопряженных точек множения на расстоянии в несколько метров. ства сторонников: Ошибка замыкания, наблюдаемая здесь, >> m2 = m.inlier.subset(100); была бы вызвана ошибкой вращения менее 1°. а затем вычислим лучи в мировом пространстве от каждой ка- меры: >> r1 = cam.ray( m2.p1 ); >> r2 = cam.move(T).ray( m2.p2 ); которые являются каждым вектором объектов Ray3D. Их точки пересечения: >> [P,e] = r1.intersect(r2); 416 Глава 7 · Использование нескольких изображений где P – матрица ближайших точек, по одной на столбец, и последняя строка >> z = P(3,:); является координатой глубины. Столбцы вектора e содержат расстояние между лучами в их ближайших точках. Мы можем наложить расстояние до каждой точки на изображение двора >> idisp(im1) >> plot_point(m2.p1, 'y+', 'textcolor', 'y', 'printf', {'%.1f', z}); v (пиксели) как показано на рис. 7.18, а маркеры объектов снабжены аннотациями с расчетной глубиной. u (пиксели) Рис. 7.18. Изображение рис. 7.15а с указанием глубины выбранных точек (единицы метров) Это пример системы стереопсиса, которая использует информацию из двух перекрывающихся изображений, чтобы сделать вывод о трехмерном положении точек в мире. По понятным причинам используемый здесь подход называется разреженным стереозрением, поскольку мы вычисляем расстояние только для крошечного подмножества пикселей изображения. Чаще всего относительная разница положений между камерами, как и внутренние параметры камеры, известна заранее. 7.3.2 Плотное стереосопоставление Стереопара чаще всего снимается одновременно двумя камерами, как правило, с параллельными оптическими осями и разнесенными на известное расстояние, называемое съемочным базисом камеры. На рис. 7.19 показана типичная система стереокамер, которая одновременно захватывает изображения с обеих камер и передает их на главный компьютер для обработки. Стереозрение 417 Рис. 7.19. Компактная система стереозрения, установленная на мобильном роботе и способная генерировать карту глубины в реальном времени (изображение предоставлено Stereolabs Inc.) Для иллюстрации загрузим левое и правое изображение, составляющие стереопару: >> L = iread('rocks2-l.png', 'reduce', 2); >> R = iread('rocks2-r.png', 'reduce', 2); Мы можем интерактивно исследовать эти два изображения вместе: >> stdisp(L, R) v (пиксели) как показано на рис. 7.20. Щелчок по точке на левом изображении обновляет пару перекрестий, которые отмечают ту же u (пиксели) Рис. 7.20. Окно просмотра изображений stdisp. Черное перекрестие на левом изображении расположено в правом верхнем углу цифры 5 на камне на переднем плане. Другое черное перекрестие автоматически размещается в той же координате на правом изображении. Щелчок по соответствующей точке на правом изображении устанавливает зеленое перекрестие, а панель вверху показывает сдвиг по горизонтали на 70.9 пикселя влево. Эта пара стереоизображений взята из стереоскопической базы данных Миддлбери (Scharstein and Pal, 2007). Фокусное расстояние f/ρ составляет 3740 пикселей, а съемочный базис – 160 мм. Изображения были обрезаны таким образом, что фактическое несовпадение должно быть компенсировано на 274 пикселя 418 Глава 7 · Использование нескольких изображений координату на правом изображении. Щелчок на правом изображении устанавливает другое вертикальное перекрестие и отображает разницу между горизонтальными координатами двух перекрестий. Перекрестие, как показано, установлено на цифру 5, написанную на одном из камней переднего плана, и мы наблюдаем несколько вещей. Во-первых, оптическая точка (spot) имеет одинаковую вертикальную координату на обоих изображениях, а это означает, что эпиполярные линии горизонтальны. Во-вторых, на правом изображении точка сместилась влево на 70.9 пикселя. Если бы мы исследовали больше точек, мы бы увидели, что несоответствие уменьшается для точек, которые находятся дальше от камеры. Как показано на рис. 7.17, сопряженная точка на правом изображении перемещается вправо вдоль эпиполярной линии по мере увеличения глубины точки. Для геометрической схемы камер с параллельными осями эпиполярные линии параллельны и горизонтальны, поэтому сопряженные точки имеют одинаковую v-координату. Если координаты двух сопряженных точек равны (Lu, Lv) и (Ru, Rv), тогда Rv = Lv. Смещение вдоль горизонтальной эпиполярной линии d = Lu − Ru, где d ≥ 0, называется диспаратностью (disparity). Процесс плотного стереосовмещения показан на рис. 7.21. Если взять пиксель в точке (Lu, Lv) на левом изображении, мы знаем, что соответствующий ему пиксель находится в некоторой координате (Lu − d, Lv) в правом изображении, где d ∈ [dmin, dmax]. Чтобы надежно найти соответствующую точку для пикселя на левом изображении, мы создаем шаблонную область T размером N´N пикселей вокруг этого пикселя. Как показано на рис. 7.21, мы перемещаем окно шаблона горизонтально по правому изображению. Позиция, в которой шаблон наиболее похож, считается соответствующей точкой, от которой рассчитывается диспаратность. По сравнению с задачей сопоставления, которую мы обсуждали в разделе 4.5.2, здесь ситуация намного проще, потому что между двумя изображениями нет изменения относительного масштаба или ориентации. левое правое Рис. 7.21. Стереосовмещение. Окно поиска на правом изображении перемещается влево вдоль эпиполярной линии v = Lv, начиная с u = Lu, пока не совпадет с окном шаблона T на левом изображении Стереозрение 419 Эпиполярное ограничение означает, что нам нужно выполнить только одномерный поиск соответствующей точки. Шаблон перемещается с шагом D по одному пикселю в диапазоне dmin ⋯ dmax. В каждой позиции шаблона мы выполняем операцию сопоставления с шаблоном, как обсуждалось в разделе 4.5.2, и для шаблона N´N вычислительные затраты составят O(N 2). Для изображения размером W´H общая вычислительная стоимость плотного стереосопоставления составляет O(DWHN 2), что довольно много, но осуществимо в режиме реального времени. Выполнить стереосовмещение пары изображений на рис. 7.20 с по­мощью Toolbox довольно просто: >> d = istereo(L, R, [40, 90], 3); Результатом является матрица того же размера, что и L, а значение каждого элемента d[u, v] или d(v,u) в MATLAB представляет собой диспаратность по этой координате на левом изображении. Соответствующий пиксель на правом изображении будет в точке (u − d[u, v], v). Мы можем отобразить диспаратность как изображение >> idisp(d, 'bar') Пример такого изображения показан на рис. 7.22. Изображения диспаратности имеют характерный призрачный вид, поскольку все цвета и текстуры поверхности отсутствуют. Треть­ им аргументом функции stereo является диапазон искомых Мы могли бы выбрать такой диа- диспаратностей, в данном случае от 40 до 90 пикселей, поэтому пазон, как [0, 90], но значения пикселей в изображении диспаратности лежат в диаэто увеличивает время поиска: нуж- пазоне [40, 90]. Диапазон диспаратности получен путем изучено будет оценивать ния некоторых дальних и близких точек с по­мощью stdisp . 91 несоответствие Четвертый аргумент istereo – это полуширина шаблона, в данвместо 51. Это также увеличивает ном случае мы используем окно 7´7. По умолчанию stereo исвероятность ошибок пользует меру сходства ZNCC. сопоставления. На изображении диспаратности ясно видно, что камни в нижней части кучи имеют большее несоответствие и находятся ближе к камере, чем камни наверху. Есть также некоторые ошибки, такие как аномальные значения яркости по краям некоторых камней. Эти пиксели отображаются как находящиеся ближе, чем они есть на самом деле. Показатель сходства устанавливается равным NaN по краю изображения, где шаблон соЭто происходит, поставления сходства выходит за край изображения, и равным если все пиксели Inf для случая, когда знаменатель показателя сходства ZNCC в одном из шаблонов имеют одинако- (табл. 4.1) равен нулю . Значения NaN и Inf отображаются красвое значение. ным цветом. v (пиксели) Диспаратность (пиксели) 420 Глава 7 · Использование нескольких изображений u (пиксели) 7.3.2.1 Рис. 7.22. Изображение диспаратности для стереопары кучи камней, где более яркие области означает более высокое несоответствие или более короткий диапазон. Красным цветом отмечены значения Inf или NaN в результате, для которых не удалось вычислить несоответствие. Обратите внимание на квантование уровней серого, поскольку мы ищем диспаратность с шагом в один пиксель Проблемные случаи стереозрения Функция stereo также может возвращать изображение пространства диспаратности (disparity space image, DSI): >> [d,sim,DSI] = istereo(L, R, [40 90], 3); где sim – это матрица размером H´W, элементами которой являются пиковые показатели сходства в соответствующем пикселе, а DSI – это матрица размера H´W´D, показанная на рис. 7.23: >> about(DSI) DSI [double] : 555x638x51 (144468720 bytes) Это большая мат­ рица (144 Мбайт), поэтому изображения при загрузке уменьшались в размере. элементы которой (u, v, d) являются мерой сходства между шаб­ лонами с центром в точке (u, v) на левом изображении и (u − d, v) на правом . Изображение диспаратности, которое было показано ранее, – это просто положение максимального значения в d-направлении, найденное в каждом пикселе , а матрица sim Это рабочий, но упрощенный представляет собой значение этих максимумов. подход. Лучшим Каждый столбец в d-направлении, как показано на рис. 7.23, подходом является содержит меру сходства/диспаратности для соответствующего применение регуляризации и оценка пикселя на левом изображении. Для пикселя в точке (138, 439) функции g(u, v), которая совпадает мы можем построить график >> plot( squeeze(DSI(439,138,:)), 'o-'); показанный на рис. 7.24а. Мы используем меру ZNCC, и почти идеальное совпадение происходит при несоответствии в 80 пикселей, поскольку горизонтальная ось равна d – dmin, а dmin = 40. К счастью, такой сильный и однозначный пик встречается очень часто. Однако рис. 7.22 показывает, что процесс с точками максимального подобия, сохраняя при этом гладкость и непрерывность. Стереозрение 421 стереосопоставления несовершенен, а графики зависимости метрики подобия шаблона от несоответствия дают представление о причинах ошибки. Подобие NCC Подобие NCC Рис. 7.23. Изображение пространства диспаратности (DSI) представляет собой трехмерное изображение, где элемент D(u, v, d) отражает сходство между опорными областями с центром в (Lu, Lv) на левом изображении и (Lu − d, Lv) на правом пиксель в точке (138, 439 ) b пиксель в точке (408, 277) c Диспаратность d – dmin (пиксели) Подобие NCC Диспаратность d – dmin (пиксели) Подобие NCC a пиксель в точке (133, 313) Диспаратность d – dmin (пиксели) пиксель в точке (464, 544) d Диспаратность d – dmin (пиксели) Рис. 7.24. Некоторые типичные кривые метрики ZNCC по сравнению с кривыми диспаратности: a) одиночный сильный пик; b) несколько пиков; c) слабый пик; d) широкий пик 422 Глава 7 · Использование нескольких изображений На рис. 7.24b показаны два пика почти одинаковой амплитуды, а это означает, что искомый шаблон был обнаружен дважды в области поиска. Это происходит, когда на изображении есть регулярные вертикальные элементы, как это часто бывает в искусственных сценах: кирпичные стены, ряды окон, архитектурные элементы или забор. Проблема, показанная на рис. 7.25, широко известна как эффект частокола (picket fence effect), или, точнее, как пространственная неоднозначность. Гарантированного лекарства от этой проблемы нет , но мы можем обнару- Многокамерная жить ее наличие. Коэффициент неоднозначности представляет стереосъемка с использованием собой отношение высоты второго пика к высоте первого пика. более двух камер Высокое значение указывает на то, что результат является не- является мощным определенным и его не следует использовать. Вероятность об- методом устранения этой неодно­ наружения неправильных пиков можно уменьшить, сделав так, значности. чтобы диапазон диспаратности, используемый в istereo, был как можно меньше, но для этого требуется некоторое знание ожидаемого диапазона объектов. левый правый Слабое совпадение показано на рис. 7.24c. Обычно это происходит, когда соответствующая точка сцены не видна на виде справа из-за окклюзии, также известной как проблема недостающих частей. Окклюзия показана на рис. 7.26, и видно, что точка 3 видна только левой камере. Алгоритм стереосопоставления всегда будет возвращать наилучшее совпадение, поэтому, если точка закрыта, он вернет диспаратность относительно наиболее похожего, но неправильного шаблона. Несмотря на то что на рисунке показана несколько преувеличенная ситуация, реальные изображения страдают от этой проблемы, когда глубина быстро меняется. В нашем примере это происходит на краях скал, именно там мы наблюдаем неверные несоответствия на рис. 7.22. Проблема становится более распространенной по мере увеличения базисной линии. Проблема также возникает, когда соответствующая точка не лежит в пределах Рис. 7.25. Эффект частокола. Шаблон будет хорошо сочетаться с рядом различных диспаратностей. Эта проблема возникает в любой сцене с повторяющимися объектами Стереозрение 423 диапазона поиска диспаратности, т. е. диапазон поиска диспаратности слишком мал. Рис. 7.26. Окклюзия в стереозрении. Поле зрения двух камер показано цветными секторами. Точки 1 и 7 выходят за пределы перекрывающейся области обзора и видны только одной камере. Точка 5 закрыта от левой камеры, а точка 3 – от правой. Перечень точек, видимых каждой камерой, указан под ней Проблему нельзя устранить, но ее можно хотя бы обнаружить. Самый простой способ – рассмотреть оценку сходства, возвращаемую функцией istereo >> idisp(sim) как показано на рис. 7.27а, и мы увидим, что ошибочные значения диспаратности соответствуют низким показателям подобия. Результаты несоответствия, когда сходство низкое, могут быть отброшены: >> ipixswitch(sim<0.7, 'yellow', d/90); Это показано на рис. 7.27b, где пиксели с подобием s < 0.7 отображаются желтым цветом. Распределение максимальных оценок сходства >> ihist(sim(isf inite(sim)), 'normcdf'); показано на рис. 7.28. Мы видим, что только 5 % пикселей имеют показатель сходства менее 0.6 и что около 80 % пикселей имеют показатель сходства выше 0.9. Простой, но эффективный способ проверить наличие окклюзии – выполнить сопоставление в двух направлениях – проверку согласованности слева и справа. Начиная с пикселя на левом изображении, находят наиболее сильное совпадение на правом. Затем самое сильное совпадение с этим пикселем находят на левом изображении. Если это – то место, с которого мы начали, совпадение считается состоявшимся. Однако, если соответствующая точка была закрыта на правом изображении, первое совпадение с другим признаком будет слабым, и сущест­вует вы- v (пиксели) Подобие ZNCC v (пиксели) 424 Глава 7 · Использование нескольких изображений а b u (пиксели) u (пиксели) Накопительное распределение Рис. 7.27. Сходство стереошаблона: a) изображение подобия, где более яркие пиксели означают большее сходство; b) изображение диспаратности с пикселями, имеющими низкий показатель сходства, отмеченными желтым цветом. Красным цветом отмечены значения Inf или NaN там, где не удалось вычислить диспаратность Подобие ZNCC Рис. 7.28. Интегральная вероятность оценок ZNCC. Вероятность оценки менее 0.9 составляет 45 % сокая вероятность того, что второе совпадение будет с другим пикселем на левом изображении. Из рис. 7.26 видно, что пиксели в левой части левого изображения могут вообще не перекрываться с правым изображением – например, точка 1 находится вне поля зрения правой камеры. Это является причиной большого количества неправильных совпадений в левой части изображения диспаратности на рис. 7.22. Обычной практикой является отбрасывание крайних левых столбцов dmax (в данном случае 90) изображения диспаратности. Последняя проблема, которая может возникнуть, – это функция подобия с очень широким пиком, как показано на рис. 7.24d. Широкий пик затрудняет точную оценку максимумов. Обычно Стереозрение 425 это происходит, когда область шаблона очень слабо текстурирована, например соответствует небу, темным теням, слоям воды, снегу, льду или гладким искусственным объектам. Проще говоря, в области, полностью окрашенной в серый цвет, серый шаблон одинаково хорошо сочетается с любым количеством областей-кандидатов серого цвета. Один из подходов к обнаружению этой проблемы заключается в просмотре изменчивости значений пикселей в шаблоне с использованием таких показателей, как разница между максимальным и минимальным значением или дисперсия значений пикселей. Если шаблон имеет слишком маленькую дисперсию, вряд ли это приведет к сильному пику. Для устранения этих случаев также можно использовать меры резкости пика, которые мы обсудим в следующем разделе. Как уже было сказано, в описанных выше проблемных ситуациях мы не можем определить диспаратность, но можем выявить наличие проблемы. Это важно, так как позволяет пометить соответствующие пиксели как не имеющие известного диапазона, и это позволяет роботу осторожно относиться к областям, трехмерную структуру которых нельзя надежно определить. Конструкция системы стереозрения имеет три степени свободы. Во-первых, это базисное расстояние между камерами. По мере его увеличения диспаратности становятся больше, что позволяет оценить глубину с большей точностью, но усугубляется проблема окклюзии. Во-вторых, необходимо тщательно установить диапазон поиска диспаратностей. Если максимальное значение слишком велико, вероятность пространственной неоднозначности увеличивается, но если оно слишком мало, то точки, близкие к камере, будут генерировать неверные и слабые совпадения. Большой диапазон диспаратностей также увеличивает время вычислений. В-третьих, размер шаблона предполагает наличие компромисса между временем вычисления и качеством изображения диспаратности. Небольшой размер шаблона позволяет уловить мелкую структуру глубины, но склонен давать результаты, которые намного более зашумлены, так как маленький шаблон более восприимчив к неоднозначным совпадениям. Большой шаблон дает более плавное изображение диспаратности, но требует больших вычислений. Также возрастает вероятность того, что шаблон будет содержать пиксели, принадлежащие объектам на разной глубине, что называется проблемой смешанных пикселей. Обычно эта проблема приводит к низкому качеству сопоставления краев объектов, и результирующая карта диспаратности выглядит размытой. Одним из решений является использование непараметрического локального преобразования, такого как ранговое или последовательное, перед выполнением корреляции. Поскольку они основаны на упорядочении значений интенсивности, а не 426 Глава 7 · Использование нескольких изображений на самих значениях, они обеспечивают лучшее качество на границах объекта. Альтернативный способ взглянуть на проблемные случаи – использовать функции объемной визуализации MATLAB для создания горизонтальных срезов через пространство диспаратностей: >> slice(DSI, [], [100 200 300 400 500], []) >> shading interp; colorbar d (пиксели) Подобие ZNCC как показано на рис. 7.29. Это срезы с постоянной координатой v, фактически горизонтальные поперечные сечения сцены. Внутри каждой из ud-плоскостей мы видим яркий след (высокие значения сходства), который представляет диспаратность d(u). Обратите внимание на значительные разрывы следа на плоскости при v = 100, которые соответствуют внезапным изменениям глубины. Плоскости при v = 200, 300, 400 показывают, что след также местами затухает. В этих областях максимальное сходство низкое, сильного совпадения на правом изображении нет, и наиболее вероятной причиной является окклюзия. v (пиксели) 7.3.3 u (пиксели) Рис. 7.29. Изображение пространства диспаратности представляет собой трехмерное изображение, где элемент D(u, v, d) представляет собой сходство между опорными областями с центром в (Lu, Lv) на левом изображении и (Lu − d, Lv) на правом Уточнение пика Диспаратность в каждом пикселе представляет собой целочисленное значение d ∈ [dmin, dmax], при котором обнаружено наибольшее сходство. На рис. 7.24а показан единственный однозначный сильный пик, и мы можем использовать этот пик Это двухмерное и соседние точки для уточнения оценки положения пика . уточнение пика Парабола 2 s = Ad + Bd + C (7.15) обсуждается в приложении H. Стереозрение 427 определяется тремя точками и соответствует пиковому значению и двум его соседям. Для меры подобия ZNCC максимум соответствует наилучшему совпадению, т. е. парабола перевернута и A < 0. Максимальное значение подобранной параболы имеет место, когда ее производная равна нулю, из чего мы можем получить более точное значение положения пика, которое является диспаратностью: Коэффициент А будет иметь большое значение для острого пика, а простой порог можно использовать для отбрасывания широких пиков, как мы обсудим в следующем разделе. Уточнение пика диспаратности включается с по­мощью опции 'interp': >> [di,sim,peak] = istereo(L, R, [40 90], 3, 'interp'); >> idisp(di) Результирующее изображение диспаратности показано на рис. 7.30а. Мы видим, что оно намного более гладкое, чем показанное ранее на рис. 7.22. Дополнительный необязательный выходной аргумент peak позволяет вывести структуру >> peak peak = A: [555x638 double] B: [555x638 double] которая содержит попиксельные значения коэффициентов параболы. Величина коэффициента А показана в виде изображения на рис. 7.30b. 7.3.4 Очистка и реконструкция Результат стереосопоставления, такой как показанный на рис. 7.22 или 7.30а, имеет ряд недостатков по причинам, которые мы только что описали. Для роботизированных операций, таких как планирование пути и обход препятствий, важно знать трехмерную структуру мира, но также критически важно знать, чего мы не знаем. Там, где отсутствует надежная информация о глубине от системы стереозрения, робот должен проявлять осторожность и относиться к ней иначе, чем к свободному пространству. Существует ряд простых мер, чтобы пометить элементы изображения диспаратности как недействительные или ненадежные. v (пиксели) Диспаратность (пиксели) 428 Глава 7 · Использование нескольких изображений |A| (острота пика) u (пиксели) v (пиксели) a b u (пиксели) Рис. 7.30. a) Изображение диспаратности с уточнением пика; b) величина коэффициента d2 для каждого пикселя. Высокие значения (яркие области) соответствуют резким пикам и встречаются там, где текстурированность изображения высока. Широкие пики (темные области) появляются там, где текстурированность изображения низкая Начнем с создания матрицы status того же размера, что и d, и инициализируем ее единичным значением: >> status = ones(size(d)); Элементам присваивают другие значения, если они соответствуют конкретным условиям проблемной ситуации: >> [U,V] = imeshgrid(L); >> status(isnan(d)) = 5; % выход поискового шаблона за край >> status(U<=90) = 2; % нет перекрытия >> status(sim<0.8) = 3; % слабое совпадение >> status(peak.A>=-0.1) = 4; % широкий пик Стереозрение 429 Мы можем отобразить эту матрицу как изображение: >> idisp(status) >> colormap( colorname({'lightgreen', 'cyan', 'blue', 'orange', 'red'}) ) как показано на рис. 7.31. Согласно цветовой легенде значений состояния справа от изображения, светло-зеленым цветом обозначено хорошее стереосопоставление, голубым – если диапазон поиска диспаратности выходит за пределы левого края правого изображения, синим – если сходство пиков слишком мало, оранжевым – если пик слишком широкий, а красным показаны значения NaN, в которых поисковый шаблон выходит за край изображения. Хорошей новостью является то, что здесь много светло-зеленых пикселей! Фактически >> sum(status(:) == 1) / prod(size(status)) * 100 ans = 57.7223 почти 60 % значений диспаратности проходят нашу серию тес­ тов качества. Синие пиксели, указывающие на слабое сходство, появляются по краям камней и возникают из-за окклюзии. Оранжевые пиксели, указывающие на широкий пик, встречаются в достаточно гладких областях, либо в глубоких тенях между камнями, либо на фоне, который не является камнем. Ранее мы создали интерполированное изображение диспаратности di, а теперь аннулируем значения диспаратности, которые мы определили как ненадежные >> di(status>1) = NaN; NaN v (пиксели) широкий пик слабый пик нет перекрытия ОК Рис. 7.31. Статус стереосопоставления для каждого пикселя u (пиксели) 430 Глава 7 · Использование нескольких изображений установив для них значение NaN . Мы можем отобразить их как ненадежные пиксели, отмеченные красным цветом >> ipixswitch(isnan(di), 'red', di/90); Специальное значение с плавающей запятой NaN (not a number, не число) имеет полезное свойство, заключающееся в том, что результатом любой арифметической операции, включающей NaN, всегда является NaN. Многие функции MATLAB, такие как max или min, игнорируют значения NaN во входной матрице, а графические функции не отображают это значение, оставляя пустоту в графике или поверхности. как показано на рис. 7.32 . Теперь матрица имеет удобную Деление на 90 форму для робота – она содержит значения диспаратности, ин- предназначено для преобразования терполированные с точностью до пикселя, и все ненадежные значений диспаратзначения четко отмечены. Последним шагом является преоб- ности с плавающей разование значений диспаратности в пикселях в мировые ко- запятой в диапазоне 90] в действиординаты в метрах – процесс, известный как пространствен- [40, тельные значения ная реконструкция. В более раннем обсуждении разреженного оттенков серого стереосопоставления мы определили мировую точку по пере- в диапазоне [0, 1]. сечению двух лучей в трехмерном пространстве. Для системы стереокамер с параллельной осью, изображенной рис. 7.19, геометрическая схема намного проще, как показано на рис. 7.33. Для красного и синего треугольников мы можем написать: X = Z tan θ1, X – b = Z tan θ2, v (пиксели) где b – базисная линия, а углы лучей соответствуют горизонтальной координате изображения iu, i = {L, R}: u (пиксели) Рис. 7.32. Интерполированное изображение диспаратности, ненадежные оценки отмечены красным цветом Стереозрение 431 Рис. 7.33. Геометрия стереоскопической системы с параллельными осями камер. X и Z измеряются относительно первой камеры, b – базисная линия Замена и исключение X дает откуда следует, что глубина обратно пропорциональна диспаратности d = Lu − Ru и d > 0. Мы также можем восстановить координаты X и Y, откуда координаты точки в трехмерном пространстве будут следующими: (7.16) Хорошая система стереозрения позволяет оценить диспаратность с точностью до 0.2 пикселя. Удаленные точки имеют небольшую диспаратность, и погрешность расчетных пространственных координат будет значительной. Эмпирическое правило заключается в том, что системы стереозрения обычно имеют максимальный диапазон 50b. Снимки из набора данных Middlebury (рис. 7.20) были сделаны с очень широкой базисной линией камеры. Левый край левого изображения и правый край правого изображения не перекрываются и обрезаются. Обрезка N пикселей только слева от левого изображения уменьшает диспаратность на N. Для этой стереопары фактическая диспаратность должна быть увеличена на 274, чтобы учесть обрезку. Процесс, называемый векторизацией. Использование матричных и векторных операций вместо циклов for значиИстинная диспаратность тельно увеличивает скорость выполнения кода MATLAB. >> di = di + 274; Подробнее см. http://www. Далее вычислим координаты X, Y и Z каждого пикселя как отmathworks.com/ дельные матрицы, чтобы использовать эффективные матричsupport/tech-notes/ 1100/1109.html. ные операции MATLAB 432 Глава 7 · Использование нескольких изображений >> [U,V] = imeshgrid(L); >> u0 = size(L,2)/2; v0 = size(L,1)/2; >> b = 0.160; >> X = b*(U-u0) ./ di; Y = b*(V-v0) ./ di; Z = 3740 * b ./ di; которые можно отобразить как поверхность >> surf(Z) >> shading interp; view(-150, 75) >> set(gca,'ZDir', 'reverse'); set(gca,'XDir', 'reverse') >> colormap(f lipud(hot)) Дальность, м как показано на рис. 7.34. Это изображение не очень впечатляет в напечатанном виде, но при использовании мыши для поворота изображения с использованием опции 3D rotate MATLAB его трехмерность становится хорошо видна. Повернутые оси необходимы для увеличения z с нашей точки зрения и для получения правосторонней системы координат. На этой поверхности есть много отверстий, представляющих собой значения NaN, которые мы вставили, чтобы указать ненадежные значения диспаратности. Рис. 7.34. Трехмерная реконструкция для параллельных стереокамер. Более теплые цвета указывают на части поверхности, которые находятся дальше от камеры 7.3.5 Отображение 3D-текстуры Если стереоданные будет использовать человек, а не робот, было бы неплохо улучшить представление поверхности, чтобы она выглядела менее рваной. Создаем медианное отфильтрованное изображение >> dimf = irank(di, 41, ones(9,9)); Стереозрение 433 где каждый выходной пиксель является медианным значением для окна 9´9. Этот прием позволяет залатать многие небольшие отверстия, но имеет нежелательный побочный эффект размытия основного изображения диспаратности. Мы поступим иначе: сохраним исходное интерполированное изображение диспаратности и вставим медианные отфильтрованные значения только там, где встречается NaN: >> di = ipixswitch(isnan(di), dimf, di); Выполним реконструкцию повторно: >> X = b*(U-u0) ./ di; Y = b*(V-v0) ./ di; Z = 3740 * b ./ di; Если отобразить результат как поверхность, она будет выглядеть значительно менее неровной. Но мы можем сделать еще лучше – наложить левое изображение на трехмерную поверхность, используя процесс, называемый наложением текстуры. Перезагрузим левое изображение, на этот раз в цвете, >> Lcolor = iread('rocks2-l.png'); и визуализируем поверхность с нанесенной на карту текстурой изображения >> surface(X, Y, Z, Lcolor, 'FaceColor', 'texturemap', ... 'EdgeColor', 'none', 'CDataMapping', 'direct') >> xyzlabel >> set(gca,'ZDir', 'reverse'); set(gca,'XDir', 'reverse') что дает нам изображение, показанное на рис. 7.35. Здесь тоже можно получить представление о трехмерности, используя мышь для вращения изображения с по­мощью опции 3D rotate MATLAB. 7.3.6 Анаглифы Человеческое стереовосприятие глубины работает, потому что каждый глаз смотрит на сцену с разных точек зрения. Если мы посмотрим на фотографию объемной сцены, мы все равно получим ощущение глубины, хотя и уменьшенное, потому что помимо стереоэффекта наш мозг использует множество визуальных сигналов для определения глубины. С момента изобретения фотографии в XIX в. люди были очарованы 3D-фо­то­гра­фиями и фильмами, и нынешняя популярность 3D-фильмов и наличие 3D-телевидения являются еще одним свидетельст­вом этого. 434 Глава 7 · Использование нескольких изображений Рис. 7.35. Пространственная реконструкция для параллельных стереокамер с нанесением текстуры изображения на поверхность Ключом ко всем технологиям 3D-отображения является получение изображений с двух камер с базисной линией, аналогичной человеческому зрению (примерно 8 см), и повторная демонстрация этих изображений соответствующим глазам зрителя. Старомодные стереограммы требовали бинокулярного устройства просмотра или заставляли зрителя прищурившись смотреть на стереограмму, скосив глаза. Более современными и удобными средствами просмотра стереопар являются затворные ЖК-очки (обычно игровые), поляризованные очки, позволяющие просматривать полноцветные стереофильмы, или наголовные дисплеи (очки виртуальной реальности). Старый, но недорогой метод просмотра стереоизображений – это анаглифные изображения, в которых левое и правое изображения накладываются друг на друга разными цветами. Обычно красный цвет используется для левого глаза, а голубой (зеленовато-синий) – для правого, но используются и многие другие цветовые комбинации. Красная линза пропускает только красную часть анаглифного изображения к левому глазу, в то время как голубая линза пропускает только голубые части изображения к правому глазу. Недостатком является то, что можно изобразить только интенсивность сцены, а не ее цвет. Большим преимуществом анаглифов является то, что их можно распечатать на бумаге или снять на обычную кинопленку и просмотреть с по­мощью простых и дешевых очков, таких как те, что показаны на рис. 7.36а. Стереопару кучи камней можно отобразить в виде анаглифа >> anaglyph(L, R, 'rc') Стереозрение 435 Анаглифы. Самые первые разработки появились во Франции. В 1858 г. Джозеф Д’Алмейда проецировал слайд-шоу волшебных фонарей в формате 3D в виде красно-синих анаглифов, а зрители надевали красно-синие очки. Примерно в то же время Луи Дю Орон создал первые печатные анаглифы. Позже, примерно в 1890 г., Уильям Фризе-Грин создал первые трехмерные анаглифные фильмы, используя камеру с двумя объективами. Анаглифные фильмы, называемые пластиконами или пластиграммами, были повальным увлечением в 1920-х гг. Сегодня панорамные анаглифы высокого разрешения можно найти на http:// gigapan.com, а анаглифы Марса можно найти на http://mars.nasa.gov/mars3d. Рис. 7.36. Анаглифы для стереопросмотра: а) анаглифные очки с красными и синими стеклами, b) анаглифная визуализация сцены с камнями на рис. 7.20, где левая часть окрашена красным, а правая – голубым а 7.3.7 v (пиксели) как показано на рис. 7.36b. Аргумент 'rc' указывает, что левое и правое изображения закодированы красным и голубым соответственно. К другим вариантам цветовых пар относятся: синий–зеленый и пурпурный–оранжевый. b v (пиксели) Исправление изображения Стереопара кучи камней на рис. 7.20 имеет связанные точки в одном ряду на левом и правом изображениях – это пара изображений, выровненных по эпиполяру. Стереокамеры, такие как показанные на рис. 7.19, сконструированы таким образом, чтобы обеспечить параллельность оптических осей камер и плоскостей поверхности двух фотосенсоров. Однако сущест­ вуют пределы точности механического выравнивания плюс дисторсия объектива – все вместе приведет к ошибке стереопары. Обычно одно или оба изображения искажаются для исправления этих ошибок – процесс, называемый исправлением изображения (image rectification). Для демонстрации исправления воспользуемся стереопарой двора с рис. 7.15: 436 Глава 7 · Использование нескольких изображений >> L = iread('walls-l.jpg', 'mono', 'double', 'reduce', 2); >> R = iread('walls-r.jpg', 'mono', 'double', 'reduce', 2); которая, как мы помним, далека от эпиполярности. Сначала мы находим признаки SURF >> sL = isurf(L); >> sR = isurf(R); и определяем совпадения-кандидаты >> m = sL.match(sR, 'top', 1000); затем определяем эпиполярные отношения: >> F = m.ransac(@fmatrix,1e-4, 'verbose'); 96 trials 309 outliers 0.000305205 f inal residual Для шага исправления требуется фундаментальная матрица, а также набор связанных точек, которые встроены в объект FeatureMatch m. >> [Lr,Rr] = irectify(F, m, L, R); Отобразим исправленные версии двух входных изображений с по­мощью stdisp >> stdisp(Lr, Rr) v (пиксели) как показано на рис. 7.37. Мы видим, что связанные точки в сцене теперь имеют одинаковую вертикальную координату. Функция irectify работает, вычисляя уникальные гомографии для деформации левого и правого изображений. Как мы заметили ранее, при деформации изображений не все выходные пиксели сопоставляются с входными изображениями, что v (пиксели) Рис. 7.37. Исправленные изображения двора. Красные пиксели не имеют соответствия на другом изображении Пакетная подстройка 437 приводит к неопределенным пикселям, которые отображаются здесь как красные. Мы можем рассматривать эти изображения как полученные с виртуальной стереокамеры с параллельными осями и выровненными рядами пикселей, и теперь их можно использовать для плотного стереосопоставления: >> d = istereo(Lr, Rr, [180 530], 7, 'interp'); v (пиксели) Диспаратность (пиксели) Результат показан на рис. 7.38. Параметры диапазона диспаратности определялись в интерактивном режиме с использованием stdisp(Lr, Rr) для проверки диспаратности в ближней и дальней точках пары исправленных изображений. Половинный размер окна, равный 7, был получен путем проб и ошибок, это значение соответствует окну 15´15 и дает достаточно гладкий результат за счет более объемных вычислений. Шумные пятна внизу и вверху справа возникли из-за окклюзии – точки мира на одном изображении не видны на другом. Тем не менее это весьма впечатляющий результат – используя всего два изображения, снятых с ручной камеры, мы смогли создать плотное трехмерное изображение сцены. Рис. 7.38. Плотное стереоизображение диспаратности для снимков двора. Стены и земля демонстрируют четкий градиент глубины 7.4 u (пиксели) Пакетная подстройка В разделе 7.3.1 мы использовали триангуляцию для нахождения трехмерных координат ряда точечных ориентиров, но это было приближение, основанное на предположении о положении двух камер относительно друг друга. Чтобы оценить качество 438 Глава 7 · Использование нескольких изображений нашего решения, можно выполнить обратную проекцию (пере- В данном случае проецирование) предполагаемых объемных точек на плоскость мы нашли только относительное изображения на основе предполагаемых положений камеры положение 1ξ2, но и известной модели камеры. Ошибка обратной проекции – это можно рассмат­ расстояние в плоскости изображения между проецируемой об- ривать положение первой камеры как ратно точкой и ее наблюдаемым положением на плоскости изо- опорную систему координат ξ1 = 0 бражения. 1 Для предыдущего примера обратная проекция будет сле­ и ξ2 = ξ2. дующей: >> p1 = cam.project(P); >> p2 = cam.move(T).project(P); для первой и второй камеры соответственно. Расстояния между обратными проекциями и наблюдениями по обеим камерам равны >> e = colnorm( [p1-m2.p1 p2-m2.p2] ); со статистическими показателями >> mean(e) ans = 0.9942 >> max(e) ans = 6.6765 которые ясно указывают на приблизительный характер нашего решения – каждая точка обратной проекции имеет ошибку до 7 пикселей. К сожалению, мы не знаем, связана ли ошибка с предполагаемыми положениями камер, координатами точки или и с тем, и с другим. Однако мы знаем, что хорошей оценкой является та, где общая ошибка обратной проекции невелика, – в идеале ноль. Пакетная подстройка (bundle adjustment) – это процесс оптимизации, при котором одновременно корректируются положения камер и координаты точек, чтобы свести к минимуму общую ошибку обратной проекции. Он использует 2D-измерения из набора изображений одной и той же сцены для восстановления информации, связанной с 3D-геометрией отображаемой сцены, а также с расположением и оптическими характеристиками камер. Этот алгоритм также называется «Структура из движения» (Structure from Motion, SfM) или «Вычисление структуры и движения» (Structure and Motion Estimation, SaM) – структура представляет собой трехмерные точечные ориентиры в мире, а движение представляет собой последовательность положений камеры. Раньше мы рассматривали планарную задачу, решаемую в трех измерениях SE(2), тогда как пакетная подстройка включает в себя положения камеры в SE(3) и точки в �3. Пакетная подстройка 439 Для формализации задачи рассмотрим камеру с известными внутренними параметрами в N различных положениях ξi ∈ SE(3), i = 1 ⋯ N, и набор из M точек-ориентиров Pj ∈ �3, j = 1 ⋯ M. В положении {i} камера наблюдает Pj, а измеренная проекция плоскости изображения равна ipj# ∈ �2, но не все ориентиры обязательно видны из каждого положения камеры. На рис. 7.39 показаны обозначения для двух камер. Рис. 7.39. Обозначения пакетной подстройки на примере простой задачи, состоящей только из двух камер и трех мировых точек. Отображаются предполагаемые положения камеры и положения точек, а также предполагаемые и измеренные координаты плоскости изображения. Ошибки перепроецирования показаны пунктирными серыми линиями. Задача решена, когда переменные настроены так, чтобы суммарная ошибка перепроецирования была как можно меньше плос кость изоб раже ния п ость лоск ния раже изоб Расчетное значение проекции j-го ориентира на i-ю плоскость изображения на плоскость изображения равно i p̂j = �(ξ̂i, P̂j; K), а ошибка обратной проекции равна ip̂j – ipj#. Используя Toolbox, мы начинаем с создания объекта BundleAdjust: >> ba = BundleAdjust(cam); Ему передается внутренняя модель камеры, которая, как мы предполагаем, известна. Затем мы добавляем оценки двух положений камеры >> c1 = ba.add_camera( SE3(), 'f ixed' ); >> c2 = ba.add_camera( T ); и указываем, что положение первой камеры известно и что мы не хотим его оптимизировать. Предполагаемое положение второй камеры получено ранее из существенной матрицы. Метод возвращает целочисленный дескриптор конкретного положения камеры, который мы будем использовать далее. 440 Глава 7 · Использование нескольких изображений Далее добавляем предполагаемые ориентиры: >> for j=1:length(m2) lm = ba.add_landmark( P(:,j) ); ba.add_projection(c1, lm, m2(j).p1); ba.add_projection(c2, lm, m2(j).p2); end где lm – другой целочисленный дескриптор, в данном случае координаты конкретной ориентира. Наконец, мы добавляем измерения, указав камеру, ориентир и его проекцию на плоскость изображения. Теперь задача полностью определена, и можно отобразить ее сводку: >> ba ba = Bundle adjustment problem: 2 cameras locked cameras: 1 100 landmarks 200 projections 306 dimension linear problem landmarks per camera: min=100.0, max=100.0, avg=100.0 cameras per landmark: min=2.0, max=2.0, avg=2.0 Как правило, с любой камеры видно только подмножество ориентиров, и эту информацию о видимости можно элегантно представить с по­мощью графа, как показано на рис. 7.40, где каждое положение камеры и координата каждого ориентира являются узлом. Ребра между узлами камеры и ориентира представляют наблюдения, а значение ребра является наблюдаемой координатой плоскости изображения. Такой граф – объект Toolbox PGraph – хранится внутри объекта BundleAdjust и может быть построен с по­мощью команды >> ba.plot как показано на рис. 7.41. Чтобы решить эту задачу оптимизации, поместим все переменные, которые мы хотим настроить, в один вектор состояния. Для пакетной подстройки вектор состояния содержит положения камеры и координаты ориентиров x = {ξ1, ξ2, … ξN | P1, P2 … PM} ∈ �6N+3M, где положение камеры SE(3) представлено в векторном формате ξi ∼ (t, r) ∈ �6, включающем перемещение t ∈ �3 и вращение r ∈ �3; и Pj ∈ �3. К возможным вариантам представления вращения относятся углы Эйлера, углы крена-тангажа-рысканья, угловые оси Пакетная подстройка 441 характерные точки в 3D Рис. 7.40. Простой граф видимости, содержащий узлы камеры (красные) и узлы ориентиров (синие). Линии, соединяющие узлы, представляют вид этого узла на данной камере, а значение ребра – это наблюдаемая координата плоскости изображения. Ориентиры здесь просматриваются 1-й, 2-й или 3-й камерами вид z (м) положение камеры в SE(3) Рис. 7.41. Задача пакетной подстройки показана в виде встроенного графа. Синие точки обозначают положения ориентиров, значки камеры обозначают положение камер, а серые линии обозначают наблюдения. Камера 1 синяя, а камера 2 красная y (м) x (м) или экспоненциальные представления координат. Для пакетной подстройки обычно используется векторная компонента единичного кватерниона, которая имеет только три параметра. Свойство двойного покрытия единичных кватернионов означает, что любой единичный кватернион можно записать с неотрицательной скалярной составляющей. По определению единичный кватернион имеет единичную норму, поэтому скалярную составляющую можно легко восстановить через компоненты вектора: 442 Глава 7 · Использование нескольких изображений Количество неизвестных в этой системе равно 6N + 3M: шесть неизвестных для каждого положения камеры и три неизвестных для положения каждой точки-ориентира. При этом у нас есть до 2NM уравнений из-за измеренных проекций точек на плоскости изображения. Обычно предполагается, что положение одной камеры является опорной системой координат, и это уменьшает количество неизвестных до 6 (N – 1) + 3M. В данной задаче N = 2, но положение одной камеры фиксировано, а M = 100, поэтому имеем 6´(2 − 1) + 3´100 = 306 неизвестных и 2´2´100 = 400 уравнений – переопределенная система уравнений, для которой должно существовать решение. Для нашей задачи можно извлечь вектор состояния >> x = ba.getstate; >> about x x [double] : 1x312 (2.5 kB) который включает положение фиксированной камеры, хотя оно останется постоянным. Положение второй камеры хранится во втором блоке из шести элементов: >> x(7:12) ans = 0.3000 -0.0153 0.0558 0.0127 0.0014 -0.0057 как перемещение с последующим вращением, а первый ориентир сохраняется здесь: >> x(13:15) ans = 1.2134 -0.2627 2.9563 Пакетная подстройка – это задача минимизации, находящая положения камеры и ориентиров, которые минимизируют ошибку перепроецирования по всем ребрам: где Fk(·) > 0 – неотрицательная скалярная стоимость, связанная с ребром графа k от камеры i до ориентира j. Ошибка перепроецирования ориентира в точке Pj на камеру в положении ξi равна fk(x) = �(ξ̂i, P̂j; K) – ipj# ∈ �2, а скалярная стоимость – это квадрат евклидовой ошибки перепроецирования: Fk(x) = fk(x)T fk(x). Пакетная подстройка 443 Несмотря на то что она записана как функция всего вектора состояния, Fk(·) зависит только от двух элементов этого вектора: ξi и Pj. Общая ошибка, сумма квадратов ошибок обратной проекции для всех ребер, может быть вычислена для любого значения вектора состояния и для начальных условий как >> ba.errors(x) ans = 553.2853 Задача пакетной подстройки заключается в настройке параметров камеры и ориентира таким образом, чтобы уменьшить это значение. Мы определили пакетную подстройку как разреженную нелинейную задачу наименьших квадратов, и ее можно решить численно, если у нас есть достаточно хорошая начальная оценка x. Первым шагом в решении этого класса задач является линеа­ ризация. Ошибка перепроецирования fk(x) может быть линеаризована относительно текущего состояния x0 системы: f k¢(D) » f0,k + JkD, где f0,k = fk(x0) и являются матрицей Якоби, которая зависит только от положения камеры ξi и положения ориентира Pj, поэтому в основном состоит из нулей: Jk = (0 … Ai … Bj … 0), где Структура матрицы Якоби Ai специфична для выбранного представления положения камеры. Якобианы, особенно Ai, довольно сложно выводятся аналитически, но могут быть автоматически сгенерированы с по­мощью MATLAB Symbolic Math Toolbox™ и скрипта vision/symbolic/bundleAdjust. Код реализуется методом derivs класса CentralCamera Перемещение камеры на d и пере- [p,A,B] = cam.derivs(t, r, P); мещение точки на −d оказывают эквивалентное влияние который возвращает проекцию плоскости изображения и два на изображение. якобиана за один вызов, где t и r – положение камеры, а P – коПоэтому Bj полу- ордината ориентира . Линеаризация и якобианы обсуждаютчается инверсией знака первых трех ся в приложении E, а решение разреженных нелинейных уравстолбцов Aj. нений – в приложении F. 444 Глава 7 · Использование нескольких изображений Теперь, когда все компоненты на своих местах, мы можем решить нашу задачу пакетной подстройки: >> baf = ba.optimize(x); Initial cost 553.285 total cost 33.5955 (solved in 0.15 sec) total cost 33.5459 (solved in 0.051 sec) total cost 33.5459 (solved in 0.04 sec) total cost 33.5459 (solved in 0.038 sec) total cost 33.5459 (solved in 0.041 sec) total cost 33.5459 (solved in 0.037 sec) * 6 iterations in 0.5 seconds * 0.41 pixels RMS error Текст вывода показывает, как общая стоимость (квадрат ошибки перепроецирования) уменьшается на каждой итерации, снижаясь более чем на порядок. Окончательный результат имеет среднеквадратичную ошибку перепроецирования меньше, чем полпикселя для каждого ориентира, что впечатляет, учитывая, что изображения были сняты с по­мощью камеры телефона, и мы полностью проигнорировали искажения объектива. Результатом является еще один объект BundleAdjust, но с обновленными положениями камеры и ориентиров. Мы можем сравнить начальное и конечное положение второй камеры: >> ba.getcamera(2).print('camera') t = (0.3, -0.0153, 0.0558), RPY/yxz = (-0.657, 1.46, 0.156) deg >> baf.getcamera(2).print('camera') t = (0.303, -0.0158, 0.0649), RPY/yxz = (-0.685, 1.38, 0.128) deg а конечная координата ориентира 5 равна >> baf.getlandmark(5)' ans = -0.3861 -0.0968 2.0744 Мы также можем представить результат графически: >> ba.plot() как показано на рис. 7.41. Хотя общая среднеквадратическая ошибка невелика, мы можем более подробно рассмотреть окончательную ошибку перепроецирования: >> e = sqrt( baf.getresidual() ); >> about e e [double] : 2x100 (1.6 kB) где элемент (i, j) – ошибка перепроецирования в пикселях для камеры i и ориентира j. Медианная ошибка составляет Пакетная подстройка 445 >> median( e(:) ) ans = 0.2540 около четверти пикселя, но есть несколько ориентиров с окончательной ошибкой перепроецирования в первой камере, которая превышает 1 пиксель, >> f ind( e(1,:) > 1 ) ans = 90 97 и самая большая ошибка для первой камеры >> [mx,k] = max( e(1,:) ) mx = 1.2129 k = 90 составляющая 1.2 пикселя, соответствует ориентиру 90. Пакетная подстройка находит оптимальные относительные положение и позицию, а не абсолютные. Например, если все камеры и ориентиры переместятся на 1 м в направлении x, общая ошибка перепроецирования не изменится. Чтобы исправить эту неоднозначность, мы можем зафиксировать или привязать одну или несколько камер или ориентиров – в этом примере мы зафиксировали первую камеру. Значения фиксированных позиций и положений сохраняются в векторе состояния, но они не обновляются во время итераций – их якобианы не нужно вычислять, а матрица Гессе, используемая для решения обновления на каждой итерации, становится меньше, поскольку строки и столбцы, соответствующие этим фиксированным параметрам, можно удалить. Фундаментальная проблема неоднозначности масштаба монокулярных камер упоминалась несколько раз, и здесь она тоже актуальна. Если изменить размер объектов мира и соответственно смасштабировать изображение камеры, то наблюдаемая модель мира будет неотличима от реальности. Говоря более формально, если вся задача масштабирована так, что Pj¢ = λPj, [ξi¢] = λ[ξi]t и λ ≠ 0, общая ошибка повторного проецирования будет такой же. Решение, которое мы получили выше, имеет произвольный масштаб или значение λ – изменение начального условия для положения камеры или координат ориентира приведет к решению с другим масштабом. Мы можем исправить это, привязав положение как минимум двух камер, одной камеры и одного ориентира или двух ориентиров. Методика пакетной подстройки (но не эта реализация) допускает ограничения между камерами. Например, многокамерная 446 Глава 7 · Использование нескольких изображений система, перемещающаяся в пространстве, будет использовать ограничения для обеспечения фиксированного относительного положения камер на каждом временном шаге. Данные колесной одометрии или инерциальных измерений можно использовать для ограничения расстояния между системами координат камер для обеспечения правильного масштаба, или, как вариант, данные об ориентации от IMU можно использовать для ограничения положения камеры. В базовом графовом представлении задачи, как показано на рис. 7.40, это потребовало бы добавления дополнительных ребер между узлами камеры. Можно также добавить ограничения взаимного положения ориентиров, которые имеют известное относительное положение, например углы окна, – это потребует добавления дополнительных ребер между соответствующими узлами ориентира. Конкретная задача, которую мы изучали, необычна тем, что каждая камера видит каждый ориентир. Намного чаще встречается ситуация, когда камера может перемещаться в очень обширной среде, поэтому любая камера будет видеть только небольшое подмножество ориентиров. В системе реального времени может выполняться ограниченная пакетная подстройка по отношению к случайным кадрам, называемым ключевыми кадрами, и полная пакетная подстройка по всем кадрам или всем ключевым кадрам, выполняемая с низкой скоростью в фоновом режиме. В этом примере мы предположили, что внутренние параметры камеры известны и постоянны. Теоретически пакетная подстройка может работать как с внутренними, так и с внешними параметрами. Мы просто добавляем дополнительные параметры для каждой камеры в вектор состояния и соответствующим образом корректируем якобиан A. Однако, в связи Матрица камеры имеет произвольс наличием связи между внутренними и внешними параме- ный масштабный трами , это может привести к снижению производительно- коэффициент. сти. Если бы мы решили находить элементы матрицы камеры C напрямую, то вектор состояния содержал бы 11, а не 6 эле- Изменения фокусментов для каждой камеры. Но если Ci и Pj являются решения- ного расстояния и перемещения по ми, то CiQ−1 и QP̃j тоже будут решениями для любой невырож- оси z дают такие же 4´4 денной матрицы Q ∈ � . К счастью, проекционные матрицы эффекты на плоскореальных камер имеют четко определенную структуру и свой- сти изображения, как и изменения ства, и они обеспечивают ограничения, которые позволяют главной точки и пенам оценить Q. Нахождение произвольной Ci называется про- ремещения камеры ективной реконструкцией (projective reconstruction). Она может по осям x и y. быть улучшена до аффинной реконструкции (с использованием аффинной модели камеры) или метрической реконструкции (с использованием модели перспективной камеры) путем соответствующего выбора Q. Облака точек 447 7.5 Облака точек Стереозрение дает нам набор трехмерных мировых точек Pi, которые часто называют облаком точек. В робототехнике нам нужно извлечь какой-то краткий смысл из тысяч или миллионов точек. 7.5.1 Поиск плоскости В нашем вещественном мире часто встречаются разнообразные плоскости, но для робототехники наиболее полезными плоскостями являются земля (для управления колесным мобильным роботом или посадки БПЛА) и стены. Если мы располагаем набором трехмерных координат в виде облака точек, простой и эффективный способ поиска плоскости, лучше всего совпадающей с облаком точек, состоит в том, чтобы подогнать данные к эллипсоиду. Эллипсоид будет иметь очень маленькую ось в направлении нормали к искомой плоскости – фактически это будет сплюснутая эллипсоидная пластина. Матрица инерции точек может быть рассчитана по формуле (7.17) – где x = Pi − P – координаты точек относительно их центроида Эллипсоид центрирован по центроиду облака точек. Радиусы эллипсоида являются собственными значениями J, а собственный вектор, соответствующий наименьшему собственному значению, является направлением минимального радиуса, который является нормалью к плоскости. Чтобы проиллюстрировать это, создадим сетку 10´10 точек на произвольно ориентированной плоскости >> T = SE3(1,2,3) * SE3.rpy(0.3, 0.4, 0.5); >> P = mkgrid(10, 1, 'pose', T); >> P = P + 0.02*randn(size(P)); представленной однородным преобразованием T, к которому добавлен гауссов шум с σ = 0.02 м. Среднее значение облака точек равно: >> x0 = mean(P') ans = 0.9967 2.0009 3.0013 448 Глава 7 · Использование нескольких изображений Вычитаем его из всех точек данных: >> P = bsxfun(@minus, P, x0'); Уравнение инерции 7.17 – это просто умножение матриц: >> J = P*P' J = 7.8769 0.3239 0.3239 10.0076 -4.2585 0.6153 -4.2585 0.6153 2.4271 Собственные значения: >> [x,lambda] = eig(J); >> diag(lambda)' ans = 0.0478 10.0553 10.2085 Мы видим два больших собственных значения, соответствующих разбросу точек внутри плоскости, и одно собственное значение, которое представляет собой толщину зашумленной плоскости. Собственный вектор, соответствующий первому и наименьшему собственному значению, равен >> n = x(:,1)' n = 0.4789 -0.0696 0.8751 что является искомой нормалью к плоскости. Истинное направление нормали плоскости задается третьим Поскольку точки лежат в плоскости столбцом матрицы вращения: >> T. SO3.a' ans = 0.4682 -0.0810 xy системы координат, нормаль – это ее ось z. 0.8799 и мы видим, что она очень близка к найденной нормали. Уравнение плоскости – это множество точек x таких, что nT(x – x0) = 0, (7.18) где n – это нормаль, а x0 – центроид. Проблемой этого способа поиска плоскости являются выбросы данных, поскольку они значительно искажают решение. Существует целый ряд способов решения этой проблемы, но самый простой из них заключается в добавлении весового коэффициента в уравнение 7.17: Облака точек 449 Обычно исполь­ который обратно пропорционален расстоянию xi от плоскости зуется функция и вычисляется итеративно. Изначально все веса w = 1, а на поi Коши–Лоренца w = β2/(d 2 + β 2), следующих итерациях устанавливаются в соответствии с расгде d – расстояние стоянием Pi от плоскости, оцененным на предыдущем шаге. точки от плоскости, В качестве альтернативы можно применить алгоритм а β – полуширина. RANSAC, взяв выборки из трех точек для решения уравнеФункция является гладкой для ния 7.18. Раздел C.1.4 содержит более подробную информацию d = [0, inf) и имеет об эллипсах. значение ½, когда d = β. 7.5.2 Сопоставление двух наборов точек Рассмотрим модель некоторого объекта, представленного набором точек в двух или трех измерениях относительно мировой системы отсчета. Теперь представим, что этот объект принял другое положение, и мы наблюдаем другой набор двухмерных или трехмерных точек. Задача состоит в том, чтобы путем сопоставления двух наборов точек определить относительное положение ξ, при котором исходные точки преобразуются в наЭто дуалистическая блюдаемые . задача. Тот же метод Более формально можно сказать, что нам даны два набора томожно применить чечных координатных векторов: модель Mi ∈ �n, i ∈ [1, NM] и недля определения n движения камеры. которые зашумленные наблюдаемые данные Dj ∈ � , j ∈ [1, ND], определяющие движение твердого тела из системы координат данных в систему координат модели: На первый взгляд это выглядит как задача, в которой нам нужно установить соответствие между точками в двух наборах, но мы представим альтернативный подход, называемый итеративным поиском ближайшей точки (iterated closest point, ICP). Для каждой точки данных Dj соответствующая точка модели Mi считается ближайшей, если она минимизирует ||Mi − Dj||. Соответствие неуникально, и довольно часто несколько точек в одном наборе связано с одной точкой в другом наборе, и, следовательно, некоторые точки будут непарными. Часто датчик возвращает только подмножество точек модели; например, лазерный сканер может видеть переднюю часть объекта, но не заднюю. Этот подход к сопоставлению далек от совершенства, но он на удивление хорош на практике и улучшает выравнивание облаков точек, так что в следующей итерации вычисленные соответствия будут чуть более точными. В робототехнике часто встречается задача, когда есть модель M трехмерного объекта, которую нужно подогнать к наблюдае- 450 Глава 7 · Использование нескольких изображений мым данным сенсора D (говоря современным языком, обучить Эта модель хорошо на данных этого сенсора). Для иллюстрации мы загрузим вер- известна в сообществе компьютерной сию знаменитого Стэнфордского кролика : графики. Она была создана Грегом Терком и Марком Левоем в 1994 г. в Стэнфордском университете использованием которая представляет собой облако из 453 трехмерных точек, ссканера Cyberware и это будет наша модель: 3030 MS и керамической фигурки >> M = bunny; кролика. Исходный скан содержит Смоделируем сенсор, который наблюдает за моделью от- более 30 000 точек, здесь мы используносительно другой системы координат, делая копию модели ем версию с низким и применяя преобразование: разрешением. >> load bunny >> about bunny bunny [double] : 3x453 (10.9 kB) >> T_unknown = SE3(0.2, 0.2, 0.1) * SE3.rpy(0.2, 0.3, 0.4); >> D = T_unknown * M; Первым шагом является вычисление смещения, которое Мы рассматриваем общий случай, приводит к совпадению центроидов двух облаков точек : когда два облака точек имеют разное количество точек, т. е. ND ≠ NM. из которого получается смещение: Далее выполним сопоставление. Для каждой точки данных Dj найдем ближайшую точку модели Mi, и для этого воспользуемся функцией Toolbox closest: >> corresp = closest(D, M); где i=corresp(j) – столбец матрицы M, соответствующий столбцу j матрицы D. Следующим шагом является вычисление матрицы моментов 3´3: которая кодирует вращение между двумя наборами точек . Это сумма нескольких матриц ранга 1. Разложение по сингулярным числам: W = U ΣV T, Облака точек 451 См. раздел F.1.1. из которого определяется матрица вращения : R = YU T. Расчетное относительное положение между двумя облаками точек составляет ξ∆ ∼ (R, t), а точки модели преобразуются так, чтобы они были ближе к точкам данных: Mi ← ξ • Mi, ∀i; ξ ← ξ ⊕ ξD, и процесс повторяется до схождения. Маловероятно, что все используемые соответствия были правильными, и поэтому оценка относительной ориентации между наборами является лишь приблизительной. Toolbox предоставляет реализацию ICP (рис. 7.42) >> [T,d] = icp(M, D, 'plot'); которая возвращает положение DξM >> trprint(T, 'rpy', 'radian') t = (0.2, 0.2, 0.1), RPY/zyx = (0.2, 0.3, 0.4) rad что в точности соответствует «неизвестному» относительному положению облака точек данных, которое мы выбрали выше. Невязка >> d d = 1.7619e-15 является среднеквадратичным значением ошибок между преобразованными точками модели и данными. Параметр 'plot' a b Рис. 7.42. Итеративный поиск ближайших точек (ICP) двух облаков точек: модель (красный) и данные (синий) a) до регистрации, b) после регистрации; наблюдаемые точки данных были преобразованы в систему координат модели с по­мощью обратного идентифицированного преобразования (модель Стэнфордского кролика предоставлена Стэнфордской лабораторией графики) 452 Глава 7 · Использование нескольких изображений показывает модель и точки данных на каждом шаге, а также наиболее близкие точки соответствия. Алгоритм ICP приобрел широкую популярность, потому что он быстрый и надежный. Можно продемонстрировать надежность ICP, моделируя некоторые реалистичные ошибки сенсора. Во-первых, случайным образом удалим сорок точек из данных >> D(:,randi(numcols(D), 40,1)) = []; что имитирует точки модели, не наблюдаемые сенсором. Затем добавим 20 ложных точек, не входящих в модель >> D = [D 0.1*rand(3,20)+0.1]; и, наконец, добавим к данным гауссов шум с σ = 0.01: >> D = D + 0.01*randn(size(D)); Теперь сопоставим эти несовершенные данные сенсора с моделью >> [T,d] = icp(M, D, 'plot', 'distthresh', 3); используя дополнительную опцию для устранения некорректных соответствий ближайших точек. В соответствии с описанным выше алгоритмом устанавливаются соответствия и вычисляется медиана расстояний между сопоставленными точками. В этом случае соответствие между точками не устанавливается, если расстояние между ними более чем в три раза превышает медианное расстояние. Расчетное положение DξM теперь >> trprint(T, 'rpy', 'radian') t = (0.186, 0.194, 0.108), RPY/zyx = (0.125, 0.287, 0.298) rad что все еще близко к значению, рассчитанному для идеального случая, но невязка >> d d = 0.2114 Мы ожидаем, что невязка будет приблизительно выше, так как точное соответствие между моделью и искажен- равна Nσ, где ными шумом данными теперь невозможно . ICP – это попу- N – количество солярный, быстрый и надежный алгоритм для облаков точек уме- поставленных точек, а σ – стандартное ренного размера, но его вычислительные затраты составляют отклонение адди2 O(N ), что становится узким местом в случае больших наборов тивного шума. данных . Для крупномасштабных задач данные хранят в kd-дереве, что сокращает время, необходимое для поиска ближайшей точки. Структурированный свет 453 7.6 Структурированный свет Лазерные линейные Старый, но простой и эффективный метод оценки трехмерной проекторы, так структуры сцены – структурированный свет (structured light). называемые лазерные полосы или Концептуально он похож на стереозрение, но мы заменяем лелинейные лазеры, вую камеру проектором, излучающим вертикальную плоскость можно купить всего света, как показано на рис. 7.43а . В системе стереозрения это за несколько долларов. Они состоят из эквивалентно левому изображению, представляющему собой маломощного твер- вертикальную линию. Изображение линии, спроецированное дотельного лазера на поверхность, видимую из правой камеры, будет искажени цилиндрической линзы или дифрак- ной версией линии, как показано на рис. 7.43b. Диспаратность ционного оптиче- между виртуальным левым изображением и реальным правым ского элемента. изображением зависит от глубины точек вдоль линии. a b виртуальная плоскость изображения плоскость изображения Рис. 7.43. a) Геометрическая схема метода структурированного света, на которой показан излучатель света слева и камера справа; четыре сопряженные точки отмечены кружками на левом и правом изображениях и сцене; b) пример реального структурированного света, демонстрирующий световую полосу, падающую на простую трехмерную сцену. Наложенная пунктирная линия представляет положение полосы для плоскости в бесконечности. Несоответствие – сдвиг влево линии проекции относительно пунктирной линии – обратно пропорционально глубине Поиск световой полосы на сцене – относительно простая задача компьютерного зрения. В каждой строке изображения мы ищем пиксель, соответствующий проецируемой полосе, исходя из интенсивности или цвета. Если системы координат камеры параллельны, то глубина вычисляется по уравнению (7.16). Чтобы оценить глубину сцены, нам нужно переместить плоскость света горизонтально по всей сцене. Для этого есть много способов: механическое вращение проектора лазерной полосы, использование движущегося зеркала для отклонения полосы или использование проектора данных и программного обеспечения для создания изображения с полосами света. Однако перемещение световой плоскости по сцене происходит 454 Глава 7 · Использование нескольких изображений u (пиксели) c b u (пиксели) Глубина, м v (пиксели) а v (пиксели) v (пиксели) медленно и принципиально ограничено скоростью, с которой мы можем получать последовательные изображения сцены. Один из способов ускорить процесс – спроецировать на сцену несколько линий, но тогда нам нужно решить проблему неоднозначности сопоставления, что не так просто, если части некоторых линий закрыты. Было предложено много решений, но, как правило, они включают в себя кодирование строк каким- Kinect для Xbox либо образом – с использованием разных цветов или с исполь- 360 и Kinect для Windows теперь зованием последовательности двоичных или кодированных называются Kinect 1. N серым шаблонов линий, которые могут обеспечить 2 строк Также есть сенсоры PrimeSense Carmine всего за N кадров. и Asus Xtion. Более Близкий подход состоит в том, чтобы спроецировать на новый Kinect для сцену известный, но случайный набор точек, как показано на Xbox One или рис. 7.44а. Каждую точку можно идентифицировать по уникаль- Kinect 2 использует измерение времени ному паттерну точек в окружающем ее окне. Оригинальный пролета луча для сенсор Kinect использует этот подход: его крайний левый каждого пикселя. объектив проецирует с по­мощью лазера с дифракционным Если смотреть на оптическим элементом инфракрасный точечный рисунок переднюю часть устройства. (рис. 7.44b), который снимает чувствительная инфракрасная камера, расположенная за объективом справа. Из этого снимка вычисляется изображение глубины, показанное на рис. 7.44с. u (пиксели) Рис. 7.44. 3D-изображение, полученное с помощью сенсора Kinect 360: a) случайный точечный рисунок, наблюдаемый инфракрасной камерой Kinect; b) исходная сцена, снятая цветной камерой Kinect; c) вычисленное изображение глубины. Красные пиксели обозначают значения NaN, при которых глубина не может быть вычислена из-за окклюзии или превышения максимального диапазона, например через окно в левой части сцены (изображения предоставлены Уильямом Чемберленом) Приложения 455 Форма точек также меняется в зависимости от расстояния из-за несовершенной фокусировки, и это дает дополнительные подсказки о расстоянии до точки. Средний объектив предназначен для обычной цветной камеры, обеспечивающей вид, показанный на рис. 7.44b. Это пример конструкции камеры RGBD, возвращающей значения цвета RGB, а также глубину (D) для каждого пикселя. Системы структурированного света хорошо работают на расстоянии в несколько метров в помещении, на поверхностях без текстуры, а также в темноте. Однако на открытом воздухе проецируемый рисунок перекрывается окружающим освещением от солнца. В некоторых системах объемного зрения, таких как Intel RealSense R200, также используется точечный проектор, иногда называемый спекл-проектором. Он создает искусственную текстуру, которая помогает системе стереозрения, когда она смотрит на бестекстурные поверхности, где совпадение часто слабое и неоднозначное, как обсуждалось в разделе 7.3.2.1. Преимущество такого сенсора заключается в том, что он способен работать в комбинированном режиме. В закрытом помещении, где нет освещения от солнца, а поверхности почти не имеют видимой текстуры, он использует спекл-засветку, а на открытой местности, где объекты обычно имеют богатую текстуру, – обычное стереозрение. 7.7 Приложения 7.7.1 Коррекция перспективы Возьмем изображение >> im = iread('notre-dame.jpg', 'double'); >> idisp(im) показанное на рис. 7.45. Форма здания значительно искажена, потому что оптическая ось камеры не была перпендикулярна плоскости здания, и мы видим отчетливые признаки перспективного ракурса (трапецеидальное искажение). Укажем вручную четыре точки, которые являются углами большого прямоугольника на плоскости фасада здания, начиная из левого нижнего угла по часовой стрелке >> p1 = ginput(4)' ans = 44.1364 94.0065 537.8506 611.8247 377.0654 152.7850 163.4019 366.4486 v (пиксели) 456 Глава 7 · Использование нескольких изображений u (пиксели) Рис. 7.45. На снимке, сделанном с земли, виден эффект перспективного ракурса, который придает зданию трапециевидный вид (трапециевидное искажение). Четыре точки на плоскости фасада здания были отмечены вручную белыми круглыми маркерами (на снимке – собор Парижской Богоматери) Каждой точке соответствует столбец, содержащий координаты u и v. Отметим их на изображении собора и наложим полупрозрачную синюю форму: >> plot_poly(p1, 'wo', 'f illcolor', 'b', 'alpha', 0.2); Воспользуемся экстремумами этих точек для определения вершин прямоугольника на изображении >> mn = min(p1'); >> mx = max(p1'); >> p2 = [mn(1) mx(2); mn(1) mn(2); mx(1) mn(2); mx(1) mx(2)]'; который наложим на изображение красным цветом: >> plot_poly(p2, 'k', 'f illcolor', 'r', 'alpha', 0.2) Наборы точек p1 и p2 являются проекциями мировых точек, которые приблизительно лежат в плоскости, поэтому мы можем вычислить гомографию >> H = homography(p1, p2) H = 1.4003 0.3827 -136.5900 -0.0785 1.8049 -83.1054 -0.0003 0.0016 1.0000 Она превратит вершины синей трапеции в вершины красно- Гомографию также можно вычислить по го прямоугольника : p̃2 ≃ Hp̃1. Таким образом, гомография отображает координаты изображения из искаженной трапецеидальной формы в неискаженную прямоугольную. четырем линиям на плоскости, но Toolbox не поддерживает этот способ. Приложения 457 Эту гомографию можно применить к координате каждого пикселя в выходном изображении, чтобы деформировать входное изображение. Воспользуемся обобщенной функцией деформации изображения Toolbox: >> homwarp(H, im, 'full') Рис. 7.46. Фронтопараллельный вид, синтезированный из рис. 7.45. Изображение было преобразовано таким образом, что отмеченные точки трапеции стали углами прямоугольника на новом изображении v (пиксели) Результат, показанный на рис. 7.46, представляет собой синтетическую фронто-параллельную проекцию. Она эквивалентна виду, который можно было бы получить с камеры, парящей высоко в воздухе с оптической осью, перпендикулярной фасаду собора. Однако точки, которые не находятся в плоскости, например левая сторона правой колокольни, были искажены. Черные пиксели в выходном изображении возникают из-за того, что соответствующие координаты пикселей отсутствуют во входном изображении. Заметим, что без указания выходного аргумента искаженное изображение отображается с по­мощью idisp. u (пиксели) В дополнение к созданию этого синтетического вида можно разложить гомографию, чтобы восстановить движение камеры от фактической точки зрения к виртуальной, а также нормаль к поверхности собора. Как было показано в разделе 7.2.4, чтобы преобразовать проективную гомографию в евклидову, необходимо определить калибровочную матрицу камеры. Получим фокусное расстояние из метаданных в файле формата EXIF, который содержит изображение >> [~,md] = iread('notre-dame.jpg', 'double'); >> f = md.DigitalCamera.FocalLength f = 7.4000 458 Глава 7 · Использование нескольких изображений Фокусное расстояние измеряется в миллиметрах, а сенсор, как известно, имеет размер 7.18´5.32 мм. Создадим калиброванную камеру: >> cam = CentralCamera('image', im, 'focal', f/1000, ... 'sensor', [7.18e-3,5.32e-3]) name: image [central-perspective] focal length: 0.0074 pixel size: (1.122e-05, 1.249e-05) principal pt: (320, 213) number pixels: 640 x 426 pose: t = (0, 0, 0), RPY/yxz = (0, 0, 0) deg Теперь мы используем модель камеры для вычисления и декомпозиции евклидовой гомографии: >> sol = cam.invH(H, 'verbose'); solution 1 T = 0.99958 -0.01394 0.02526 0.01431 0.99979 -0.01453 -0.02505 0.01488 0.99958 0.00000 0.00000 0.00000 n = 0.21602 -0.95261 0.21420 solution 2 T = 0.98872 0.10353 -0.10820 -0.01647 0.79331 0.60859 0.14885 -0.59994 0.78607 0.00000 0.00000 0.00000 n = -0.18131 0.32802 0.92711 -0.07271 -0.00041 0.68149 1.00000 0.10448 -0.57151 0.36357 1.00000 которая возвращает массив структур из двух возможных решений для 1ξ2. Системы координат для этого примера показаны на рис. 7.47; они отражают реальное и виртуальное положение камеры. В этом случае правильным является второе решение, так как оно представляет собой значительный поворот вокруг оси абсцисс. Вектор перемещения камеры, который не соответствует масштабу, но имеет правильный знак , преимущественно См. Malis and Vargas находится в отрицательном направлении по y и положитель- (2007). ном направлении по z относительно системы координат {1}. Вращение в форме угла YXZ >> tr2rpy(sol(2).T, 'deg', 'camera') ans = -1.1893 -37.4876 -7.8375 указывает на то, что камеру необходимо наклонить вниз (наклон – это вращение вокруг оси x камеры) на 37°, чтобы добиться положения виртуальной камеры. Нормаль к фронтальной плоскости церкви n определяется относительно {1} и, как и ожидалось, проходит в направлении камеры по оси z. Приложения 459 виртуальная камера Рис. 7.47. Системы координат двух камер для примера со снимком Нотр-Дама. Синяя система {1} – это камера, снявшая исходное изображение, а красная система {2} – точка зрения камеры для синтетического изображения, дающего фронто-параллельный вид 7.7.2 ручная камера Мозаика [examples/mosaic] Мозаика, или сшивка изображений (image stitching), – это процесс создания крупномасштабного составного изображения из нескольких перекрывающихся изображений. Он обычно применяется к изображениям, полученным с дронов, и спутниковым снимкам, чтобы создать визуально непрерывное изображение поверхности Земли. Эту технологию также можно применять к изображениям морского дна, полученным с направленных Эмпирическое пра- вниз камер подводного робота. Программное обеспечение для вило заключается в том, что изображе- создания панорам, поставляемое с цифровыми камерами или ния должны пере- встроенное в них, является еще одним примером обработки крываться на 60 % мозаики. площади в прямом Входными данными для процесса создания мозаики являетнаправлении и на 30 % в боковом. ся последовательность перекрывающихся изображений . Нет необходимости знать параметры калибровки камеры или положение камеры, в которой были сделаны изображения, – камера может произвольно вращаться между изображениями, и масштаб может меняться. Однако для подхода, который мы будем использовать, предполагается, что сцена плоская, что разумно Отношение для высотной фотографии, где вертикальный рельеф невелик. высоты точек над В качестве иллюстрации воспользуемся реальными изобраплоскостью к расстоянию каме- жениями: ры от плоскости. >> im1 = iread('mosaic/aerial2-1.png', 'double', 'grey'); >> im2 = iread('mosaic/aerial2-2.png', 'double', 'grey'); каждое из которых имеет размер 1280´1024. Создадим пустое составное изображение размером 2000´2000: 460 Глава 7 · Использование нескольких изображений >> composite = zeros(2000,2000); которое будет вмещать мозаику. Основы процесса создания мозаики показаны на рис. 7.48. Первое изображение несложное, и мы просто вставляем его в верхний левый угол >> composite = ipaste(composite, im1, [1 1]); составного изображения, как показано красным на рис. 7.48. Следующее изображение, показанное синим цветом, более сложное, и его необходимо повернуть, масштабировать и переместить, чтобы оно правильно накладывалось на красное изображение. первое изображение второе изображение оригинал фрагмент изображения после искажения композитное изображение ограничивающая рамка Рис. 7.48. Первое изображение в последовательности В данном примере мы предполагаем, что сцена плоская. показано красным, Это означает, что мы можем использовать гомографию, чтобы второе – синим. связать различные ракурсы камеры. Первым шагом является Второе изображение преобразуется определение общих характерных точек, называемых точками в фрагмент привязки (tie point). Воспользуемся уже знакомыми инструмен- изображения, а затем смешивается тами: с составным изображением >> f1 = isurf(im1) >> f2 = isurf(im2) >> m = f1.match(f2); а затем алгоритмом RANSAC для нахождения гомографии: >> [H,in] = m.ransac(@homography, 0.2) которая отображает 1p в 2p. Теперь нужно сопоставить 2p с соответствующей координатой на первом изображении: 1 p ≃ H –1 2p. Приложения 461 Охватывающий Мы делаем это для каждого пикселя в новом изображении прямоугольник путем деформации: вычисляется путем применения гомографии к углам изо- >> [tile,t] = homwarp(inv(H), im2, 'full', 'extrapval', 0); бражения A = (1, 1), Как показано на рис. 7.48, деформированное синее изобраB = (W, 1), C = (W, H) и D = (1, H), где W жение выходит за границы исходного синего изображения, и H – ширина и высота соответственно, а параметр 'full' указывает, что возвращаемое изображение и нахождения представляет собой минимальный охватывающий прямоугольграниц в направ­ ник искаженного изображения. Это изображение называется лениях u и v. плиткой (tile) и показано черной пунктирной линией. Функция homwarp возвращает вектор t, который дает смещение системы координат плитки относительно исходного изображения. Как правило, не каждый пиксель плитки имеет соответствующую точку на входном изображении, и эти пиксели устанавливаются По умолчанию равными нулю, как указано в пятом аргументе . используется NaN. Теперь плитку нужно соединить с составным мозаичным изображением: >> composite = ipaste(composite, tile, t, 'add'); Результат показан на рис. 7.49. Мы можем ясно видеть несколько изображений, наложенных друг на друга с хорошим совпадением. Несопоставленные пиксели в деформированном изображении устанавливаются равными нулю, поэтому их добавление не приводит к изменению существующих значений пикселей в составном изображении. Простое добавление фрагмента в составное изображение означает, что перекрывающиеся пиксели обязательно будут ярче, и для исправления этого можно использовать ряд различных стратегий. Можно взять все ненулевые значения соответствующих пикселей плитки, которая накладывается на существующую мозаику. Можно также оставить без изменения имеющиеся пиксели мозаики и добавить значения только новых пикселей, вносимых плиткой. В качестве альтернативы можно установить значения пикселей составного изображения равными среднему значению пикселей плитки и составного изображения. Для этого нужно пометить пиксели плитки, которые не сопоставлены: >> [tile,t] = homwarp(inv(H), im2, 'full', 'extrapval', NaN); Которая игнорирует а затем смешать, используя опцию 'mean'<FootnoteStart:> : любые пиксели со значением NaN. >> composite = ipaste(composite, tile, t, 'mean'); Если изображения были сделаны с одинаковой экспозицией, края плитки не будут видны. Если экспозиции были разными, необходимо проанализировать два набора перекрывающихся пикселей, чтобы определить среднее смещение интенсивности и коэффициент масштабирования, которые можно использо- v (пиксели) 462 Глава 7 · Использование нескольких изображений u (пиксели) Рис. 7.49. Пример мозаики изображений. В нижней части кадра мы можем четко видеть три перекрывающихся вида взлетно-посадочной полосы аэропорта, что показывает хорошее совпадение между кадрами вать для коррекции плитки перед смешиванием, – это процесс согласования тона. Наконец, необходимо учитывать влияние точек на изображении, которые не находятся в плоскости земли, например на высоком здании. На снимке, сделанном в зените, будет видна только крыша здания, а на изображении, снятом с другого ракурса, будет вид под углом, показывающий здание сбоку. В мозаике мы стремимся создать иллюзию того, что камера находится точно над каждой точкой изображения, поэтому мы не должны видеть стороны какого-либо здания. Этот тип изображения называется ортофотоснимком или ортофотопланом, и в отличие от вида в перспективе, где лучи сходятся в фокусе камеры, для него все лучи параллельны, что подразумевает вид из бесконечно удаленной точки . Собирая составное изобра- Google Earth иногда жение, можно выбирать пиксели из любой подходящей плитки. предоставляет несовершенные Для наилучшего приближения к идеальному ортофотоснимку ортофотопланы. При мы должны выбрать пиксель, который до деформации был бли- взгляде на города мы можем видеть же всего к главной точке. наклонные виды В фотограмметрии этот тип мозаики называется неконтро- зданий. лируемой цифровой мозаикой, поскольку в ней не используются явные контрольные точки – вручную определяемые соответствующие элементы на изображениях. Полный код предоставлен файлом mosaic в каталоге примеров. Продемонстрированные здесь принципы также могут применяться в задаче стабилизации изображения. Гомография используется для со- Приложения 463 поставления объектов на новом изображении с местоположением, которое они имели на предыдущем изображении. 7.7.3 С опоставление и поиск изображений [examples/retrieval] Пусть дан набор изображений {Ij, j = 1 ⋯ N} и новое изображение I¢. Задача сопоставления изображений состоит в том, чтобы определить такое j, при котором I¢ и Ij наиболее похожи. В общем случае у изображений будут различаться экспозиция и ракурс камеры. Измерение сходства на уровне пикселей, реализованное в таких алгоритмах как SSD или ZNCC, которые мы использовали ранее, не подходит для этой задачи, поскольку даже небольшие изменения ракурса камеры приведут к почти нулевому сходству. В робототехнике сопоставление изображений помогает роботу определить, посещал ли он определенное место или видел прежде тот или иной объект. Если эти предыдущие изображения имеют некоторые связанные семантические данные, такие как имя объекта или название места, то, исходя из логического вывода, эти семантические данные применимы к новому изображению. Например, если новое изображение соответствует существующему изображению с семантическим тегом «вестибюль», это означает, что робот видит ту же сцену и, следовательно, находится в вестибюле или рядом с ним. Конкретный метод, который мы представим, обычно называют мешком слов (bag of words), и он успешно используется в ряде роботизированных приложений. Он основан на методах, с которыми мы сталкивались ранее, таких как точечные признаки SURF и кластеризация k-средних. Начнем с загрузки набора из 20 изображений >> images = iread('campus/*.jpg', 'mono'); в виде массива 426´640´20, и для каждого из них вычислим признаки SURF >> sf = isurf(images, 'thresh', 0); получив массив ячеек MATLAB, элементы которого являются векторами признаков SURF, соответствующими входным изображениям. Например, >> sf{1} ans = 1407 features (listing suppressed) Properties: theta scale u v strength descriptor image_id 464 Глава 7 · Использование нескольких изображений представляет собой вектор из 1407 объектов признаков SURF, соответствующих первому изображению в последовательности. Набор всех признаков SURF для всех изображений >> sf = [sf{:}] sf = 28644 features (listing suppressed) Properties: theta scale u v strength descriptor image_id представляет собой вектор из около 30 000 объектов признаков SURF. Рассмотрим конкретный признак SURF >> sf(259) ans = (207.101,300.162), theta=2.31733, scale=2.1409, ⮠ strength=0.00114015, image_id=1, descrip= .. и обнаружим свойства SurfPointFeature, обсуждавшиеся ранее, такие как центроид, масштаб и ориентация. Свойство image_id указывает, что этот признак был извлечен из первого изображения в исходной последовательности изображений. Мы можем отобразить это изображение и наложить на него признак >> idisp(images(:,:,1)) >> sf(259).plot('g+') >> sf(259).plot_scale('g', 'clock') как показано на рис. 7.50a. Опорная область этого признака >> sf(259).support(images) показана на рис. 7.50b. Опорная область охватывает кирпичи и край окна. Метод support использует свойство image_id, чтобы определить, какое из переданных изображений содержит признак. Основная идея мешка слов заключается в том, что многие из этих признаков будут описывать визуально похожие элементы сцены, такие как листья, углы окон, кирпичи, дымоходы и т. д. Если рассматривать каждый дескриптор признака SURF как Класс BagOfWords использует реали­ точку в 64-мерном пространстве, то похожие дескрипторы бу- зацию k-средних дут образовывать кластеры, а это типичная задача k-средних. в виде MEX-файла с http://www.vlfeat. Поиск 2000 кластеров признаков >> bag = BagOfWords(sf, 2000) возвращает объект BagOfWords, который содержит исходные признаки, центр каждого кластера и различную другую информацию . Такой кластер называется визуальным словом и описывается 64-элементным дескриптором SURF. Набор всех визуальных слов, в данном случае 2000, является визуальным org/. Здесь исполь­ зуется собственный генератор случай­ ных чисел; для его инициализации до известного состояния используйте функцию vl_twister ('STATE', 0.0);. а v (пиксели) v (пиксели) Приложения 465 b u (пиксели) u (пиксели) Рис. 7.50. a) Изображение 1 с визуальным словом SURF признака 380, обозначенным зеленым кругом, показывающим масштаб, и радиальной линией, показывающей направление ориентации; b) квадратная опорная область имеет ту же площадь, что и круг, а горизонтальная ось параллельна направлению ориентации словарем. Точно так же как документ состоит из набора слов, взятых из некоторого текстового словаря, каждое изображение содержит набор (или мешок) визуальных слов, взятых из визуального словаря. На этапе кластеризации каждому признаку SURF присваивается индекс визуального слова. В случае конкретного признака, показанного выше >> w = bag.words(259) w = 1962 алгоритм кластеризации k-средних присвоил этот признак изображения слову 1962 в словаре – это экземпляр визуального слова 1962. Это конкретное визуальное слово встречается в наборе изображений 29 раз >> bag.occurrence(w) ans = 29 и появляется хотя бы один раз в каждом из следующих изображений: >> bag.contains(w) ans = 1 5 7 8 9 11 12 15 16 18 Мы можем отобразить некоторые вхождения слова 1962 с по­ мощью функции >> bag.exemplars(w, images) 466 Глава 7 · Использование нескольких изображений как показано на рис. 7.51. Эти экземпляры на самом деле вы- Дескриптор глядят совершенно по-разному, но нам нужно помнить, что включает в себя отклики детекторов мы рассматриваем их как наборы пикселей, тогда как сходство вейвлетов Хаара, проявляется в дескрипторе . Однако экземпляры имеют неко- рассчитанные по торую доминирующую горизонтальную и вертикальную струк- нескольким окнам в пределах опорной туру. области. Рис. 7.51. Образцы Визуальные слова встречаются с совершенно разной час­ визуального слова 1962 из различных тотой: >> [word,f] = bag.wordfreq() ; где word – это вектор, содержащий все уникальные слова, а f – их соответствующие частоты. Мы можем отобразить их в порядке убывания частоты изображений, на которых оно встречается. Аннотация имеет форму слово/ изображение >> bar( sort(f, 'descend') ) как показано на рис. 7.52. Слова, которые встречаются очень часто, имеют меньшую значимость, т. е. способность различать Поисковые системы игнорируют такие изображения. Они аналогичны словам, которые называются слова, как «а», «и», стоп-словами при поиске текстовых документов . Визуальные «тот», «этот» и т. д. стоп-слова можно удалить из набора слов: >> bag.remove_stop(50) Removing 2863 features associated with 50 most frequent words >> bag bag = BagOfWords: 25781 features from 20 images 1950 words, 50 stop words и у нас останется около 26 000 признаков SURF. Этот метод выполняет перемаркировку, чтобы метки слов теперь находились в интервале от 1 до 1950. Наш визуальный словарь состоит из K визуальных слов, и в данном случае K = 1950. Применим технику поиска текстовых документов и опишем каждое изображение вектором частоты слов. Это K-мерный вектор υi = (t1, …tj … tK), элементы которого описывают частоту соответствующих визуальных слов в изображении Рис. 7.52. Гистограмма количества вхождений каждого слова (отсортировано). Обратите внимание, что есть небольшое количество слов, которые встречаются очень часто Количество вхождений Приложения 467 Метка визуального слова (7.19) где j – визуальная метка слова, N – общее количество изображений в базе данных, Nj – количество изображений, содержащих слово j, ni – количество слов в изображении i, а nji – количество раз, когда слово j появляется на изображении i. Термин «обратная частота документа» (inverse document frequency, idf) обозначает применение весовых коэффициентов, уменьшающих значимость слов, которые являются общими для всех изображений и, таким образом, меньше помогают различать изображения. Взвешенные векторы частоты слов являются свойством объекта BagOfWords и доступны с по­мощью команды >> M = bag.wordvector; Результат представляет собой матрицу 1950´20, а каждый Может показаться, что это очень столбец – вектор из 1950 элементов, который кратко описывает большой вектор, но он содержит менее соответствующее изображение . Сходство между двумя изображениями – это косинус угла 1 % от количества элементов исходно- между соответствующими векторами частоты слов го изображения. Вычисление сходства реализовано в методе similarity. Значение 1 указывает на максимальное сходство. Вычислить взаимное сходство для заданного набора изображений (мешка слов) просто: >> S = bag.similarity(bag) 468 Глава 7 · Использование нескольких изображений Метод возвращает матрицу подобия 20´20, где элементы S(i,j) указывают на сходство между i-м столбцом и j-м столбцом M или между изображением i и изображением j. Эта матрица симметрична и лучше всего интерпретируется визуально: >> idisp(S, 'bar') Сходство Индекс изображения как показано на рис. 7.53. Яркая диагональ служит полезной перекрестной проверкой, что изображение i идентично изображению j. Мы также видим некоторое ненулевое сходство между изображениями 12 и 18. Индекс изображения Рис. 7.53. Матрица подобия для 20 изображений, где светлые цвета указывают на сильное сходство. Элемент (i, j) указывает на сходство между изображением i и изображением j Рассмотрим изображение 11, показанное на рис. 7.54а. Его сходство с другими изображениями определяется строкой или столбцом 11 матрицы подобия >> s = S(:,11); которые мы сортируем в порядке убывания сходства >> [z,k] = sort(s, 'descend'); >> [z k] ans = 1.0000 11.0000 0.3722 13.0000 0.3394 9.0000 0.2610 12.0000 0.2038 5.0000 . . где каждая строка содержит меру сходства и соответствующее изображение. Изображение 11 идентично изображению 11, что вполне ожидаемо, и в порядке убывания сходства у нас есть v (пиксели) v (пиксели) Приложения 469 изображение 11 a изображение 13 b изображение 9 c v (пиксели) v (пиксели) v (пиксели) v (пиксели) изображение 12 v (пиксели) d v (пиксели) Рис. 7.54. Поиск изображения. Изображение 11 – это запрос, и в порядке убывания сходства найдены изображения 13, 9 и 12 изображения 13, 9, 12 и т. д. Они показаны на рис. 7.54, и мы видим, что алгоритм нашел совершенно разные виды одного и того же здания. Теперь допустим, что у нас есть несколько новых изображений, и мы хотим определить, какое из предыдущих изображений наиболее похоже. Возможно, робот сделал снимок и хочет сравнить его со своей базой данных существующих изображений. Шаги в целом аналогичны предыдущему случаю: >> images2 = iread('campus/holdout/*.jpg', 'mono'); >> sf2 = isurf(images2, 'thresh', 0) Но вместо того, чтобы выполнять кластеризацию, мы присвоим признаки существующему набору визуальных слов, т. е. определим ближайшее визуальное слово для каждого из новых дескрипторов признаков: >> bag2 = BagOfWords(sf2, bag) Для чего требуется BagOfWords: 6530 features from 5 images статистика изо1950 words, 50 stop words бражения-слова из существующего Эта операция также удаляет все слова-признаки, которые набора слов для вычисления весовых ранее были определены как стоп-слова, и вычисляет векторы коэффициентов idf. частоты слов в соответствии с уравнением (7.19). v (пиксели) v (пиксели) 470 Глава 7 · Использование нескольких изображений изображение 1 a похожее изображение 2 b изображение 2 c v (пиксели) v (пиксели) v (пиксели) v (пиксели) похожее изображение 11 d v (пиксели) v (пиксели) Рис. 7.55. Поиск сходства для новых изображений. Новые изображения a и c признаны соответствующими изображениям из базы данных b и d соответственно Выполняем поиск сходства между изображениями в двух наборах слов >> S2 = bag.similarity(bag2); который возвращает матрицу 20´5, где элементы S2(i,j) указывают на сходство между существующим изображением i и новым изображением j. Максимумы в каждом столбце соответствуют наиболее похожему изображению в предыдущем наборе: >> [z,k] = max(S2) z = 0.3435 0.6948 0.5427 k = 2 11 16 18 20 0.5521 0.3627 Новое изображение 1 лучше всего совпадает с изображением 2 в исходной последовательности, новое изображение 2 совпадает с изображением 11 и т. д. Два новых изображения и их ближайшие соответствия показаны на рис. 7.55. Первое совпадение имеет не очень высокий показатель сходства, но это разумный результат – между зданиями на этих изображениях действительно есть много общего. Приложения 471 7.7.4 Визуальная одометрия [examples/vodemo] Эта последователь- Распространенной задачей в робототехнике является оценка ность изображений расстояния, пройденного роботом, – одометрия. Это ключевой занимает большой источник данных для алгоритмов, которые оценивают местообъем и не распространяется с ос- положение робота в мире. Колесные роботы могут использовать новным набором информацию от колесных энкодеров, хотя они подвержены слуинструментов, но ее чайным ошибкам (проскальзывание), а также систематическим можно найти в zipфайле contrib2 на ошибкам (погрешность измерения радиуса колеса). Однако для веб-сайте Toolbox. летающего или подводного робота задача одометрии намного Эта последователь- сложнее. Визуальная одометрия (visual odometry, VO) – это проность представляет собой набор дан- цесс использования информации из последовательных изоных 4 из .enpeda., бражений для оценки относительного движения робота в протестовый сайт ана- странстве в промежутке времени между кадрами. лиза последовательЗагрузим последовательность изображений, снятых с автоности изображений (EISATS). мобиля, едущего по дороге : >> left = iread('bridge-l/*.png', 'roi', [20 750; 20 440]); Здесь опция 'roi' выбирает область внимания на каждом Черная рамка является резуль- изображении, чтобы устранить неровную черную рамку . Эти татом коррекции изображения. изображения необычны тем, что имеют 16-битные пиксели: >> about(left) left [uint16] : 421x731x251 (154.5 MB) а изображение im принадлежит классу 'uint16'. Так как эта последовательность изображений уже занимает почти 200 Мбайт, мы не преобразовываем значения ее пикселей в числа с двойной точностью, поскольку это увеличило бы в четыре раза объем требуемой памяти. Последовательность изображений может отображаться в виде анимации >> ianimate(left, 'fps', 10); со скоростью 10 кадров/с. Для каждого кадра мы вычисляем признаки углов: >> c = icorner(im, 'nfeat', 200, 'patch', 7); Для разнообразия здесь применяется алгоритм углов Харриса, так как он дешевле в вычислительном отношении. В данном случае изменение ориентации и масштаба от кадра к кадру невелико, и угловые признаки Харриса хорошо подходят для этой цели. Функция возвращает массив ячеек с одним элементом на входное изображение, и каждый элемент представляет собой вектор из 200 наиболее сильных угловых признаков Харриса на изображение. Последовательность изображений может отображаться как анимация с наложенными признаками 472 Глава 7 · Использование нескольких изображений >> ianimate(im, c, 'fps', 10); со скоростью 10 кадров/с. Один кадр из этой последовательности показан на рис. 7.56. Признаки связаны с областями с высоким градиентом, такими как края деревьев, а также углы знаков и автомобилей. Наблюдая за анимацией, мы видим, что угловые признаки надежно «прилипают» к мировым точкам на протяжении многих кадров. Движение признаков изображения называется оптическим потоком и является функцией движения камеры в мире и трехмерной структуры мира. кадр 15 Рис. 7.56. Кадр № 15 из последовательности изображений bridge-l с наложенными признаками (изображение из проекта .enpeda., Klette et al. 2011) Величина оптического потока – скорость мировой точки на плоскости изображения – пропорциональна скорости камеры, деленной на расстояние до мировой точки, и, следовательно, имеет неоднозначность масштаба – камера, быстро перемещающаяся по миру с удаленными точками, дает ту же величину потока, как и медленная камера, движущаяся мимо более близких точек. Чтобы решить эту проблему, нам нужно использовать дополнительную информацию. Например, если известно, что точки находятся на поверхности дороги, что дорога плоская, и высота камеры над дорогой тоже известна и неизменна, то мы можем устранить неоднозначность масштаба. Однако это предположение является довольно строгим и не применимо к объекту наподобие дрона, летящего над неизвестной местностью. Вместо этого мы будем использовать информацию из другого источника – правое изображение со стереокамеры, установленной на транспортном средстве: >> right = iread('bridge-r/*.png', 'roi', [20 750; 20 440]); Для каждой пары левого и правого изображений мы извлекаем признаки и определяем соответствие путем надежного Приложения 473 Рис. 7.57. Сопоставление признаков для визуальной одометрии. Верхний ряд – это стереопара на текущем временном шаге, а нижний ряд – стереопара на предыдущем временном шаге. Эпиполярно согласованные соответствия между тремя изображениями показаны желтым цветом v (пиксели) сопоставления признаков, используя сходство дескрипторов и эпиполярное ограничение, подразумеваемое фундаментальной матрицей. Затем мы вычисляем горизонтальное несоответствие между соответствующими функциями и, предполагая, что камеры полностью откалиброваны, триангулируем координаты плоскости изображения, чтобы определить мировые координаты ориентиров относительно левой камеры на транспортном средстве. Мы можем сопоставить 3D-облака точек на текущем и предыдущем временном шаге, используя такой метод, как итеративный поиск ближайших точек (ICP), чтобы определить изменение положения камеры. Это так называемый метод 3D-3D визуальной одометрии, и, хотя его принцип верен, на практике он работает плохо. Во-первых, некоторые из трехмерных точек могут находиться на других движущихся объектах, и это нарушает предположение ICP о том, что перемещается или сенсор, или объект, но не оба вместе. Во-вторых, оценка расстояния до удаленных точек весьма неточна, поскольку ошибки вычисления диспаратности становятся значительными, когда диспаратность мала. Альтернативный подход, сопоставление 3D-2D, заключается в проецировании 3D-точки на текущем временном шаге на предыдущее изображение и нахождении положения камеры, которое минимизирует ошибку относительно координат наблюдаемых объектов, – это пакетная подстройка. Обычно это делается только для одного изображения, и мы выберем левое изображение. Чтобы установить соответствие признаков с течением времени, мы находим соответствия между признаками левого изображения, которые совпадали с правым изображением, и совпадениями с признаками из предыдущего левого изображения, что снова устанавливает эпиполярное ограничение. Теперь мы знаем соответствие между точками в трех видах сцены, как показано на рис. 7.57. u (пиксели) 474 Глава 7 · Использование нескольких изображений На каждом временном шаге мы решаем задачу пакетной подстройки, в которой есть две камеры и ряд ориентиров, определяемых стереотриангуляцией. Первая камера связана с предыдущим временным шагом и зафиксирована в начале координат. Вторая камера связана с текущим временным шагом и должна иметь сдвиг в положительном направлении по оси z. Мы могли бы получить начальную оценку положения второй камеры, найдя и разложив существенную матрицу, но вместо этого мы установим ее в начало координат. Подробности можно найти в примере скрипта >> visodom Расположение камеры, м который обрабатывает 100 кадров и отображает графику, как на рис. 7.57, для каждого кадра. Окончательные результаты смещения по оси z показаны на рис. 7.58а, и мы наблюдаем значение около 0.5 м на каждом временном шаге, но также есть некоторые отсутствующие точки данных и два некорректно выглядящих результата. Процесс пакетной подстройки возвращает окончательную квадратичную ошибку, которая представлена на рис. 7.58b для каждого кадра. Для 8 % кадров эта ошибка превышала 20 пкс2 (красная пунктирная линия), и мы исключаем эти результаты. Вероятным источником ошибки являются неправильные сопоставления точек. Пакетная подстройка предполагает, что все точки мира фиксированы, но в этой последовательности присутствует множество движущихся объектов. Мы использовали эпиполярное ограничение между текущим и предыдущим кадрами, чтобы гарантировать, что в наборе Общая ошибка, пкс2 а b Временной шаг Рис. 7.58. Результаты визуальной одометрии: a) расчетное смещение камеры по оси z (вперед); b) окончательная ошибка пакетной подстройки на кадр, показанная в логарифмическом масштабе по вертикали Приложения 475 сторонников модели будут только точки признаков, соответствующие движущейся камере и фиксированному миру. Но, запустив скрипт, мы увидим довольно много точек на автомобиле впереди, которые ошибочно включены в набор сторонников модели, – этот автомобиль движется, но, поскольку он находится на большом и постоянном расстоянии, такие точки не создают достаточной ошибки, чтобы считаться аутсайдерами. Более сложный алгоритм пакетной подстройки обнаружит и отклонит такие точки. Наконец, в верхней части сцены преобладают точки, которые, как правило, достаточно удалены от камер. При более сложном подходе к обнаружению признаков они будут выбираться более равномерно по всему изображению. Ошибочные точки на временных шагах 29 и 71 подчеркивают общую проблему с использованием видеоданных для роботов. Подсказка заключается в том, что эти значения подозрительно ровно в два раза отличаются от других значений. Каждому изображению в последовательности была назначена метка времени, когда оно было получено компьютером, и эти метки времени можно загрузить: >> ts = load('timestamps.dat'); Если построить на графике разницу между временными метками >> plot(diff(ts)) мы увидим, что среднее время между изображениями составляет 44.6 мс, но есть два всплеска, где интервал вдвое больше. Компьютер, регистрирующий изображения, пропустил кадр, возможно, он не смог записать данные изображения в память или на диск так же быстро, как они поступили. Таким образом, интервал между кадрами был в два раза больше, транспортное средство проехало в два раза больше, и всплески нашего расчетного смещения фактически верны. Это нередкая ситуация – в роботизированной системе все данные должны иметь временные метки, которые следует проверять для обнаружения подобных проблем. Медианная скорость по действительным оценкам равна >> median(tz(ebundle<20)) ans = 0.5201 в метрах, что при интервале между кадрами камеры 44.6 мс указывает на скорость автомобиля около 40 км/ч. Переменная tz – это вектор смещения от кадра к кадру, вычисляемый скриптом, а ebundle – вектор ошибок настройки связки на каждом временном шаге. Остатки от оценки фундаментальной матрицы 476 Глава 7 · Использование нескольких изображений между текущим и предыдущим левым изображением сохраняются в векторе efund. Предполагаемые перемещения транспортного средства или робота с течением времени не являются независимыми и связаны кинодинамической моделью транспортного средства, которую можно использовать для сглаживания результатов и дисконтирования ошибочных оценок скорости. Если алгоритм пакетной подстройки предусматривает ограничения на положение камеры, можно назначить весовые коэффициенты, чтобы наказывать невозможное движение в боковом и вертикальном направлениях, а также движение по крену и тангажу. 7.8 Подведение итогов В этой главе было рассмотрено множество тем, но цель состояла в том, чтобы продемонстрировать множество концепций, которые можно использовать в реальных роботизированных системах машинного зрения. В этой главе прослеживаются две сквозные нити повествования. Первая посвящена использованию угловых объектов для поиска отличительных точек на изображениях и сопоставления их с той же точкой мира на другом изображении. Вторая связана с проблемой потери масштаба в процессе перспективной проекции и методами, основанными на дополнительных источниках информации для восстановления масштаба, таких как стереозрение, структурированный свет и пакетная подстройка. Мы расширили геометрию изображения с одной камеры на случай двух камер и показали, как взаимосоответствующие точки на двух изображениях ограничиваются фундаментальной матрицей. Было показано, как можно найти фундаментальную матрицу по данным изображения, отмечен эффект неправильной ассоциации данных и рассказано, как его преодолеть с по­ мощью алгоритма RANSAC. Используя внутренние параметры камеры, можно вычислить существенную матрицу, а затем разложить ее, чтобы получить движение камеры между двумя видами, но в преобразовании есть неизвестный масштабный коэффициент. Имея некоторую дополнительную информацию, например величину смещения, можно полностью рассчитать движение камеры. Зная движение камеры, можно найти трехмерные координаты мировых точек. В особом случае, когда мировые точки лежат на плоскости, они индуцируют гомографию, которая представляет собой ли- Подведение итогов 477 нейное отображение точек между изображениями. Гомографию можно использовать для обнаружения точек, не лежащих в плоскости, и ее можно разложить, чтобы получить движение камеры между двумя ракурсами (преобразование снова имеет неизвестный масштабный коэффициент) и нормалью к плоскости. Если фундаментальная матрица известна, то пара перекрывающихся изображений может быть доработана для создания эпиполярно выровненной стереопары, а плотное стереосопоставление можно использовать для восстановления мировых координат каждой точки. В главе обсуждались ошибки из-за таких эффектов, как окклюзия и отсутствие текстуры, а также методы обнаружения этих ситуаций. Мы использовали пакетную подстройку для решения задачи оценки структуры сцены и движения, используя 2D-измерения из набора изображений сцены для восстановления информации, связанной с 3D-геометрией сцены, а также с расположением камер. Стереозрение – это простой случай, когда известно движение – оно фиксируется базисной линией стереосистемы, – и нас интересует только структура. В задаче визуальной одометрии нам важно только движение камеры, а не структура сцены. Рассмотренные многоракурсные методы затем использовались в ряде примеров приложений, таких как коррекция перспективы, создание мозаики, поиск изображений и визуальная одометрия. Примечания к MATLAB и Toolbox В Toolbox используется открытый исходный код для работы с признаками SIFT (VLFeat) и SURF (OpenSURF http://www.mathworks.com/matlabcentral/fileexchange/28300). VLFeat (http:// www.vlfeat.org) содержит ряд детекторов признаков и других полезных функций. Библиотека OpenCV реализует множество детекторов признаков и дескрипторов, и к ней можно получить доступ в MATLAB с по­мощью mexopencv (https://kyamagu. github.io/mexopencv). MATLAB Computer Vision System Toolbox™ (CVST) поддерживает преобразование стереобазы; стереосопоставление; детекторы SURF, FAST и Harris; ряд дескрипторов (BRISK, HOG, MSER) и обработку облака точек, включая kd-деревья, подгонку модели и визуализацию. Многие функции CVST могут использоваться внутри Simulink и поддерживают автоматическую генерацию кода для оборудования реального времени, такого как FPGA. 478 Глава 7 · Использование нескольких изображений Дополнительное чтение Трехмерная реконструкция и оценка положения камеры изучались сообществом фотограмметрии с середины XIX в. Трехмерное компьютерное зрение или зрение роботов изучалось сообществами компьютерного зрения и искусственного интеллекта с 1960-х гг. Эта книга придерживается языка и обозначений, принятых в литературе по компьютерному зрению, но чтение фотограмметрической литературы вызовет лишь небольшие дополнительные трудности. Сходство стереокамеры с двумя глазами очень велико, но, хотя мы постоянно пользуемся стереозрением, это не единственный метод, который мы используем для определения расстояния (Cutting, 1997). Масштабные исследования по многоракурсной геометрии проводились в таких лабораториях, как Стэнфорд, SRI International, лаборатория искусственного интеллекта Массачусетского технологического института, CMU, JPL, INRIA, Оксфорд и ETL Japan в 1980-х и 1990-х гг., что привело к публикации ряда учебников в начале 2000-х. Общепризнанными окончательными работами по геометрии с несколькими представлениями принято считать книги Хартли и Зиссермана (Hartley and Zisserman, 2003) и Ма с соавт. (Ma et al., 2003). В этих книгах представлены совершенно разные подходы к одному и тому же материалу. Первая основана на более геометрическом подходе, а вторая – на более математическом. К сожалению, они используют совершенно разные обозначения, и каждое из них отличается от обозначений, используемых в этой книге, – сводка наиболее важных обозначений приведена в табл. 7.1. Все эти книги охватывают следующие темы: извлечение признаков (с использованием угловых признаков Харриса, поскольку они были опубликованы до того, как были разработаны детекторы инвариантных к масштабу признаков, такие как SIFT и SURF); геометрия одного, двух и N видов; фундаментальные и существенные матрицы; гомографии; восстановление трехмерной структуры сцены и движения камеры с по­мощью методов пакетной подгонки в автономном режиме. Обе они предоставляют ключевые алгоритмы в псевдокоде и сопровождаются вспомогательным кодом MATLAB на соответствующих веб-сайтах. Более ранняя книга Фогераса и соавт. (Faugeras et al., 2001) охва­тывает большую часть того же материала, используя математический подход и снова с другими обозначениями. В предыдущей книге Фогераса (Faugeras, 1993) основное внимание уделяется разреженным стереоскопическим изображениям из линейных объектов. В относительно новой книге Шелиски (Szeliski, 2010) представлено очень доступное и более глубокое обсуждение тем этой главы. Подведение итогов 479 Таблица 7.1. Краткое изложение различий в обозначениях между двумя другими популярными учебниками и этой книгой Объект Хартли и Зиссерман, 2003 Мировая точка X Точка изображения x, x i-я точка изображения xi, xj Движение камеры R, t Нормализованные координаты x, x Матрица камеры P Гомогенные количества x, X Гомогенная эквивалентность x = PX Ма и соавт., 2003 Эта книга P x1, x2 x1, x2 R, T x1, x2 П x, P λx = ПP x ~ ПP P 1 2 p, p 1 pi, 2pi R, t (u–, –v ) C p̃, P̃ p̃ ≃ CP̃ Ссылки, связанные с SURF и другими детекторами признаков, ранее обсуждались в конце главы 5. Производительность детекторов признаков и их эффективность согласования опиДжет – это вектор производных более саны Миколайчиком и Шмидом (Mikolajczyk and Schmid, 2005), высокого порядка, где рассматривается ряд различных дескрипторов признаков, таких как Iuu¢, Ivv¢, Iuv¢, включая изображения вращения и локальные джеты (jet) . Iuuu¢, Iuuv¢, Iuvv¢, Ivvv¢, Iuuuu¢, Аранджелович и Зиссерман (Arandjelovic and Zisserman, 2012) Iuuuv¢, Iuuvv, Iuvvv¢, Ivvvv¢ и т. д. (Mikolajczyk обсуждают некоторые важные моменты при сопоставлении and Schmid, 2005). векторов признаков. Алгоритм RANSAC, описанный Фишлером и Боллесом (Fischler and Bolles, 1981), является самой надежной рабочей лошадкой среди всех методов, основанных на признаках, обсуждаемых в этой главе, но не работает с очень малыми коэффициентами выбросов. Более надежной современной разработкой является консенсус векторного поля (vector field consensus, VFC) (Ma et al., 2014). Пилу (Pilu, 1997) обсуждает, как SVD можно применить к матрице, сформированной из расстояний между признаками, для определения соответствия. Деллаерт и соавт. (Dellaert et al., 2000) описывают вероятностный подход к определению структуры сцены из группы изображений, не обязательно расположенных по порядку. Термин «фундаментальная матрица» был предложен в диссертации Луонга (Luong, 1992). Книга Сюй и Чжана (Xu and Zhang, 1996) представляет собой доступное введение в эпиполярную геометрию. Эпиполярная геометрия также может быть сформулирована для неперспективных камер, и в этом случае эпиполярная линия становится эпиполярной кривой (Mičušík and Pajdla 2003; Svoboda and Pajdla, 2002). Для трех изображений геометрия описывается трифокальным тензором �, который представляет собой тензор 3´3´3 с 18 степенями свободы, связывающий точку на одном изображении с эпиполярными линиями на двух других изображениях (Hartley and Zisserman 2003; Ma et al. 2003). Важная ранняя статья по эпиполярной гео- 480 Глава 7 · Использование нескольких изображений метрии для последовательности изображений написана Боллесом и соавт. (Bolles et al., 1987). Существенная матрица была впервые описана десятилетием ранее в письме в журнал Nature (Longuet-Higgins, 1981) выдающимся химиком-теоретиком и ученым-когнитивистом Кристофером Лонге-Хиггинсом (1923–2004). В статье описан метод оценки существенной матрицы по восьми соответствующим парам точек. Разложение основной матрицы было впервые описано Фогерасом (Faugeras, 1993, § 7.3.1), но также фигурирует в статьях Хартли и Зиссермана (Hartley and Zisserman, 2003) и Ма и соавт. (Ma et al., 2003). В этой главе мы нашли движение камеры, сначала вычислив существенную матрицу, а затем разложив ее. На первом этапе требуется как минимум восемь пар сопряженных точек, но алгоритмы таких авторов, как Нистер (Nistér, 2003), Ли и Хартли (Li and Hartley, 2006), вычисляют движение непосредственно по пяти парам точек. Разложение гомографии описано Фогерасом и Лустманом (Faugeras и Lustman, 1988), Хартли и Зиссерманом (Hartley и Zisserman, 2003), Ма и соавт. (Ma et al., 2003 г.) и в обширной аналитической работе Малиса и Варгаса (Malis and Vargas, 2007 г.). Отношения между этими матрицами, движением камеры и соответствующими функциями Toolbox представлены на рис. 7.59. связанные точки фундаментальная матрица гомография существенная матрица относительное положение Рис. 7.59. Функции Toolbox и методы объекта камеры, а также их взаимосвязь Стереокамеры и программное обеспечение для стереосопоставления доступны сегодня от многих поставщиков и могут генерировать карты глубины с высоким разрешением при час­ тоте более 10 Гц на стандартных компьютерах. Десять лет назад это было сложно, и для работы в режиме реального времени требовалось специализированное оборудование на основе FPGA (Corke et al., 1999; Woodfill and Von Herzen, 1997). Приме- Подведение итогов 481 нение стереозрения для навигации планетохода обсуждается Маттисом (Matthies, 1992). Можно использовать более двух камер: многокамерная стереосистема была предложена Окутоми и Канаде (Okutomi and Kanade, 1993). Она обеспечивает устойчивость к таким проблемам, как эффект частокола. Браун и соавт. (2003) предложили обзор методов стереозрения с акцентом на проблемы реального времени. Старая, но хорошо написанная книга о принципах стереозрения принадлежит Шираи (Shirai, 1987). Шарстейн и Шелиски (Scharstein и Szeliski, 2002) рассматривают стереопроцесс как четыре этапа: сопоставление, агрегирование, вычисление диспаратности и уточнение. Сравниваются стоимость и производительность различных алгоритмов для каждого шага. Пример в этой главе мог бы быть описан так: сопоставление NCC, агрегация блочных фильтров, метод «победитель получает все» и уточнение на субпиксельном уровне. Алгоритм плотного стереосопоставления, представленный в разделе 7.3.2 – это очень традиционный стереоалгоритм, основанный на корреляции. Диспаратность, вычисляемая для каждого пикселя, не зависит от других пикселей, но в большинстве реальных сцен соседние пиксели принадлежат одной и той же поверхности, и диспаратность будет очень похожей – это называется ограничением сглаживания (smoothness constraint). Конечно, диспаратность будет прерывистой на краях поверхностей. Нахождение кратчайшего оптимального пути через срез изображения пространства несоответствий, как показано на рис. 7.29, обеспечит соблюдение ограничения гладкости в горизонтальном направлении. В идеале нам также нужно обеспечить вертикальную гладкость, и этого можно достичь с по­мощью марковских случайных полей (Markov random field, MRF), полной вариации с регуляризаторами (Pock, 2008) или более эффективных алгоритмов полуглобального сопоставления (semi-global matching, SGM) (Hirschmüller 2008). Очень популярная библиотека для эффективного крупномасштабного стереосопоставления (LIBELAS) от Гейгера и соавт. (Geiger et al., 2010) использует альтернативу глобальной оптимизации, которая обеспечивает быстрые и точные результаты для различных внутренних и наружных сцен. Стереозрение обычно нуждается в значительном объеме вычислений, но есть хорошие возможности распараллеливания с использованием нескольких ядер, наборов инструкций MIMD, графических процессоров, специализированных микросхем и FPGA. Использование непараметрических локальных преобразований описано в статьях Забиха и Вудфилла (Zabih and Woodfill, 1994) и Бэнкса и Корке (Banks and Corke, 2001). Новой альтернативой стереозрению являются камеры, основанные на измерении времени пролета светового луча, стоимость которых быстро снижается. Импульс инфракрасного 482 Глава 7 · Использование нескольких изображений света освещает сцену, и каждый пиксель регистрирует интен- На самом деле это сивность и временную задержку отраженной энергии. К вре- хуже, чем структурированный свет. мяпролетным сенсорам относятся REAL3 от Infineon (infineon. Энергия освещеcom) и фотонные ИС от Pmdtechnologies (pmdtec.com). Этот тип ния ограничена камеры хорошо работает в помещении и даже в полной темно- соображениями безопасности для те, но на открытом воздухе при ярком солнечном свете макси- глаз, и структумальный диапазон измерения дальности ограничен, как и при рированный свет концентрирует эту структурированном свете . энергию по линии, Алгоритм ICP (Besl and McKay, 1992) используется для широ- тогда как времякого спектра приложений от робототехники до медицинской пролетные камеры распределяют ее по визуализации. ICP работает быстро, но определение соответ- площади. ствий через ближайших соседей – вычислительно дорогостоящая операция O(N 2). Было разработано множество вариантов алгоритма, которые делают подход устойчивым к выбросам данных и повышают скорость вычислений для больших наборов данных. Сальви и др. (Salvi et al., 2007) опубликовали обзор и сравнение некоторых алгоритмов. Определение относительной ориентации между двумя наборами точек является классической задачей, и используемый здесь подход SVD описан Аруном и соавт. (Arun et al., 1987). Решения, основанные на кватернионах и ортонормированных матрицах вращения, были описаны Хорном (Horn et al., 1988; Horn, 1987). Задача «структура через движение» (structure from motion, SfM) – одновременное восстановление структуры мира и движения камеры – является классической задачей компьютерного зрения. Две полезные обзорные статьи, в которых приводится систематика подходов, принадлежат Хуангу и Нетравали (Huang and Netravali, 1994) и Джебаре с соавт. (Jebara et al., 1999). Бройда и соавт. (Broida et al., 1990) описывают один из первых вариантов рекурсивного метода SfM для последовательности монокулярных камер с использованием EKF, где каждая мировая точка представлена ее координатой (X, Y, Z). Маклокклэн предоставляет подробное описание оценщика состояния переменной длины для SfM (McLauchlan 1999). Азарбаеджани и Пентланд (Azarbayejani and Pentland, 1995) описывают рекурсивный подход, в котором каждая мировая точка параметризуется скаляром – ее глубиной по отношению к первому изображению. Более новый вариант алгоритма с уменьшенной ошибкой вычисления описан Кьюзо и соавт. (Chiuso et al., 2002). Они также обсуждают проблему изменения масштаба. Система MonoSlam, предложенная Дэвисоном и соавт. (Davison et al., 2007), представляет собой впечатляющую монокулярную систему SfM, которая поддерживает локальную карту, включающую объекты, даже если они в данный момент не находятся в поле зрения. Более современное дополнение Ньюкомба и соавт. (Newcombe et al., 2011) выполняет отслеживание камеры и плотную трех- Подведение итогов 483 мерную реконструкцию с одной движущейся RGB-камеры. Применение SfM для крупномасштабного картографирования городов становится все более популярным, и Поллефейс с соавт. (Pollefeys et al., 2008) описывают систему для автономной обработки больших наборов изображений. Пакетная подстройка или структура через движение (SfM) – это обширная область с многочисленными публикациями, охва­тывающими различные варианты задачи, например устойчивость к выбросам, а также конкретные приложения и типы камер. Классические введения опубликовали Триггс и соавт. (Triggs et al., 2000) и Хартли и Зиссерман (Hartley and Zisserman, 2003). Недавние диссертации Уоррена (Warren, 2015 г.), Зундерхауфа (Sünderhauf, 2012 г.) и Страсдата (Strasdat, 2012 г.) являются исчерпывающими и вполне удобочитаемыми. К сожалению, в каждой работе используются разные обозначения. Оценка матрицы камеры для каждого вида, вычисление проективной реконструкции и последующее обновление ее до евклидовой реконструкции описано Хартли и Зиссерманом (Hartley and Zisserman, 2003) и Ма с соавт. (Ma et al., 2003). Задача SFM может быть упрощена путем использования последовательностей стереоскопических, а не монокулярных изображений (Molton and Brady 2000; Zhang et al. 1992) или путем добавления инерциальных данных (Strelow and Singh 2004). Популярное введение в визуальную одометрию (VO) состоит из двух частей: (Scaramuzza and Fraundorfer, 2011) и (Fraundorfer and Scaramuzza, 2012). Визуальная одометрия обсуждается также в статье Нистера и соавт. (Nister et al., 2006) с использованием точечных признаков и монокулярного или стереоскопического зрения. Маймоне и соавт. (Maimone et al. 2007) описывают опыт использования стереокамеры VO на марсоходе, а Корке и соавт. (Corke et al., 2004) описывают монокулярный катадиоптрический VO для прототипа планетохода. Мозаика – процесс такой же старый, как фотография. В прошлом это было высококвалифицированным и трудоемким делом, требующим применения фотоснимков, скальпелей и наждачной бумаги. Поверхность Луны и близлежащих планет была выложена мозаикой вручную в 1960-х гг. с использованием изображений, отправленных автоматическими космическими аппаратами. Для создания панорам применяются высококачественные автономные инструменты создания мозаики, например проект с открытым исходным кодом Hugin (http://hugin.sourceforge.net) и проприетарное приложение AutoStitch. Техника «мешка слов» для поиска изображений была впервые предложена Сивиком и Зиссерманом (Sivic and Zisserman, 2003) и с тех пор использовалась многими другими исследователями. 484 Глава 7 · Использование нескольких изображений Заметным усовершенствованием для роботизированных приложений является алгоритм FABMAP (Cummins and Newman, 2008), который учитывает совместную вероятность появления признаков и связывает вероятность с совпадением изображения. Он входит в состав библиотеки OpenCV. Версия с открытым исходным кодом (Glover et al., 2012) доступна по адресу https:// github.com/arrenglover/openfabmap. Чатфилд и соавт. (Chatfi eld et al., 2011) обсудили некоторые усовершенствования в задаче поиска изображений по набору слов. Анализ последовательности изображений лежит в основе многих роботизированных систем машинного зрения, работающих в реальном времени. Отслеживание признаков в реальном времени от кадра к кадру описано Хагером и Тоямой (Hager and Toyama, 1998), Лукасом и Канаде (Lucas and Kanade, 1981) и обычно основано на более дешевых в вычислительном отношении детекторах Харриса или пирамидальном трекере Канаде–Лукаса–Томаси (KLT). Детекторы SURF по-прежнему работают слишком медленно, хотя некоторые реализации на основе C и GPU способны работать в режиме реального времени. Дополнительные ресурсы Область компьютерного зрения развивалась благодаря доступности стандартных наборов данных. Это позволило исследователям количественно сравнить производительность различных алгоритмов на одних и тех же данных. Одним из первых наборов пар стереоизображений был набор данных JISCT (Bolles et al., 1993). Более поздний набор данных Middlebury (Scharstein and Szeliski, 2002), доступный на http://vision.middlebury.edu/ stereo, содержит обширную коллекцию стереоизображений с высоким разрешением, снятых при различных настройках экспозиции и включающих эталонные данные. Стереоизображения с различных марсоходов НАСА доступны в интернете в виде пар «левый+правый» или в виде анаглифов. Наборы данных о движении включают в себя классические последовательности движений внутри помещений, http://vasc.ri.cmu.edu//idb/ html/motion; людей, движущихся внутри здания, http://homepages.inf.ed.ac.uk/rbf/CAVIARDATA1; сцены дорожного движения, http://i21www.ira.uka.de/image_sequences, и кадры, снятые из движущегося транспортного средства: http://www.mi.auckland. ac.nz/EISATS. Популярная библиотека LIBELAS (http://www.cvlibs.net/software/libelas) для крупномасштабного стереосопоставления поддерживает параллельную обработку с использованием OpenMP Подведение итогов 485 и имеет интерфейсы MATLAB и ROS. Различные алгоритмы стереозрения сравниваются по скорости и точности на тестовых сайтах KITTI (www.cvlibs.net/datasets/kitti/eval_scene_flow.php) и Middlebury (vision.middlebury.edu/stereo/eval3). Реализация трекера признаков KLT на C, написанная Стэном Бирчфилдом, доступна по адресу http://www.ces.clemson. edu/~stb/klt. Версия KLT на основе графического процессора на C доступна по адресу http://cs.unc.edu/~ssinha/Research/GPU_ KLT. Кроссплатформенная библиотека ViSP реализует возможности отслеживания и доступна по адресу https://visp.inria.fr. Ссылки на реализации SIFT и SURF даны в конце главы 5. Набор инструментов эпиполярной геометрии Джана Луки Мариоттини и Доменико Праттичиццо (Marriottini and Prattichizzo 2005) для MATLAB доступен по адресу http://egt.dii.unisi.it. Он поддерживает перспективную и катадиоптрическую камеры. Монокулярная визуальная система SLAM Эндрю Дэвисона (MonoSLAM) для C и MATLAB доступна по адресу http://www.doc.ic.ac. uk/~ajd/software.html. Программное обеспечение для разреженной пакетной подгонки, разработанное Луракисом (www.users.ics.forth.gr/ ~lourakis/sba), представляет собой эффективную реализацию на языке C, которая широко используется и имеет оболочку MATLAB и OpenCV. Одним из приложений является Bundler (www. cs.cornell.edu/~snavely/bundler) – приложение, которое может выполнять сопоставление точек с тысяч камер в масштабе города и позволило реконструировать такие города, как Рим (Agarwal et al. 2014), Венеция и Дубровник. Некоторые из этих крупномасштабных наборов данных доступны на сайтах www.grail. cs.washington.edu/projects/bal и www.robots.ox.ac.uk/~vgg/data/ data-mview.html. Интерфейс MATLAB для Bundler доступен по адресу www.mathworks.com/matlabcentral/fileexchange/46341. Система извлечения структуры через движение SFMedu, разработанная для учебных целей (http://vision.princeton.edu/courses/SFMedu), содержит учебные ресурсы и исходный код MATLAB. В число решателей с открытым исходным кодом, которые можно использовать для настройки разреженных пакетов, входят g2o, SSBA и CERES, все они реализованы на C++. Решатель g2o от Кюммерле и соавт. (Kümmerle et al., 2011) (github.com/ RainerKuemmerle/g2o) также можно использовать для решения задач SLAM. Решатель SSBA Кристофера Зака доступен по адресу https://github.com/chzach/SSBA. Решатель CERES от Google (www.ceres-solver.org) представляет собой библиотеку для моделирования и решения больших сложных задач оптимизации на стационарных и мобильных платформах, а также поддерживает параллельную обработку с использованием OpenMP. Интерфейс MATLAB доступен по адресу www.github.com/tikroeger/ BA_Matlab. 486 Глава 7 · Использование нескольких изображений Библиотека Pointcloud (PCL) (www.pointclouds.org) – это крупномасштабный, открытый и автономный пакет для обработки 2D/3D-изображений и облаков точек с поддержкой детекторов и дескрипторов признаков, 3D-регистрации, kd-деревьев, сегментации формы, построения сетки поверхности, визуализации, интерфейсов камеры, а также включает g2o. Библиотека абстракции данных точек (PDAL) (www.pdal.io) – это библиотека и набор инструментов командной строки Unix для управления данными облака точек. Облака точек можно хранить в нескольких распространенных открытых форматах. Файлы данных облака точек (PCD) определяются библиотекой Pointcloud (PCL) (www.pointclouds. org) и могут быть импортированы в MATLAB с по­мощью www. mathworks.com/matlabcentral/fileexchange/40382. Файлы в полигональном формате (PLY) предназначены для описания сеток, но могут использоваться для представления облака точек без сетки. Для просмотра этих файлов разработано несколько замечательных визуализаторов, таких как MeshLab и potree. PCL и PDAL могут читать, записывать и преобразовывать многие форматы файлов облаков точек. Исчерпывающую информацию о фундаментальных матрицах можно найти на http://danielwedge.com/fmatrix/. Упражнения 1. Угловые признаки и сопоставление (раздел 7.1). Изучите кумулятивное распределение силы углов для признаков Харриса и SURF. Как правильно выбрать сильные углы для сопоставления признаков? 2. Сопоставление признаков. Мы можем определить качество сопоставления признаков на основе дескрипторов с точки зрения процента сторонников после применения RANSAC. a. Возьмите любое изображение. Сопоставьте это изображение с различными преобразованиями самого себя, чтобы изучить надежность признаков SURF и Харриса. Преобразования такие: (а) масштабировать интенсивность на 70 %; (b) добавить гауссов шум со стандартным отклонением 0.05, 0.5 и 2 по значениям серого; (c) масштабировать изображение на 0.9, 0.8, 0.7, 0.6 и 0.5; (d) повернуть на 5°, 10°, 15°, 20°, 30°, 40°. b. Для детектора Харриса сравните производительность признака на основе структурного тензора и размеров патча дескриптора 3´3, 7´7, 11´11 и 15´15. Подведение итогов 487 c. Попробуйте увеличить радиус подавления для углов SURF и Харриса. Улучшает ли более низкая плотность совпадений производительность сопоставления? d. Детектор Харриса может обрабатывать цветное изображение. Приводит ли это к повышению производительности по сравнению с версией того же изображения в оттенках серого? e. Существует ли какая-либо корреляция между случайными совпадениями и силой вовлеченных угловых признаков? 3. Напишите уравнение для эпиполярной линии на втором изображении при заданной точке на первом изображении. 4. Покажите, что эпиполи – это нуль-пространство фундаментальной матрицы. 5. Можете ли вы определить матрицу C для второй камеры, зная фундаментальную матрицу и матрицу первой ка­меры? 6. Нахождение фундаментальной матрицы (раздел 7.2.3). a. В примере с синтетическими данными измените количество точек и аддитивный гауссов шум и исследуйте влияние на невязку. b. Используя данные об Эйфелевой башне, наблюдайте за эффектом изменения параметра на RANSAC. Повторите это с функциями SURF, рассчитанными с более низким порогом силы (по умолчанию 0.002). c. Какова вероятность того, что в случайной выборке (без замещения) из N сторонников и M противников выпадут 8 точек-сторонников модели? 7. Эпиполярная геометрия. a. Создайте две центральные камеры, одну в начале координат, а другую в направлении x. Для разреженной фронто-параллельной сетки точек мира отобразите семейство эпиполярных линий на втором изображении, которые соответствуют спроецированным точкам на первом изображении. Опишите эти эпиполярные линии. Повторите задание для случая, когда вторая камера перемещается по оси y и z и вращается вокруг осей x, y и z. Повторите задание для комбинаций движения, таких как перемещение по оси x и z или перемещение по оси x и вращение по оси y. b. В примере на рис. 7.16 эпиполярные линии слегка наклонены вверх. Что это говорит о двух ракурсах камеры? 8. Существенная матрица (раздел 7.2.2). a. Создайте набор сопоставленных точек для камеры, совершающей чисто вращательное движение, и вычислите фундаментальную и существенную матрицу. Можете ли вы восстановить вращательное движение? 488 Глава 7 · Использование нескольких изображений b. Для случая поступательного и вращательного движения визуализируйте оба положения, полученные в результате разложения основной матрицы. Нарисуйте их вручную или используйте trplot. 9. Гомография (раздел 7.2.4). a. Вычислите евклидовы гомографии для переноса в направлениях x, y и z и для вращения вокруг осей x, y и z. Преобразуйте их в проективные гомографии и примените к фронто-параллельной сетке точек. Является ли результирующее движение изображения тем, что вы ожидали? Примените эти гомографии в качестве деформации к реальному изображению, такому как фотография Лены из примера в этой книге. b. Разложите гомографию рис. 7.15 (изображение двора), чтобы определить плоскость стены по отношению к камере. Вам понадобятся внутренние параметры камеры. 10. Загрузите эталонное изображение обложки этой книги из файла rvc2_cover.png. Затем сделайте снимок передней обложки книги, вычислите признаки SIFT или SURF, сопоставьте их и используйте RANSAC для оценки гомографии между двумя изображениями обложки книги. Разложите гомографию, чтобы оценить вращение и перемещение. Поместите эти действия в цикл в реальном времени и постоянно отображайте положение книги относительно камеры. 11. Разреженное стереосопоставление (раздел 7.3.1). a. Метод пересечения лучей может возвращать наименьшее расстояние между лучами (которое в идеале равно нулю). Постройте гистограмму ошибки закрытия и вычислите среднюю и максимальную ошибку. b. Предполагаемая величина перемещения камеры составляла 30 см. Повторите расчеты для 25 и 35 см. Изменились ли статистические показатели ошибок закрытия? Можете ли вы определить, какая величина перемещения минимизирует эту ошибку? 12. Пакетная подстройка (раздел 7.4). a. Измените начальное условие для второй камеры, например установите для нее единичную матрицу. b. Установите начальное перемещение камеры на 3 м в направлении x и масштабируйте координаты ориентира в 10 раз. Каково конечное значение ошибки обратной проекции и положения второй камеры? c. Поэкспериментируйте с привязкой ориентиров и камер. d. Выведите два якобиана – A и B. 13. Выведите соотношение для глубины с точки зрения диспаратности для случая граничных камер, т. е. камер с пере- Подведение итогов 489 секающимися оптическими осями, аналогичных камерам, показанным на рис. 7.6. 14. Стереозрение (на примере кучи камней, раздел 7.3.2). a. Используйте idisp, чтобы увеличить изображение диспаратности и изучить значения пикселей на границах изображения и по краям камней. b. Поэкспериментируйте с различными мерами подобия и размерами окна. Какое влияние они оказывают на изображение диспаратности и время вычислений? c. Поэкспериментируйте с изменением диапазона диспаратности. Попробуйте [50,90], [30,90], [40,80] и [40,100]. Что происходит с изображением диспаратности и по­ чему? 15. На примере кучи камней (раздел 7.3.2) получите пространственное изображение диспаратности D. a. Для выбранных пикселей (u, v) постройте график зависимости D(u, v, d) от d. Ищите пиксели с острым, широким и слабым пиком. Повторите для стереоизображения с использованием подобия ZSSD. Для выбранной строки v отобразите D(u, v, d) в виде изображения. Что оно представляет? b. Для конкретного пиксельного графика зависимости s от d постройте параболу вокруг максимумов и наложите ее на график. c. Используйте необработанные данные из DSI, найдите второй пик в каждом пикселе и вычислите коэффициент неоднозначности. d. Отобразите эпиполярные линии на втором изображении для выбранных точек на первом изображении. 16. Загрузите анаглифное изображение и преобразуйте его в пару изображений в оттенках серого, а затем вычислите плотное стереосопоставление. 17. Вариации стереосопоставления. a. Попробуйте другие стереоизображения, полученные с по­мощью стереокамеры или из набора данных Middlebury. b. Выполните стереосопоставление, используя показатель SAD, а не NCC. Используйте опцию 'metric' для istereo. c. Примените метод последовательной переписи (icensus) или рангового преобразования (irank) к левому и правому изображению до сопоставления с использованием меры SAD и исследуйте качество сопоставления. Подробнее см. в (Banks and Corke, 2001). 18. Стереозрение. Для пары идентичных камер с фокусным расстоянием 8 мм, сенсором 1000´1000 пикселей, которые 490 Глава 7 · Использование нескольких изображений составляют квадрат со стороной 10 мкм на базисной линии 80 мм и с параллельными оптическими осями: а) нарисуйте поля обзора камеры на виде сверху. Если камеры смотрят на плоскую поверхность, перпендикулярную главным осям, какова ширина горизонтального перекрывающегося поля зрения в единицах пикселей? b) предполагая, что ошибка диспаратности имеет нормальное распределение с 2σ = 0.2 пикселя, вычислите и постройте график распределения ошибки по координате z реконструированных 3D-точек, которые имеют среднюю диспаратность 0.5, 1, 2, 5, 10 и 20 пикселей. Отобразите 1000 случайных значений диспаратности, преобразуйте их в Z и постройте гистограмму (распределение) их значений; 19. Мона Лиза на вашей стене. Получите каким-либо способом изображение комнаты в вашем доме и отобразите его с по­ мощью MATLAB. Выберите четыре точки, используя ginput, чтобы определить углы виртуальной рамки на стене. Можно использовать углы существующей прямоугольной детали в вашей комнате, например окна, плаката или картины. Найдите соответствующую гомографию, деформируйте изображение Моны Лизы и вставьте его в исходное изображение вашей комнаты. 20. Подбор плоскостей (раздел 7.5.1). a. Проверьте устойчивость алгоритма подбора плоскости к аддитивному шуму и точкам-выбросам. b. Реализуйте итеративный подход со взвешиванием, чтобы минимизировать влияние выбросов. c. Создайте алгоритм подбора плоскости на основе RANSAC, который берет случайные выборки из трех точек для решения уравнения (7.18). Используйте код fmatrix и homography в качестве руководства. Вам нужно создать ряд функций, которые будет вызывать ransac_driver. 21. ICP (раздел 7.5.2). a. Запустите пример ICP на своем компьютере и посмот­ рите анимацию. b. Измените исходное относительное положение облаков точек. Попробуйте несколько очень больших вращений. c. Увеличьте шум, добавленный к точкам данных. d. В случае отсутствующих и/или ложных точек данных поэкспериментируйте с различными значениями параметра 'distthresh'. 22. Коррекция перспективы (раздел 7.7.1). a. Создайте виртуальный ракурс, смотрящий вниз под углом 45° к фасаду собора. Подведение итогов 491 b. Создайте виртуальный ракурс с исходной высоты камеры, но с поворотом камеры на 20° влево. c. Найдите другое реальное изображение с искажением перспективы и попытайтесь ее исправить. 23. Мозаика (раздел 7.7.2). a. Запустите файл примера mosaic и посмотрите, как собирается вся мозаика. b. Измените способ вставки фрагмента в составное изображение, чтобы использовать усреднение пикселей, а не сложение. c. Измените способ вставки фрагмента в составное изображение, чтобы использовались пиксели, расположенные ближе всего к главной точке. d. Запустите программу на наборе собственных перекрывающихся изображений и создайте панораму. 24. Стабилизацию изображения можно использовать для виртуальной стабилизации неустойчивой камеры, например ручной, на дроне или мобильном роботе, пересекающем пересеченную местность. Захватите короткую последовательность изображений I1, I2 ⋯ IN с неустойчивой камеры. Для кадра i, где i ≥ 2, найдите гомографию относительно кадра 1, соответствующим образом деформируйте изображение и сохраните его в массиве. Отобразите стабилизированную последовательность изображений с по­мощью ianimate. 25. «Мешок слов» (раздел 7.7.3). a. Исследуйте различные опорные области разных визуальных слов, используя метод exemplars. b. Исследуйте влияние изменения количества стоп-слов. c. Исследуйте влияние изменения размера словаря. Попробуйте словари размером 1000, 1500, 2500, 3000. d. Соберите «мешок слов» из набора собственных изображений. e. Изучите прием RootSIFT, описанный Аранджеловичем и Зиссерманом (Arandjelovic and Zisserman, 2012). f. Используйте признаки SURF вместо SIFT. g. Используйте угловой детектор SURF с функциями BRISK или FREAK. 26. Визуальная одометрия (раздел 7.7.4). Сделайте следующее: a. используйте признаки SIFT или SURF вместо Харриса. Что происходит с точностью и временем выполнения? b. убедитесь, что признаки более равномерно распределены по сцене, исследуйте параметр 'suppress' функции icorner; c. на каждом временном шаге постройте невязки фундаментальных матриц (их две). Есть ли здесь закономер- 492 Глава 7 · Использование нескольких изображений ность? Подберите параметры RANSAC, чтобы уменьшить количество сбоев пакетной подстройки; d. используйте надежный пакетный подстройщик. Для этого либо найдите готовый, либо реализуйте его самостоятельно (это сложнее); e. примените фильтр Калмана к транспортному средству с простой динамикой, чтобы сгладить оценки скорости. 27. Самостоятельно изучите kd-деревья. Какие задачи в этой главе можно решить с по­мощью kd-деревьев? Приложения Приложение А Приложение В Приложение С Приложение D Приложение Е Приложение F Приложение G Приложение Н Установка наборов инструментов Линейная алгебра: краткое повторение Геометрия Группы и алгебра Ли Линеаризация, якобианы и гессианы Решение систем уравнений Графы Поиск пиков Приложение A Установка наборов инструментов Наборы инструментов (которые мы на протяжении всей книги для краткости называем просто Toolbox) находятся в свободном доступе на домашней странице книги http://www.petercorke.com/RVC, где также содержится много дополнительной информации, связанной с книгой, такой как веб-ссылки (все упомянутые в книге и другие), код, рисунки, упражнения и опечатки. Читатели русского перевода могут скачать файловый архив на странице книги на сайте издательства www. dmkpress.com. Скачивание и установка Эту книгу сопровождают два набора инструментов: набор инструментов машинного зрения (Machine Vision Toolbox, MVTB) и робототехники (Robotics Toolbox, RTB). Для второго издания этой книги актуальными версиями являются MVTB v4 и RTB v10. Наборы инструментов можно установить из файлов формата .zip или .mltbx, как поясняется далее. После загрузки наборов инструментов вы можете изучить их возможности с по­мощью команд: >> rtbdemo или >> mvtbdemo Установка из файла .mltbx Наборы инструментов MATLAB R2014b могут быть упакованы и установлены из файлов с расширением .mltbx. Загрузите самую последнюю версию файлов vision.mltbx и robot.mltbx на свой компьютер. С помощью MATLAB перейдите в папку, в которую вы загрузили файл, и дважды щелкните по нему левой 496 Приложение А кнопкой мыши (или щелкните правой кнопкой и выберите Install – Установить). Toolbox будет установлен в локальной файловой структуре MATLAB, а пути будут соответствующим образом сконфигурированы для этого и будущих сеансов работы с MATLAB. Установка из ZIP-файла Загрузите самую последнюю версию файлов vision.zip и robot. zip на свой компьютер. Используйте любой архиватор, который вы предпочитаете, чтобы разархивировать загруженные файлы. Чтобы добавить наборы инструментов к вашему пути MATLAB, выполните команду: >> addpath RVCDIR ; >> startup_rvc где RVCDIR – это полный путь к каталогу, в котором была создана папка rvctools при распаковке файлов Toolbox. Сценарий startup_rvc добавляет к вашему пути различные вложенные папки и отображает версию наборов инструментов. Вам нужно будет запускать сценарий startup_rvc каждый раз, когда вы запускаете MATLAB. В качестве альтернативы вы можете запустить pathtool и сохранить конфигурацию пути, созданную startup_rvc. При установке из zip-файлов файлы для обоих наборов инструментов находятся в каталоге верхнего уровня, который называется rvctools, а под ним находится несколько подкаталогов: robot – набор инструментов для робототехники Robotics Toolbox; vision – набор инструментов машинного зрения Machine Vision Toolbox; common – служебные функции, общие для наборов инструментов Robotics и Machine Vision; simulink – блоки Simulink® для робототехники и машинного зрения, а также примеры; contrib – код, написанный третьими лицами. MEX-файлы Некоторые функции в Toolbox реализованы в виде MEX-фай­ лов, т. е. они написаны на C для повышения эффективности вычислений, но их можно вызывать из MATLAB, как и любую другую функцию. Исходный код находится в папке mex вместе с инструкциями и сценариями для создания MEX-файлов из- Установка наборов инструментов 497 нутри MATLAB или из командной строки. Вам потребуется компилятор C для создания этих файлов, но также имеются готовые MEX-файлы для ограниченного числа архитектур. Код сторонних разработчиков Ряд полезных функций предоставляется сторонними разработчиками, и для обеспечения их совместимости с другими функциями Toolbox были написаны оболочки. Если вы попытаетесь получить доступ к дополнительной функции, которая не установлена, вы получите сообщение об ошибке. Сторонний код contrib.zip можно загрузить, распаковать, а затем добавить свой путь MATLAB. Если вы установили наборы инструментов из файлов .zip, разверните файл contrib.zip внутри папки RVCDIR. Многие из этих дополнительных функций являются частью активно развивающихся программных проектов, но загружаемый файл представляет собой снимок, который был протестирован и работает так, как описано в этой книге. Как получить помощь Группа Google по адресу http://tiny.cc/rvcforum предоставляет ответы на часто задаваемые вопросы и имеет пользовательский форум для обсуждения вопросов, проблем и ошибок. Лицензия Весь авторский код выпускается под лицензией LGPL. Это означает, что вы можете свободно распространять его в оригинальной или измененной форме при условии сохранения в неприкосновенности информации о лицензии и авторстве. Модули стороннего кода предоставляются по различным лицензиям с открытым исходным кодом. Оболочки Toolbox для этих модулей предоставляются по совместимым лицензиям. Версии MATLAB Программное обеспечение Toolbox для этой книги было разработано и протестировано с использованием MATLAB R2015b и R2016a под Mac OS X (10.11 El Capitan). MATLAB постоянно развивается, поэтому более старые версии MATLAB вряд ли будут работать. Пожалуйста, не сообщайте об ошибках, если вы используете версию MATLAB старше R2014a. 498 Приложение А Язык Octave GNU Octave (www.octave.org) – впечатляющее бесплатное программное обеспечение, реализующее язык, близкий, но не идентичный MATLAB. Наборы инструментов не будут хорошо работать с Octave, хотя после выпуска Octave 4 несовместимость значительно уменьшилась. Приложение B Линейная алгебра: краткое повторение B.1 Векторы Тензоры ранга 1. Мы будем рассматривать только вещественные векторы , ко- торые представляют собой упорядоченный набор из n вещественных чисел v1, v2, ⋯ vn. Обычно его записывают в одной из двух форм: которые являются вектором-столбцом и вектором-строкой соответственно. Они эквивалентны матрицам n´1 и 1´n и могут быть умножены на соответствующую матрицу. Числа v1, v2 и т. д. называются скалярными компонентами или элементами υ, а vi называется i-й компонентой υ. Трехмерный вектор часто записывают через его элементы как υ = (vx, vy, vz). Запись �n обозначает множество упорядоченных наборов (кортежей) из n вещественных чисел, и каждый вектор является точкой в этом пространстве, т. е. υ ∈ �n. Элементы �2 могут быть представлены точкой на плоскости или направленным отрезком. Элементы �3 могут быть представлены точкой в объеме или направленным отрезком. Векторное пространство – это n-мерное пространство, элементами которого являются векторы плюс операции сложения и скалярного умножения. Сложение любых двух элементов a, b ∈ �n дает (a1 + b1, a2 + b2 ⋯ an + bn) и sa = (sa 1, sa 2 ⋯ sa n). Оба результата являются элементами �n. Отрицательное значение вектора получается инверсией каждого элемента вектора: −a = (−a1, −a2 ⋯ −an). 500 Приложение В Мы можем использовать вектор для представления точки с координатами (x1, x2, ⋯ xn). Такой вектор называется координатным. Однако здесь следует быть осторожными, потому что операции сложения и скалярного умножения, хотя и действительны для векторов, бессмысленны для точек. Мы можем прибавить вектор к координатному вектору точки, чтобы получить координатный вектор другой точки, и мы можем вычесть один координатный вектор из другого, и результатом будет смещение между точками. Величина или длина вектора – это неотрицательная скалярная величина, заданная его p-нормой: Евклидова длина вектора определяется как ||v||2, часто называется нормой L2, и обычно в таком случае букву p опускают, например ||v||. Единичный вектор – это такой вектор, для которого ||v||2 = 1, и он обозначается υ̂. Норма L1 представляет собой сумму абсолютных значений элементов и также известна как манхэттенское расстояние. Это расстояние, пройденное при ограничении движения вдоль линий сетки. Норма L∞ является максимальным элементом вектора. Скалярное произведение двух векторов-столбцов является скаляром где θ – угол между векторами; a · b = 0, когда векторы ортогональны. Для трехмерных векторов векторное произведение записывается как где x̂ – единичный вектор, параллельный оси x и т. д., [·]´ – кососимметричная матрица, описанная в следующем разделе, а n̂ – единичный вектор, нормальный к плоскости, содержащей a и b. Если векторы параллельны, a ´ b = 0. Линейная алгебра: краткое повторение 501 B.2 Матрицы Вещественные Таксономия матриц показана на рис. B.1. В этой книге нас интематрицы являются ресуют только вещественные матрицы размера m´n : подмножеством всех матриц. В общем случае комплексных матриц термин «эрмитова матрица» является аналогом симметричной матрицы, а «унитарная» – аналогом ортогональной. с m строк и n столбцов. Если n = m, матрица квадратная. AH обозначает эрТранспонирование записывается следующим образом: митово транспонирование – комплексно-сопряженную B = AT, bi, j = aj,i, ∀, j, транспонированную комплексную матрицу A. Матрицы и можно показать, что являются тензорами второго ранга. (AB)T = BTAT, (ABC)T = CTBTAT, и т. д. Рис. B.1. Таксономия матриц. Классы матриц, которые всегда являются сингулярными, показаны красным цветом, те, которые никогда не являются сингулярными, – синим цветом все матрицы вещественная комплексная квадратная нормальная SE(n) неквадратная общая det ≠ 0 симметричная ортогональная O(n) det = +1 +ve знакоопределенная диагональная единичная SO(n) кососимметричная обратимая det = 0 вырожденная det = –1 конечное нуль-пространство 502 Приложение В B.2.1 Квадратные матрицы Квадратная матрица может иметь обратную матрицу A−1, и в этом случае AA–1 = A–1A = In´n, Ai = inv(A) где – единичная диагональная матрица. Обратная матрица существует при условии, что исходная матрица невырожденная, т. е. ее определитель det(A) ≠ 0. Обратную матрицу можно вычислить из матрицы кофакторов (алгебраических дополнений). Если матрицы A и B квадратные и неособые, то (AB)–1 = B –1A–1, (ABC)–1 = C –1B –1A–1 и т. д., а также (AT )–1 = (A–1)T. Обратную матрицу можно записать как где adj(A) – транспонированная матрица кофакторов, называемая сопряженной или присоединенной матрицей и иногда обозначаемая A∗. Если B = adj(A), то A = adj(B). Если A – невырожденная, сопряжение можно вычислить по формуле adj(A) = det(A)A–1. Для квадратной матрицы, если: А = AT. ......– матрица симметрична. Обратная матрица также симметрична. Многие матрицы, с которыми мы сталкиваемся в робототехнике, симметричны, например ковариационные матрицы и матрицы инерции манипулятора; A = −AT. ....– матрица кососимметрична или антисимметрична. S = skew(v) Такая матрица имеет нулевую диагональ, всегда вы- Линейная алгебра: краткое повторение 503 рождена и обладает тем свойством, что [aυ]´ = a[υ]´, [Rυ]´ = R[υ]´RT и υT[υ]´ = [υ]´υ = 0, ∀υ. Для случая 3´3 (B.1) и обратная операция: v = vex(S) υ = vex(S); A−1 = AT.....– матрица ортогональна. Матрица также называется ортонормированной, поскольку ее векторы-столбцы (и векторы-строки) имеют единичную длину и ортогональны друг другу. Произведение двух ортогональных матриц одинакового размера также является ортогональной матрицей. Набор ортогональных матриц размера n´n образует ортогональную группу O(n). Определитель ортогональной матрицы равен либо +1, либо –1. Подгруппа SO(n), состоящая из ортогональных матриц с определителем +1, называется специальной ортогональной группой. Столбцы (и строки) являются ортогональными векторами, т. е. их скалярное произведение равно нулю: ATA = AAT. .– матрица нормальная и может быть диагонализирована ортогональной матрицей U так, что UTAU – диагональная матрица. Все симметричные, кососимметричные и ортогональные матрицы являются нормальными, как и матрицы вида A = BTB = BBT, где B – произвольная матрица. Квадратную матрицу A ∈ �n´n можно применить как линейное преобразование к вектору x ∈ �n: x¢ = Ax, что дает другой вектор, как правило, с изменением его длины и направления. Однако есть несколько важных частных случаев. Если A ∈ SO(n), то преобразование изометрично и длина вектора неизменна, ||x¢|| = ||x||. В двухмерном пространстве если x – это множество всех точек, лежащих на окружности, то x¢ определяет точки, лежащие на эллипсе. Встроенная демонстрация MATLAB® >> eigshow показывает это очень наглядно, когда вы в интерактивном режиме перетаскиваете кончик вектора x по единичному кругу. 504 Приложение В Собственными векторами квадратной матрицы являются та- [x,e] = eig(A) кие векторы x, что Ax = λi x, (B.2) т. е. их направление не меняется при преобразовании матрицей. Они просто масштабируются по λi, соответствующему собственному значению. Матрица имеет n собственных значений (спектр матрицы), которые могут быть вещественными или комплексными. У ортогональной матрицы собственные значения лежат на единичной окружности комплексной плоскости, |λi| = 1, и все собственные векторы ортогональны друг другу. Все собственные значения вещественной симметричной мат­рицы вещественные, и матрицы классифицируют в соответствии со знаком ее собственных значений: λi > 0, ∀i – положительно определена, λi ≥ 0, ∀i – положительно полуопределенные, λi < 0, ∀i – отрицательно определена, в остальных случаях не определена. Обратная положительно определенная матрица также является положительно определенной. Матрицы АТА и ААТ всегда симметричны и положительно полуопределены. Это означает, что любая симметричная матрица A может быть записана как A = LLT, где L – разложение Холецкого матрицы A. Матрица R такая, что A = RR, является квадратным корнем из A или A1/2. Если T – любая невырожденная матрица, то A = TBT –1. Это так называемое преобразование подобия, а A и B называются подобными, и можно показать, что собственные значения не меняются в результате преобразования. Если A невырожденная, то собственные векторы A−1 такие же, как у A, а собственные значения A−1 обратны собственным значениям A. Собственные значения AT такие же, как и у A, но собственные векторы разные. Матричная форма уравнения B.2 записывается в виде AX = XΛ, L = chol(A) R = sqrtm(A) Линейная алгебра: краткое повторение 505 где X ∈ �n´n – матрица собственных векторов A, расположенных по столбцам, а Λ – диагональная матрица соответствующих собственных значений. Если X не вырождена, мы можем выполнить перестановку A = XΛX –1, которая является собственным значением или спектральным разложением матрицы. Отсюда следует, что матрицу можно диагонализовать преобразованием подобия: Λ = X –1AX. Если A симметрична, то X ортогональна, и вместо этого мы можем написать A = XΛX T, (B.3) det(A) Определитель квадратной матрицы A ∈ �n´n – это множитель, на который преобразование изменяет объемы в n-мерном пространстве. Для случая двухмерного пространства представьте себе форму, определяемую точками xi с замкнутой областью a. Форма, образованная точками Axi, будет иметь замкнутую область adet(A). Если A вырождена, точки Axi лежат в одной точке или вдоль прямой и имеют нулевую замкнутую площадь. Аналогичным образом для случая трехмерного пространства определитель представляет собой масштабный коэффициент, применяемый к объему набора точек, отображенных посредством преобразования А. Определитель равен произведению собственных значений: trace(A) Таким образом, матрица с одним или несколькими нулевыми собственными значениями будет вырожденной. Следовательно, положительно определенная матрица λi > 0 имеет det(A) > 0 и не является вырожденной. След матрицы – это сумма диагональных элементов: которая также является суммой собственных значений: 506 Приложение В Столбцы матрицы A = (c1c2 ⋯ cn) можно рассматривать как набор векторов, определяющих пространство столбцов. Точно так же строки A можно рассматривать как набор векторов, определяющих пространство строк. Столбцовый ранг – это число линейно независимых столбцов матрицы A. Аналогично строковый ранг – это число линейно независимых строк мат­ rank(A) рицы A. Столбцовый и строковый ранг всегда равны и называются просто рангом матрицы A. Ранг имеет верхнюю границу min(m, n). Ранг – это размерность наибольшей невырожденной квадратной подматрицы, которую можно составить из A. Квадратная матрица, для которой rank(A) < n, называется матрицей неполного ранга. Неполнота ранга min(m, n) − rank(A) называется недействительностью A. Кроме того, rank(AB) ≤ min(rank(A), rank(B)) и rank(A + B) ≤ rank(A) + rank(В). Матрица υυT имеет ранг 1 для всех υ ≠ 0. B.2.2 Неквадратные и сингулярные матрицы Для неквадратной матрицы A ∈ �m´n мы можем определить левую обобщенную обратную матрицу (ее также называют просто псевдообратной или псевдообратной Мура–Пенроуза): A+A = In´n, где А+ = (АТА)–1АТ. Правая обобщенная обратная матрица: AA+ = Im´m, где А+ = АТ(ААТ)−1. Если матрица A не имеет полного ранга, то она имеет конечное нуль-пространство (null space), или ядро. Вектор x лежит в нуль-пространстве матрицы, если Ax = 0. Точнее, это правое нуль-пространство. Вектор лежит в левом нуль-пространстве, если xA = 0. Левое нуль-пространство равно правому нуль-простран­ ству AT. Нуль-пространство определяется набором ортогональных null(A) базисных векторов, размерность которых равна нулю A. Любая линейная комбинация этих базисных векторов нулевого пространства лежит в нулевом пространстве. Линейная алгебра: краткое повторение 507 Для неквадратной матрицы A ∈ �m´n аналог уравнения B.2 следующий: Aυi = σi ui, где ui ∈ �m и υi ∈ �n – право- и левовырожденные векторы мат­ рицы A, а σi – ее особые значения. Особые значения (singular value) – это неотрицательные вещественные числа, которые представляют собой квадратный корень из собственных значений AAT, а ui – соответствующие собственные векторы. υi – собственные векторы ATA. [U,S,Vt] = svd(A) Разложение по особым значениям (сингулярное разложение, singular value decomposition, SVD) матрицы A равно A = U ΣV T, где U ∈ �m´m и V ∈ �n´n – ортогональные матрицы, содержащие в качестве столбцов соответствующие сингулярные векторы ui и υi. Σ ∈ �m´n – диагональная матрица особых значений где r = rank(A) – ранг A и σi ≥ σi+1. В случае, когда r < n, диагональ будет иметь нулевые элементы, как показано выше. Столбцы cond(A) V T, соответствующие нулевым столбцам Σ, определяют нульпространство матрицы A. Число обусловленности (коэффициент переноса) матрицы A равно max σi /min σi, а высокое значение означает, что матрица близка к вырожденной, или «плохо обусловленной». Матричная квадратичная форма s = xTAx (B.4) является скаляром. Если A положительно определена, то s = xTAx > 0, ∀x ≠ 0. Для случая, когда A диагональная, можно записать выра­ жение 508 Приложение В которое представляет собой взвешенную сумму квадратов. Если A симметрична, то результат также включает произведения или корреляции между элементами x. Расстояние Махаланобиса – это взвешенное расстояние, или норма где P ∈ �n´n – ковариационная матрица, которая понижает вес компонентов υ с высокой неопределенностью. Приложение С Геометрия Геометрические понятия, такие как точки, прямые, эллипсы и плоскости, имеют решающее значение для областей робототехники и роботизированного зрения. Мы кратко суммируем ключевые представления как в евклидовом, так и в проективном (однородном координатном) пространстве. C.1 Евклидова геометрия C.1.1 Точки Точка в n-мерном пространстве представлена n-кортежем – упорядоченным набором n чисел (x1, x2 ⋯ xn), которые определяют координаты точки. Кортеж также можно интерпретировать как вектор от начала координат до точки (координатный вектор). C.1.2 Прямые C.1.2.1 Прямые в 2D Прямая ℓ = (a, b, c) определяется следующим уравнением: ax + by + c = 0, (С.1) которое является обобщением уравнения прямой, неизученного в школе, y = mx + c, но с по­мощью которого можно легко представить вертикальную прямую, задав a = 0. Здесь υ = (a, b) – вектор, параллельный прямой, и υ = ( −b, a) – вектор нормали к прямой. Прямая, соединяющая две точки, задается решением уравнения 510 Приложение С которое находится из правого нуль-пространства самого левого члена. Точка пересечения двух прямых определяется уравне­ нием у которого нет решения, если прямые параллельны, – крайний левый член вырожден. Прямую можно также представить в полярной форме cosθx + sinθy + ρ = 0, где θ – угол от оси x до прямой, а ρ – нормальное расстояние между прямой и началом координат, как показано на рис. 5.18. C.1.2.2 Прямые в 3D и координаты Плюккера Мы можем определить прямую двумя точками, p и q, как показано на рис. C.1, что потребует в общей сложности шести параметров ℓ = (qx, qy, qz, px, py, pz). Однако, поскольку эти точки могут быть выбраны произвольно, существует бесконечный набор параметров, представляющих одну и ту же прямую, что затрудняет определение эквивалентности двух прямых. Есть преимущества в представлении прямой следующим об- Это не совсем разом: очевидно, но рас- смотрим две параллельные плоскости и произвольную трехмерную прягде ω – направление прямой, а υ – момент прямой – вектор мую, проходящую из начала координат в точку на прямой и нормаль к прямой. через них. Прямая может быть описана Это координатный вектор Плюккера – шестимерная величина двухмерными с двумя ограничениями: координаты однородны и, следова- координатами точки тельно, инвариантны к общему масштабному коэффициен- ее пересечения на каждой плоскоту; и υ · ω = 0. Таким образом, прямые имеют четыре степени сти – всего четыре свободы , а координаты Плюккера лежат на четырехмерном координаты. ℓ = (ω ´ q, p – q) = (υ, ω) ∈ �6, многообразии в шестимерном пространстве. Прямые с ω = 0 лежат на бесконечности и называются идеальными прямыми . Идеально В MATLAB мы сначала определим две точки как векторы- в воображении, а не в реальности. столбцы: >> P = [2 3 4]'; Q = [3 5 7]'; а затем создадим объект прямой Плюккера: >> L = Plucker(P, Q) L = { 1 -2 1; -1 -2 -3 } Геометрия 511 который отображает компоненты v и w. К ним можно получить доступ как к свойствам: >> L.v' ans = 1 >> L.w' ans = -1 -2 1 -2 -3 Прямая Плюккера также может быть представлена как кососимметричная матрица: >> L.skew ans = 0 1 -1 0 -2 -1 1 2 2 1 0 3 -1 -2 -3 0 что можно также записать как p̃ q̃T – q̃p̃ T. Поскольку прямые Чтобы нарисовать эту прямую, мы сначала определяем оббесконечны, нам ласть трехмерного пространства , а затем отображаем ее синужно указать конечный объем, ним цветом: в котором их можно нарисовать. >> axis([-5 5 -5 5 -5 5]); >> L.plot('b'); Прямая – это множество всех точек которое может быть сгенерировано через скалярный параметр >> L.point([0 1 2]) ans = 0.5714 0.3042 0.1429 -0.3917 -0.2857 -1.0875 0.0369 -0.9262 -1.8893 где столбцы – это точки на прямой, соответствующие λ = 0, 1, 2. Рис. С.1. Описание прямой в трех измерениях 512 Приложение С Точка x находится ближе всего к прямой, когда Для точки (1, 2, 3) ближайшая точка на прямой и расстояние до нее определяются выражением: >> [x, d] = L.closest([1 2 3]') x = 1.5714 2.1429 2.7143 d = 0.6547 Прямая пересекает плоскость nTx + d = 0 в точке с коорди­ натой Прямая пересекается с плоскостью xy в точке с координатами >> L.plane_intersect([0 0 1 0])' ans = 0.6667 0.3333 0 Две прямых могут быть идентичными, копланарными или скрещенными. Идентичные прямые имеют линейно зависимые координаты Плюккера, т. е. ℓ1 = λℓ2. Если они копланарны, они могут быть параллельны или пересекаться, а если скошены, могут пересекаться или нет. Если для прямых ω1 ´ ω2 = 0, они параллельны, в противном случае они скрещенные. Минимальное расстояние между двумя прямыми равно d = ω1 · υ2 + ω2 · υ1 и равно нулю, если они пересекаются. Оператор side представляет собой перестановочное скалярное произведение side(ℓ1, ℓ2) = ℓ11ℓ52 + ℓ21ℓ62 + ℓ31ℓ42 + ℓ41ℓ32 + ℓ51ℓ12 + ℓ61ℓ22, которое равно нулю, если прямые пересекаются или параллельны, и вычисляется методом side. Мы можем преобразовать прямую Плюккера с по­мощью сопряженного движения твердого тела: ℓ¢ = Ad(ξ )ℓ. Геометрия 513 Юлиус Плюккер (1801–1868) – немецкий математик и физик, внесший вклад в изучение катодных лучей и аналитической геометрии. Он родился в Эльберфельде, учился в Дюссельдорфе, Бонне, Гейдельберге и Берлине, а в 1823 г. отправился в Париж, где проникся идеями французской геометрии. В 1825 г. он вернулся в Боннский университет, стал профессором математики в 1828 г. и профессором физики в 1836 г. В 1858 г. он предположил, что линии спект­ ра, открытые его коллегой Генрихом Гейсслером (известным нам по трубке Гейсслера), характерны для испускающего их химического вещества. В 1865 г. он вернулся к геометрии и изобрел так называемую линейную геометрию. Он был награжден медалью Копли от Королевского общества в 1866 г. Похоронен на Альтер Фридхоф (Старое кладбище) в Бонне. C.1.3 Плоскости Плоскость определяется четырехмерным вектором π = (a, b, c, d) таким, что ax + by + cz + d = 0, который можно записать в точечно-нормальной форме как nT(x – p) = 0 для плоскости, содержащей точку с координатой p и нормалью n, или, в более общем случае, как nTx + d = 0. Плоскость можно задать тремя точками: Уравнение можно решить с использованием правого нульпространства самого левого члена, или через две непараллельные прямые: π = (ω1 ´ ω2, υ1 · ω2), или через прямую и точку с координатой r: π = (ω ´ r – υ, υ · r). 514 Приложение С Точка определяется как точка пересечения трех плоскостей: Прямая Плюккера, образованная пересечением двух плоскостей: ℓ = (n1 ´ n2, d2n1 – d1n2). C.1.4 Эллипсы и эллипсоиды Эллипс принадлежит к семейству плоских кривых, называемых кониками (conic). Простейшая форма эллипса определяется уравнением и показана на рис. C.2a. Этот канонический эллипс имеет центр в начале координат, а его большая и малая оси параллельны осям x и y. Радиус в направлении x равен a, а в направлении y равен b. Более длинный из двух радиусов называется длиной большой полуоси, а короткий – длиной малой полуоси. Мы можем записать эллипс в матричной квадратичной форме (уравнение B.4) как Рис. С.2. Эллипсы: а) канонический эллипс с центром в начале координат, выровненный по осям x и y; b) обобщенная форма эллипса большая ось малая ось длина большой полуоси ориентация длина малой полуоси длина малой полуоси a длина большой полуоси центр b Геометрия 515 (C.2) (C.3) В самом общем виде E представляет собой симметричную матрицу: (C.4) а ее определитель det(E) = AB − C 2 определяет тип коники: Следовательно, эллипс представлен положительно определенной симметричной матрицей E. И наоборот, любая положительно определенная симметричная матрица, такая как матрица инерции или ковариации, может быть представлена эллипсом. Ненулевые значения C изменяют ориентацию эллипса. Центр эллипса можно разместить в произвольной точке xc в соответствии с уравнением (x – xc )TE –1(x – xc ) = 1, что приводит нас к обобщенному эллипсу, показанному на рис. C.2b. Поскольку матрица E симметрична, ее можно диагонализовать по уравнению (B.3): E = XΛX T, где X – ортогональная матрица, состоящая из собственных векторов E. Обратная матрица получается как E –1 = XΛ–1X T, поэтому квадратичная форма принимает вид: xTXΛ–1X Tx = 1; (X Tx)TΛ–1(X Tx) = 1; x¢TΛ–1x¢ = 1. 516 Приложение С Это похоже на уравнение (C.3), но с эллипсом, определяемым диагональной матрицей Λ относительно повернутой системы координат x¢ = X Tx. Большая и малая оси эллипса выровнены вдоль собственных векторов E. Квадраты радиусов эллипса являются собственными значениями E или диагональными элементами Λ. Для общего случая E ∈ �n´n результатом является эллипсоид в n-мерном пространстве. Функция plot_ellipse Toolbox нарисует эллипс для случая n = 2 и эллипсоид для случая n = 3. В качестве альтернативы эллипс можно представить в полиномиальной форме, записав ее как и раскрыв, чтобы получить уравнение: e1x2 + e2y2 + e3xy + e4x + e5y + e6 = 0, где e1 = a, e2 = b, e3 = 2c, e4 = −2(ax0 + cy0), e5 = −2(by0 + cx0) и e6 = ax02 + by02 + 2cx0y0 – 1. Эллипс имеет только пять степеней свободы – координаты центра и три уникальных элемента в E. Для невырожденного эллипса, где e1 ≠ 0, мы можем переписать полином в нормализованной форме: x 2 + E1 y 2 + E2 xy + E3 x + E4 y + E5 = 0 (C.5) с пятью уникальными параметрами. C.1.4.1 Свойства эллипса Площадь эллипса равна πab, а его эксцентриситет равен Собственные векторы E определяют главные направления эллипса, а квадратные корни из собственных значений являются соответствующими радиусами. Рассмотрим эллипс который представлен в MATLAB как >> E = [2 -1; -1 1]; Геометрия 517 Мы можем построить его с по­мощью команды >> plot_ellipse(E) как показано на рис. C.3. Рис. С.3. Эллипс, соответствующий симметричной матрице 2×2, и единичный круг, показанный красным. Стрелки указывают большую и малую ось эллипса Собственные векторы и собственные значения E равны >> [x,e] = eig(E) x = -0.5257 -0.8507 -0.8507 0.5257 e = 0.3820 0 0 2.6180 а радиусы эллипса равны >> r = sqrt(diag(e)) r = 0.6180 1.6180 что соответствует радиусам b и a соответственно. Если любой из радиусов равен нулю, эллипс вырождается и становится прямой. Если оба радиуса равны нулю, эллипс является точкой. Собственные векторы представляют собой единичные векторы в направлениях малой и большой оси, и мы масштабируем их по радиусам, чтобы получить радиус-векторы, которые можно построить: >> arrow([0 0]', x(:,1)*r(1)); >> arrow([0 0]', x(:,2)*r(2)); 518 Приложение С Ориентация эллипса представляет собой угол между большой осью и горизонтальной осью системы координат, равный Для нашего примера это >> atan2(x(2,2), x(1,2)) * 180/pi ans = 148.2825 в единицах градусов. Площадь эллипса равна πr1r2, а объем эллипсоида равен 4 /3 πr1 r2 r3, где радиусы ri = λi, и λi – собственные значения E. Поскольку det(E) = Πλi, площадь или объем пропорциональны det(E). C.1.4.2 Рисование эллипса Чтобы нарисовать эллипс, сначала определим координату точки y = [x, y]T на единичной окружности y Ty = 1 и перепишем уравнение (С.3) как где E ½ – квадратный корень матрицы (функция MATLAB sqrtm). Приравняв эти два уравнения, мы можем написать: Ясно, что , и можно выполнить перестановку которая переводит точку на единичной окружности в точку на эллипсе. Если центр эллипса находится в точке xc, а не в начале координат, мы можем выполнить замену координат Геометрия 519 откуда запишем преобразование в виде Продолжим пример MATLAB: >> E = [2 -1; -1 1]; Определим множество точек на единичной окружности >> th = linspace(0, 2*pi, 50); >> y = [cos(th); sin(th)]; которые мы преобразуем в точки на периметре эллипса: >> x = (sqrtm(E) * y)'; >> plot(x(:,1), x(:,2)); инкапсулированного в функции Toolbox: >> plot_ellipse(E, [0 0]) Эллипсоид описывается положительно определенной симметричной матрицей 3´3. Рисование эллипсоида выполняется аналогичным образом, и plot_ellipse также может отображать трехмерный эллипсоид. C.1.4.3 Подгонка эллипса к данным По набору внутренних точек В этой задаче нам нужно найти уравнение эллипса, которое наилучшим образом соответствует набору точек, лежащих в пределах границы эллипса. Обычный подход состоит в том, чтобы найти эллипс, обладающий теми же свойствами массы, что и набор точек. По набору N точек xi = (xi, yi) можно вычислить моменты Центр эллипса совпадает с центроидом множества точек 520 Приложение С что позволяет вычислить центральные вторые моменты: Матрица инерции для общего эллипса представляет собой симметричную матрицу где диагональные члены – это моменты инерции, а недиагональные – произведения инерции. Инерция может быть вычислена более непосредственно с по­мощью выражения Связь между матрицей инерции и матрицей симметричного эллипса такова: Чтобы продемонстрировать это, создадим набор точек, которые лежат внутри эллипса, используемого в приведенном выше примере: 1 % генерируем набор точек внутри эллипса 2 p = []; 3 while true 4 x = (rand(2,1)-0.5)*4; 5 if norm(x'*inv(E)*x) <= 1 6 p = [p x]; 7 end 8 if numcols(p) >= 500 9 break; 10 end 11 end 12 plot(p(1,:), p(2,:), '.') 13 14 % вычисляем моменты 15 m00 = mpq_point(p, 0,0); Геометрия 521 16 m10 = mpq_point(p, 1,0); 17 m01 = mpq_point(p, 0,1); 18 xc = m10/m00; yc = m01/m00; 19 20 % вычисляем вторые моменты относительно центроида 21 pp = bsxfun(@minus, p, [xc; yc]); 22 23 m20 = mpq_point(pp, 2,0); 24 m02 = mpq_point(pp, 0,2); 25 m11 = mpq_point(pp, 1,1); 26 27 % вычисляем моменты и матрицу эллипса 28 J = [m20 m11; m11 m02]; 29 E_est = 4 * J / m00 Выполнение этого кода дает следующий результат: >> E_est E_est = 1.8706 -0.9151 -0.9151 0.9716 что аналогично исходному значению E. Точечные данные показаны на рис. C.4. Мы можем наложить предполагаемый эллипс на точечные данные: >> plot_ellipse(E_est, [xc yc], 'r') Результат показан красным цветом на рис. C.4. Рис. С.4. Точки данных (синие) с подогнанным эллипсом (красный) По набору граничных точек В этой задаче нужно найти уравнение эллипса по набору точек (xi, yi), определяющих границу эллипса. Применяя полиноми- 522 Приложение С альную форму уравнения эллипса (C.5) к каждой точке, запишем задачу в матричной форме: откуда для N ≥ 5 можно найти вектор параметров эллипса. C.2 Однородные координаты Точку в однородных координатах, или в проективном пространстве ℙn, представляет координатный вектор x̃ = (x̃ 1, x̃ 2 … x̃ n+1). Евклидовы координаты связаны с проективными координатами соотношением И наоборот, однородный вектор координат может быть построен из евклидова вектора координат с по­мощью уравнения: x̃ = (x1, x2 … xn, 1). Здесь тильда используется для обозначения однородности. Дополнительная степень свободы, предлагаемая проективными координатами, имеет несколько преимуществ. Она позволяет точкам и прямым на бесконечности – так называемым идеальным точкам и прямым – быть представленными с использованием только вещественных чисел. Это также означает, что масштаб не имеет значения, т. е. x̃ и x̃¢ = αx̃ оба представляют одну и ту же евклидову точку для всех α ≠ 0. Это свойство записывают как x̃ ≃ x̃¢. Точки в однородной форме также можно поворачивать относительно системы координат и перемещать, просто умножая однородную координату на матрицу однородного преобразования (n + 1)´(n + 1). Однородные векторы важны в компьютерном зрении, когда мы рассматриваем точки и прямые, существующие на плоскости изображения камеры. Мы также можем считать, что однородная форма представляет собой луч в евклидовом пространстве, как показано на рис. C.5. Отношение между точками и лучами лежит в основе проективного преобразования. C.2.1 йв ны евклидова плоскость пр оек тив Рис. С.5. Точка P на евклидовой плоскости �2 (красная) описывается координатным вектором p ∈ �2, который эквивалентен трехмерному вектору в проективном пространстве ℙ2 (синий), являющемуся однородной координатой p̃ ∈ ℙ2 ект ор Геометрия 523 проективное пространство Два измерения В двух измерениях существует двойственность между точками и прямыми. В ℙ2 прямая задается тройкой ℓ̃ = (ℓ1, ℓ2, ℓ3)T, где не все нули, и уравнение прямой есть множество всех точек: ℓ̃ Tx̃ = 0, которое расширяется до ℓ1x + ℓ2 y + ℓ3 = 0 и может быть преобразовано в более знакомое представление прямой. Обратите внимание, что это уравнение может описывать вертикальную прямую, параллельную оси y, чего не может сделать более привычное уравнение y = mx + c. Это точечное уравнение прямой. Неоднородный вектор (ℓ1, ℓ2) параллелен прямой, а (–ℓ2, ℓ1) представляет собой нормаль к ней. Точка определяется пересечением двух прямых. Если записать точечные уравнения для двух прямых ℓ̃ 1T p̃ = 0 и ℓ̃ 2T p̃ = 0, то их пересечением будет точка с координатами p̃ = ℓ̃1 ´ ℓ̃2. Это так называемое линейное уравнение точки. Точно так же прямая, соединяющая две точки p̃1 и p̃2, задается векторным произведением: ℓ̃12 = p̃1 ´ p̃2. Рассмотрим случай двух параллельных прямых под углом 45° к горизонтальной оси >> l1 = [1 -1 0]'; >> l2 = [1 -1 -1]'; которые мы можем построить: 524 Приложение С >> plot_homline(l1, 'b') >> plot_homline(l2, 'r') Точка пересечения этих параллельных прямых имеет следующие координаты: >> cross(l1, l2) ans = 1 1 0 Это идеальная точка, поскольку третья координата равна нулю, – эквивалентная евклидова точка была бы на бесконечности. Проективные координаты позволяют просто представлять точки и прямые на бесконечности и манипулировать ими без специальной логики. Расстояние от точки с координатами p̃ до прямой ℓ̃ равно (C.6) C.2.1.1 Коники Конические сечения – это важное семейство плоских кривых, которое включает в себя окружности, эллипсы, параболы и гиперболы, которые можно описать как Au2 + Buv + Cv2 + Du + Ev + F = 0, или, более кратко, как p̃Tcp̃ = 0, где c – матрица: Определитель верхней левой подматрицы указывает тип коники: отрицательный для гиперболы, 0 для параболы и положительный для эллипса. C.2.2 Три измерения В трех измерениях существует двойственность между точками и плоскостями. Геометрия 525 C.2.2.1 Прямые Используя однородное представление двух точек p̃ и q̃, мы можем сформировать кососимметричную матрицу 4´4: чьи шесть уникальных элементов составляют вектор координат Плюккера. Эта матрица имеет ранг 2, а определитель является квадратичным в координатах Плюккера – четырехмерной квадратичной гиперповерхностью, известной как квадрика Клейна. Все точки, лежащие на этом многообразии, являются допустимыми прямыми. Многие отношения в разделе C.1.2.2 (между прямыми, точками и плоскостями) можно выразить с по­мощью этой матрицы. Эта матрица возвращается методом L класса Plucker. Для перспективной камеры с матрицей камеры C трехмерная прямая Плюккера, представленная кососимметричной мат­рицей L 4´4, проецируется на плоскость изображения как ℓ = CLC T, которая представляет собой однородную прямую в ℙ2. Она вычисляется автоматически, если объект Plucker передается методу project объекта CentralCamera. C.2.2.2 Плоскости Плоскость, описываемая уравнением πx̃ = 0, может быть задана прямой и точкой: π = Lp̃. Отношения объединения и пересечения более сложны, чем перекрестные произведения, используемые для двухмерного случая. Три точки определяют плоскость, и отношение объединения имеет форму 526 Приложение С а решение находится из правого нуль-пространства матрицы. Пересечение трех плоскостей двойственно и является идеальной точкой, нулевой последней компонентой, если плоскости не пересекаются в точке. C.2.2.3 Квадрики Квадрики (quadric), сокращение от «квадратичная поверхность», представляют собой богатое семейство трехмерных поверхностей. Существует 17 стандартных типов, включая сферы, эллипсоиды, гиперболоиды, параболоиды, цилиндры и конусы, описываемые уравнением x̃TQx̃ = 0, где Q ∈ �4´4 симметрична. Для перспективной камеры с матрицей камеры C контур квадрики проецируется на плоскость изображения по формуле: c∗ = CQ∗C T, где c – матрица 3´3, описывающая конику, см. раздел C.2.1.1, а (·)∗ представляет операцию сопряжения, см. приложение B. C.3 Геометрические преобразования Линейное преобразование – это y = Ax, а аффинное преобразование описывается уравнением y = Ax + b, (С.7) которое включает в себя линейное преобразование и изменение начала координат. Всякое линейное преобразование аффинно, но не всякое аффинное преобразование линейно. К примерам аффинных преобразований относятся трансляция, масштабирование, гомотетия, преобразование подобия, отражение, вращение, сдвиговое отображение и их комбинации в любой комбинации и последовательности. Геометрия 527 В однородных координатах мы можем записать уравнение С.7 как ỹ = H x̃, где , и преобразование действует в точке с однородными координатами x̃. Если вектор определяется как разность между двумя однородными точками p̃ и q̃, то разность p̃ – q̃ является четырехмерным вектором, последний элемент которого равен нулю, что отличает точку от вектора. Аффинное пространство является обобщением евклидова пространства и не имеет выделенной точки, служащей началом координат. Следовательно, ни один вектор не имеет фиксированного начала координат, и ни один вектор не может быть однозначно связан с точкой аффинного пространства, вместо этого существуют векторы смещения между двумя точками пространства. Таким образом, имеет смысл вычитать две точки пространства, получая вектор, но не имеет смысла складывать две точки пространства. Точно так же имеет смысл прибавление вектора к точке аффинного пространства, в результате чего новая точка будет смещена от начальной точки этим вектором. В двух измерениях наиболее общим преобразованием является проективное преобразование, также известное как коллинеация (collineation) которое уникально до масштаба, и один элемент был нормализован к единице. Коллинеация имеет восемь степеней свободы. Аффинное преобразование – это подмножество, в котором элементы последней строки фиксированы и имеется шесть степеней свободы. Преобразование подобия является дальнейшим подмножеством: 528 Приложение С где R ∈ SO(2), что дает всего четыре степени свободы. Преобразования подобия без отражения иногда называют прокрустовым преобразованием. Наконец, евклидово преобразование, или преобразование твердого тела, является наиболее ограничительным и имеет только три степени свободы. Некоторые графические примеры воздействия различных преобразований на квадрат показаны на рис. C.6. Возможные геометрические преобразования для каждого типа преобразования приведены в табл. С.1 вместе с геометрическими свойствами, которые остаются неизменными или инвариантными при таком преобразовании. Мы видим, что, хотя евклидово число является наиболее строгим с точки зрения геометрических преобразований, которые оно может выполнять, оно способно сохранять такие важные свойства, как длина и угол. Таблица С.1. Для различных семейств планарных преобразований перечислены возможные геометрические преобразования и сохраняемые геометрические свойства Евклидово Геометрическое преобразование Вращение Перенос Отражение Равномерное масштабирование Неравномерное масштабирование Наклон Перспективная проекция Сохранение геометрических свойств (инварианты) Длина Угол Отношение длин Параллельность Пересечение Негармоническое отношение Подобие Аффинное Проективное Геометрия 529 Рис. С.6. Двухмерный квадрат (темно-серый) подвергается различным преобразованиям от самых ограниченных (евклидовых) до самых общих (проективных) евклидово подобие аффинное проективное Приложение D Группы и алгебра Ли Мы не можем достаточно далеко продвинуться в изучении вращений или движения твердого тела, не встретив такие термины, как «группы Ли», «алгебра Ли» или «скобки Ли», – все они названы в честь норвежского математика Софуса Ли. Вращения и движения твердого тела в двух и трех измерениях могут быть представлены матрицами, которые образуют группы Ли и подчиняются алгебре Ли. Мы начнем просто с рассмотрения множества всех вещественных матриц размера 2´2 A ∈ �2´2: Эту матрицу мы могли бы записать как линейную комбинацию базисных матриц: где каждая базисная матрица представляет направление в четырехмерном пространстве матриц 2´2. То есть четыре оси этого пространства параллельны каждой из этих базисных матриц. Любая матрица 2´2 может быть представлена точкой в этом пространстве – эта конкретная матрица является точкой с координатами (a11, a12, a21, a22). Все собственно ортогональные матрицы вращения, принадлежащие SO(2), являются подмножеством точек в пространстве всех матриц 2´2. В этом примере точки лежат в одномерном подмножестве, замкнутой кривой, в четырехмерном пространстве. Это пример многообразия – гладкой поверхности более низкого измерения, встроенной в пространство. Понятие кривой в четырехмерном пространстве имеет смысл, если учесть, что матрица вращения SO(2) Группы и алгебра Ли 531 Софус Ли (1842–1899) был норвежским математиком, получившим докторскую степень в Университете Христиании в Осло в 1871 г. Он провел некоторое время в Берлине, работая с Феликсом Кляйном, а позже участвовал в программе Кляйна в Эрлангане по описанию геометрий, основанных на теории групп и проективной геометрии. Во время визита в Милан во время франко-прусской вой­ ны он был арестован как немецкий шпион и провел один месяц в тюрьме. Он наиболее известен своим открытием того, что группы непрерывных преобразований (теперь называемые группами Ли) могут быть поняты путем их линеаризации и изучения их порождающих векторных пространств. Он похоронен в гробнице Вар Фрелзерс в Осло. (Фото Людвика Шачински.) имеет только один свободный параметр, и изменение этого параметра перемещает точку вдоль многообразия. С формальной математической точки зрения можно сказать, что вращения SO(2) и SO(3) и движения твердого тела SE(2) и SE(3) являются матричными группами Ли, и это имеет два следствия. Во-первых, это алгебраическая группа – математическая структура, состоящая из элементов и одного оператора. Проще говоря, группа G обладает следующими свойствами. 1. Если g1 и g2 – элементы группы, т. е. g1, g2 ∈ G, то результат группового оператора ○ также является элементом групВ обозначениях пы: g1 ○ g2 ∈ G. В общем случае группы некоммутативны, этой книги оператор поэтому g1 ○ g2 ≠ g2 ○ g1. Для вращений и движений твердого ⊕ является оператором группы. тела групповой оператор ○ представляет композицию . 2. Групповой оператор ассоциативен, т. е. (g1 ○ g2) ○ g3 = g1 ○ В обозначениях этой книги тожде(g2 ○ g3). ство обозначается 3. Для g ∈ G существует тождественный элемент I ∈ G так, что нулем (подразg ○ I = I ○ g = g . умевая нулевое движение), поэтому 4. Для каждого g ∈ G существует единственный обратный мы можем сказать, h ∈ G такой, что g ○ h = h ○ g = I . что ξ ⊕ 0 = 0 ⊕ ξ = ξ. Второе следствие существования группы Ли состоит в том, что существует гладкая (дифференцируемая) структура многоВ обозначениях этой книги мы ис- образия. В любой точке многообразия мы можем построить пользуем оператор касательные векторы. Набор всех касательных векторов в этой ⊖ξ для образова- точке образует векторное пространство – касательное прония инверсии. странство. Его можно рассматривать как множество всех возможных производных многообразия в этой точке. Касательное пространство описывается алгеброй групп Ли, а базисные направления касательного пространства называются образующими группы. Точки в этом касательном пространстве сопоставляются с элементами группы через степенную функцию. 532 Приложение D Если g – алгебра Ли группы G, то ∀X ∈ g ⇒ eX ∈ G, где элементы g и G – матрицы одинакового размера, каждая из которых имеет определенную структуру. Поверхность сферы представляет собой многообразие в трехмерном пространстве, и в любой точке этой поверхности мы можем создать касательный вектор. На самом деле мы можем создать их бесконечное количество, и они лежат в плоскости, которая представляет собой двухмерное векторное пространство – касательное пространство. Мы можем выбрать набор основных направлений и установить двухмерную систему координат, а также можем сопоставить точки на плоскости с точками на поверхности сферы. Теперь рассмотрим произвольную вещественную матрицу 3´3 A ∈ �3´3: которую мы могли бы записать как линейную комбинацию базисных матриц: где каждая базисная матрица представляет направление в девятимерном пространстве матриц 3´3. Каждая возможная матрица 3´3 представлена точкой в этом пространстве. Не все матрицы в этом пространстве являются собственно ортогональными матрицами вращения, принадлежащими SO(3), а только те, которые лежат на многообразии, поскольку SO(3) является группой Ли. Нулевое вращение, представленное единичной матрицей, является одной точкой в этом пространстве. В этой точке мы можем построить касательное пространство, которое имеет только три измерения. Каждая точка касательного пространства – производные многообразия – может быть выражена как линейная комбинация базисных матриц: (D.1) Группы и алгебра Ли 533 Эквивалентная ал- которая является алгеброй Ли группы SO(3). Базисы этого прогебра обозначается странства: G , G и G называются образующими SO(3) и при1 2 3 строчными буквами и представляет надлежат so(3) . собой набор матриц. Уравнение D.1 можно записать в виде кососимметричной матрицы, параметризованной вектором ω = (ω1, ω2, ω3) ∈ �3: Она отражает три степени свободы группы SO(3), вложенной в пространство всех матриц 3´3. Три степени свободы согласуются с нашим интуитивным представлением о вращении в трехмерном пространстве, а также с теоремой Эйлера о вращении. Часто требуется сопоставление между векторами и кососимметричными матрицами, поэтому встречается следующее сокращенное обозначение: [·]´: � ↦ so(2), �3 ↦ so(3); ⋁´(·): so(2) ↦ �, so(3) ↦ �3; Первое сопоставление выполняется с по­мощью функции skew из Toolbox, а второе – с по­мощью vex (названа так в честь ⋁´). Экспонента любой матрицы в so(3) является действительным членом SO(3): R(θ, ω̂) = e[ω̂]´θ ∈ SO(3). А решение в аналитической форме следует из формулы вращения Родригеса: R(θ, ω̂) = I + sin θ[ω̂]´ + (1 – cos θ)[ω̂]2´. Наконец, рассмотрим произвольную вещественную матрицу 4´4 A ∈ �4´4: которую мы могли бы записать как линейную комбинацию базисных матриц: 534 Приложение D где каждая базисная матрица представляет направление в 16-мер­ ном пространстве всех возможных матриц 4´4. Каждая матрица 4´4 представлена точкой в этом пространстве. Не все матрицы в этом пространстве являются собственно ортогональными матрицами однородного преобразования, принадлежащими SE(3), а только те, которые лежат на гладком многообразии. Нулевое движение (нулевое вращение и перемещение), представленное тождественной матрицей, представляет собой одну точку в этом пространстве. В этой точке мы можем построить касательное пространство, которое в данном случае имеет шесть измерений, а точки в касательном пространстве могут быть выражены как линейная комбинация базисных матриц: , и эти порождающие матрицы принадлежат алгебре Ли группы SE(3) и обозначаются se(3). Их можно записать в общем виде как что представляет собой расширенную кососимметричную мат­рицу, параметризованную S = (υ, ω) ∈ �6, которая называется кручением (twist) и имеет физическую интерпретацию через понятия направления и положения оси винта. Структура разреженной матрицы и эта краткая параметризация отражают шесть степеней свободы группы SE(3), встроенной в про- Группы и алгебра Ли 535 странство всех матриц 4´4. Расширим нашу предыдущую сокращенную запись: [·]: �3 ↦ se(2), �6 ↦ se(3); ⋁(·): se(2) ↦ �3, se(3) ↦ �6. Мы можем использовать эти операторы для преобразования между представлением кручения, которое является шестимерным вектором, и представлением алгебры Ли, являющимся дополненной кососимметричной матрицей 4´4. Алгебру Ли можно конвертировать в представление группы Ли по формуле T(θ, S) = e[S]θ ∈ SE(3) или выполнить обратное преобразование с использованием матричного логарифма. Возведение в степень и логарифмирование имеют решение в аналитической форме. Преобразование кручения – сопряженное представление Было показано, что движения твердого тела могут быть описаны кручением, которое представляет движение через направление и положение оси винта. Например, на рис. D.1 кручение SA может использоваться для преобразования точек на теле. Если винт жестко прикреплен к телу, которое совершает какоелибо движение в SE(3), то новое кручение равно S = Ad(BξA)AS, B где (D.2) является сопряженным представлением движения твердого тела. В качестве альтернативы мы можем написать Ad(e[S]) = ead(S), где ad(S) – логарифм сопряжения, определяемый через параметры кручения как 536 Приложение D Отношения между различными вышеупомянутыми математическими объектами показаны на рис. D.2. Рис. D.1. Точки тела (серое облако) можно трансформировать с помощью кручения SA. Если тело и ось винта претерпевают преобразование твердого тела A ξB, то новое кручение равно SB векторы 6×1 матрицы 6×6 – кручение – сопряженная – кручение/скорость – логарифмическая сопряженная – момент движения – координаты Плюккера матрицы 4×4 – SE(3), однородные – se(3) однородные векторы 4×1 – точки Рис. D.2. Обзор связанных с SE(3) величин. Значения матрицы обозначены следующим образом: 0 (черный), 1 (белый), другие (серый). Преобразования между типами обозначены синими стрелками с названием соответствующего класса и метода. Операции обозначены красными стрелками: объект в хвосте стрелки воздействует на объект в острие стрелки и приводит к появлению другого объекта того же типа Приложение E Линеаризация, якобианы и гессианы В робототехнике и компьютерном зрении уравнения, с которыми мы сталкиваемся, часто являются нелинейными. Чтобы применить знакомые мощные аналитические методы, приходится работать с линейными или квадратичными приближениями к этим уравнениям. Принцип проиллюстрирован на рис. Е.1 для одномерного случая, а аналитические приближения, показанные красным, сделаны при х = х0. Аппроксимация равна нелинейной функции в точке x0, но становится все менее точной по мере удаления от этой точки. Этот подход называется локальной аппроксимацией, поскольку он действителен в области, локальной для x0, а размер допустимой области зависит от величины Рис. E.1. Нелинейная функция f(x) нелинейности. Его можно распространить на произвольное ко(черная) личество измерений. аппроксимируется (красный цвет) в точке x = x0: а) прямой – аппроксимация первого порядка или линейная, b) параболой – аппроксимация второго порядка. В точке линеаризации обе кривые равны и касаются функции, а для (b) совпадают вторые производные a b Скалярная функция скаляра Функция f: � ↦ � может быть представлена в виде ряда Тей­ лора: 538 Приложение E который мы усекаем, чтобы сформировать первое или линейное приближение f ¢(D) » f(x0) + J(x0)D или приближение второго порядка f ¢(D) » f(x0) + J(x0)D + ½H(x0)D2, где D ∈ � – бесконечно малое изменение x относительно точки линеаризации x0, а первая и вторая производные равны J(x0) = df/dx|x0 и H(x0) = d2f/dx2|x0 соответственно. Скалярная функция вектора Скалярное поле f(x): �n ↦ � можно представить в виде ряда Тейлора: Людвиг Отто Гессе (1811–1874) – немецкий математик, родился в Кенигсберге, Пруссия, учился у Якоби и Бесселя в Кенигсбергском университете. Он преподавал в Кенигсберге, Галле, Гейдельберге и, наконец, во вновь созданной Политехнической школе в Мюнхене. В 1869 г. он поступил в Баварскую академию наук. f(x0 + D) = f(x0) + J(x0)D + ½DTH(x0)D + …, который мы можем усечь, чтобы сформировать первое или линейное приближение f ¢(D) » f(x0) + J(x0)D, или приближение второго порядка f ¢(D) » f(x0) + J(x0)D + ½DTH(x0)D, где ∆ ∈ �n – бесконечно малое изменение x ∈ �n относительно точки линеаризации x0, J ∈ �1´n – векторный вариант первой производной, а H ∈ �n´n – гессиан или матричный вариант второй производной. Производная функции f(·) по вектору x равна и сама является вектором, указывающим в направлении, в котором функция f(x) имеет максимальное возрастание. Производную часто записывают как Ñxf, чтобы было ясно, что дифференцирование производится по x. Гессиан – это симметричная матрица вторых производных размера n´n: Линеаризация, якобианы и гессианы 539 Функция находится в критической точке, когда ||J|| = 0. Если гессиан положительно определен, то функция находится в локальном минимуме, если отрицательно определен, то в локальном максимуме, а если неопределен, то функция находится в седловой точке. Для функций, квадратичных по x, как в случае задач наименьших квадратов, можно показать, что гессиан равен Он часто аппроксимируется только первым членом, и это ключ к оптимизации методом наименьших квадратов Гаусса– Ньютона, обсуждаемой в разделе F.2.2. Векторная функция вектора Векторное поле f(x): �n ↦ �m может быть выражено в виде ряда Тейлора, который также может быть записан в виде набора скалярных функций где f i: �m → � для i ∈ {1, 2, ⋯ n}. Производная f по вектору x может быть выражена в матричной форме как матрица Якоби (якобиан) 540 Приложение E которая также может быть записана как Эта производная также известна как касательное отображение f, обозначаемое Tf, или дифференциал f, обозначаемый Df. Чтобы было ясно, что дифференцирование производится по x, матрицу можно обозначить как Jx, Tx f, Dx f или даже ∂f/∂x. Функция находится в критической точке, когда якобиан не имеет полного ранга. Гессиан в этом случае – это H ∈ �n´m´n, который представляет собой трехмерный массив, называемый кубиксом (cubix). Нахождение якобианов Якобианы функций требуются для многих алгоритмов оптимизации, а также для расширенного фильтра Калмана и могут быть найдены численно или символически. Рассмотрим задачу оценки дальности и угла азимута ориентира с учетом положения транспортного средства и положения ориентира. Мы можем выразить это как очень простую анонимную функцию MATLAB: >> zrange = @(xi, xv, w) ... [ sqrt((xi(1)-xv(1))^2 + (xi(2)-xv(2))^2) + w(1); atan((xi(2)-xv(2))/(xi(1)-xv(1)))-xv(3) + w(2) ]; Чтобы оценить якобиан Hxv = ∂h/∂xv для xv = (1, 2, π/3) и xi = (10, 8), мы можем вычислить числовую разность первого порядка: >> xv = [1, 2, pi/3]; xi = [10, 8]; w= [0,0]; >> h0 = zrange(xi, xv, w) h0 = 10.8167 -0.4592 >> d = 0.001; >> Hxv = [ zrange(xi, xv+[1,0,0]*d, w)-h0 ... zrange(xi, xv+[0,1,0]*d, w)-h0, ... zrange(xi, xv+[0,0,1]*d,w)-h0] / d Hxv = -0.8320 -0.5547 0 0.0513 -0.0769 -1.0000 Линеаризация, якобианы и гессианы 541 Обратите внимание, что при вычислении этого якобиана мы установили шум измерения w равным нулю. Основная трудность при таком подходе заключается в выборе d, разности, используемой для вычисления конечно-разностной аппроксимации производной. Если взять слишком большое значение, то для нелинейной функции результаты будут весьма неточными; если слишком маленькое – численные проблемы приведут к снижению точности. В качестве альтернативы мы можем выполнить дифференцирование символически. Эта конкретная функция относительно проста, и ее производные можно легко определить с по­мощью дифференциального исчисления. Численную производную можно использовать для быстрой проверки правильности. Чтобы избежать ошибки или в случае более сложных функций, можно выполнить дифференцирование, используя практически любой пакет компьютерной алгебры – их очень много. Используя MATLAB Symbolic Math Toolbox, можно объявить некоторые символьные переменные >> syms xi yi xv yv thetav wr wb а затем вычислить ту же функцию, что и выше: >> z = zrange([xi yi], [xv yv thetav], [wr wb]) z = wr + ((xi - xv)/(yi - yv)^2)^(1/2) wb - thetav + atan((yi - yv)/(xi - xv)) которая представляет собой уравнение положения ориентира, записанное в символьной форме MATLAB. Якобиан вычисляется функцией Symbolic Math Toolbox™: >> Hxv = jacobian(z, [xv yv thetav]) Hxv = [ -(2*xi - 2*xv)/(2*((xi - xv)^2 + (yi - yv)^2)^(1/2)), ⮠ -(2*yi - 2*yv)/(2*((xi - xv)^2 + (yi - yv)^2)^(1/2)), 0] [ (yi - yv)/((xi - xv)^2*((yi - yv)^2/(xi - xv)^2 + 1)), ⮠ -1/((xi - xv)*((yi - yv)^2/(xi - xv)^2 + 1)), -1] которая имеет необходимые размеры >> about(Hxv) Hxv [sym] : 2x3 (112 bytes) и характеризует последний столбец. Этот код можно вырезать и вставить в свою программу или автоматически создать вызываемую функцию MATLAB: >> HxvFunc = matlabFunction(Hxv); 542 Приложение E где HxvFunc – указатель на функцию MATLAB. Мы можем найти якобиан в рабочей точке, указанной выше: >> xv = [1, 2, pi/3]; xi = [10, 8]; w = [0,0]; >> HxvFunc( xi(1), xv(1), xi(2), xv(2) ) ans = -0.8321 -0.5547 0 0.0513 -0.0769 -1.0000 Результат аналогичен полученной выше численной аппроксимации. Функция matlabFunction также может записывать функцию в М-файл. Функции ccode и fcode генерируют представления якобиана на языках C и Fortran. Другим интересным подходом является пакет ADOL-C, который представляет собой инструмент с открытым исходным кодом, автоматически различающий языки C и C++, т. е., получая функцию, написанную на C, он будет возвращать функцию якобиана, написанную на C. Пакет доступен по адресу http://www. coin-or.org/projects/ADOL-C.xml. Приложение F Решение систем уравнений Решение систем линейных и нелинейных уравнений, особенно систем с чрезмерными ограничениями, является распространенной задачей в робототехнике и компьютерном зрении. F.1 Линейные задачи F.1.1 Неоднородные системы Это уравнения вида Ax = b, где нужно найти неизвестный вектор x ∈ �n, а A ∈ �m´n и b ∈ �m – константы. Если n = m, то A квадратная, а если A невырожденная, то решение получается с по­мощью обратной матрицы: x = A–1b. На практике часто встречаются системы, где m > n, т. е. уравнений больше, чем неизвестных. В общем случае точного решения не будет, но мы можем попытаться найти наилучшее решение по методу наименьших квадратов Это решение получается следующим способом: x∗ = (ATA)–1ATb = A+b, Поскольку это обра- который называется псевдообращением, или, более строго, левощенное левосторон- обобщенным обращением . Используя SVD, где A = U ΣV T, полунее умножение b. чаем x = V Σ−1U Tb, 544 Приложение F где Σ−1 – просто поэлементное обращение диагональных элементов ΣT. Если матрица вырождена или на систему наложено ограничение n < m, то существует бесконечно много решений. Мы снова можем использовать подход SVD x = V Σ–1U Tb, где на этот раз Σ−1 является поэлементным обращением ненулевых диагональных элементов Σ, все остальные нули остаются неизменными. В MATLAB все эти задачи можно решить с по­мощью оператора обратной косой черты: >> x = A\b Рассмотрим задачу: RP = Q, где R – неизвестная матрица вращения в SO(n), а P = {p1 ⋯ pm} ∈ �n´m и Q = {q1 ⋯ qm} ∈ �n´m содержат векторы-столбцы, для которых qi = Rpi. Сначала вычислим матрицу моментов а затем вычислим SVD M = U ΣV T. Матрица вращения, полученная методом наименьших квадратов, R = UV T, гарантированно является ортогональной матрицей. F.1.2 Однородные системы Это уравнения вида Ax = 0, которые всегда имеют тривиальное решение x = 0. Если A квад­ ратная и невырожденная, это единственное решение. В противном случае, если A не имеет полного ранга, т. е. матрица неквадратная или квадратная, но вырожденная, существует бесконечное количество решений, представляющих собой линейные комбинации векторов в правом нулевом пространстве A, которое вычисляется функцией MATLAB null. Решение систем уравнений 545 F.2 Нелинейные задачи Многие задачи робототехники и компьютерного зрения связаны с системами нелинейных уравнений. Решение этих задач требует линеаризации уравнений относительно оценочного решения, поиска улучшенного решения и повторения. Линеаризация обсуждается в приложении E. F.2.1 Поиск корней уравнений Рассмотрим систему уравнений, представленную в виде f(x) = 0, где f: �n ↦ �m. Это нелинейная версия описанной выше однородной системы. Сначала линеаризуем уравнение относительно наилучшей оценки решения x0: f(x0 + D) = f(x0) + J(x0)D + ½DTH(x0)D + …, (F.1) где ∆ ∈ �n – бесконечно малое изменение x относительно x0. Обрезаем ряд, чтобы сформировать линейное приближение: f ¢(D) » f0 + JD, (F.2) где f0 = f(x0) – значение функции, а J = J(x0) ∈ �m´n – якобиан, оба оцениваются в точке линеаризации. Теперь мы решаем приближение нашей исходной задачи f ¢(D) = 0: f0 + JD = 0 ⇒ D = –J –1f0. Если n ≠ m, то J не квадратная, и мы можем использовать оператор псевдообращения или оператор обратной косой черты MATLAB -J\f0. Вычисленный шаг D основан на аппроксимации исходной нелинейной функции, поэтому x0 + D, как правило, не будет решением, но станет ближе к нему. Это приводит нас к итеративному решению – методу Ньютона–Рафсона: 1 while || f(x0)|| > ε do 2 вычислить f0 = f(x0), J(x0) 3 D = –J –1f0 4 x0 ← x0 + D 5 end 546 Приложение F F.2.2 Нелинейная минимизация Широко распространенным классом задач является нахождение минимума скалярной функции f(x): �n ↦ �, которая может быть выражена как Производная линеаризованной системы уравнения F.2: Если мы рассматриваем функцию как многомерную поверхность, то J(x0) является вектором, указывающим направление и величину наклона при x = x0, поэтому обновление D = –βJ сдвинет оценку вниз по склону к минимуму. Таким образом, мы приходим к итеративному решению, называемому градиентным спуском: 1 repeat 2 вычислить J = J(x0) 3 D = –βJ 4 x0 ← x0 + D 5 until || D || < ε и задача состоит в том, чтобы выбрать подходящий размер шага β. Если добавить член второго порядка из уравнения F.1, аппроксимация примет вид: f ¢(D) » f0 + JD + ½DTH(x0)D. Чтобы найти ее минимумы, возьмем производную и приравняем ее к нулю: где изменение D = –H –1J. Решение систем уравнений 547 Это приводит нас к другому итеративному решению – методу Ньютона. Задача состоит в том, чтобы определить гессиан нелинейной системы либо с по­мощью числовой аппроксимации, либо с по­мощью символьных манипуляций. F.2.3 Минимизация нелинейного метода наименьших квадратов Очень часто скалярная функция, которую мы хотим оптимизировать, представляет собой квадратичную функцию стоимости: F(x) = ||f(x)||2 = f(x)Tf(x), где f(x): �n ↦ �m – некоторая векторнозначная нелинейная функция, которую мы можем линеаризовать как f ¢(D) » f0 + JD, а скалярная стоимость: Один член полуF(D) » (f0 + JD)T(f0 + JD) чается транспонированием другого, » f0Tf0 + f0TJD + DTJ Tf0 + DTJ TJD но, поскольку оба приводят к скаляр» f0Tf0 + 2f0TJD + DTJ TJD, ному транспонированию, это не имеет где J TJ ∈ �n´n – приближенный гессиан из приложения E. значения. Чтобы свести к минимуму ошибку этой линеаризованной системы наименьших квадратов, мы берем производную по D и приравниваем ее к нулю: Это уравнение мы можем решить для локально оптимального обновления D = –(J TJ )–1J Tf0, (F.3) в котором можно разглядеть псевдо- или левообобщенное обращение J. Чтобы найти решение, мы снова прибегаем к итерации. Это так называемая итерация Гаусса–Ньютона. Вычислительные проблемы При решении уравнения F.3 иногда оказывается, что гессиан J TJ плохо обусловлен или вырожден, но это можно исправить, добавив демпфирующий член: 548 Приложение F D = –(J TJ + λI )–1J Tf0, что делает систему более положительно определенной. Поскольку J TJ + λI фактически находится в знаменателе, увеличение λ приведет к уменьшению ||D|| и медленной сходимости. Как правильно выбирать λ? Мы можем экспериментировать с разными значениями, но лучшим способом является алгоритм Левенберга–Марквардта (алгоритм F.1), который корректирует λ для обеспечения сходимости. Если ошибка увеличивается по сравнению с последним шагом, то шаг повторяется с увеличением λ, чтобы уменьшить размер шага. Если ошибка уменьшается, то λ уменьшается, чтобы увеличить скорость сходимости. Обновления постоянно варьируются между методом Гаусса–Ньютона (низкое значение λ) и градиентным спуском (высокое значение λ). Для задач, где n велико, обращение приблизительного гессиана n´n обходится дорого. Обычно m < n, что означает, что якобиан не является квадратным, и уравнение (F.3) можно переписать как D = –J T(JJ T )–1f0, что является правым псевдообращение и требует обращения меньшей матрицы. Мы можем снова ввести демпфирующий член D = –J T(JJ T + λI )–1f0, и при большом λ уравнение становится проще: D » –βJ Tf0, но показывает очень медленную сходимость. Если fk(·) содержит аддитивный шум, который имеет нулевое среднее, нормально распределен и неизменен во времени, мы получаем оцениватель максимального правдоподобия x. Выбросы данных оказывают значительное влияние на результат, поскольку ошибки возводятся в квадрат. Робастные оцениватели минимизируют влияние выбросов данных, а в М-оценивателе F(x) = ρ(fk(x)) квадрат нормы заменяется функцией потерь ρ(·), которая моделирует вероятность своего аргумента. В отличие от квадрата нормы эти функции сглаживаются при больших значениях. К распространенным примерам относятся функция потерь Хьюбера и двухвесовая функция Тьюки. Решение систем уравнений 549 Алгоритм F.1. Алгоритм Левенберга– Марквардта. Значение c обычно выбирается в диапазоне от 2 до 10 1 инициализация λ 2 repeat 3 вычисление f0 = f(x0), J = J(x0), H = J TJ 4 D = –(H + λI)–1J Tf0 5 if F(x0 + D) < F(x0) then 6 –ошибка снизилась: уменьшить демпфирование 7 x0 ← x0 + ∆ 8 λ ← λ/c else 9 10 11 ошибка возросла: отменить шаг и увеличить – демпфирование λ ← cλ 12 end 13 until ||∆|| < ε F.2.4 Р азреженные нелинейные методы наименьших квадратов Для большого класса задач общая стоимость представляет собой сумму квадратов стоимостей (F.4) Рассмотрим задачу подгонки модели z = φ(w; x), где φ: �p ↦ � с параметрами x ∈ �n, к набору точек данных (wk, zk). Вектор ошибки, связанный с k-й точкой данных, равен m fk(x) = zk – φ(wk; x) ∈ �m, и минимизация уравнения (F.4) дает оптимальные параметры модели x. Другим примером является оптимизация графа положений, используемая для SLAM и пакетной подстройки. Ребро k в графе соединяет вершины i и j и имеет соответствующую стоимость fk: �n ↦ �m: fk(x) = ê k(x) – ek#, (F.5) где ek# – наблюдаемое значение параметра ребра, а ê k(x) – оценка, основанная на состоянии x графа положений. После линеаризации f k¢(D) » f0,k + JkD. 550 Приложение F Квадратичная ошибка для ребра равна Fk(x) = fk(x)TΩk fk(x), где Ωk ∈ �m´m – положительно определенная постоянная матри- Ее можно использовать ца , которую применяют следующим образом: T Fk(D) » (f0,k + JkD) Ωk(f0,k + JkD) T T Ωk f0,k + f 0,k Ωk JkD + DTJ kTΩk f0,k + DTJ kTΩk JkD » f 0,k » ck + 2bkTD + DTHkD, T Ωk Jk и Hk = åk J kTΩk Jk. Общая стоимость представляет где bkT = f 0,k собой сумму всех стоимостей ребер: T где bT = åk f 0,k Ωk Jk и H = åk J kTΩk Jk – суммы по ребрам графа. Как только они вычислены, мы действуем, как и раньше, беря производную по ∆ и приравнивая ее к нулю, находя обновление ∆ и выполняя итерацию с использованием алгоритма (F.1). Вектор состояния Вектор состояния представляет собой конкатенацию всех положений и координат в задаче оптимизации. Для графа положений SLAM он принимает форму x = {ξ1, ξ2 … ξN} ∈ ℝn. Положения должны быть представлены в векторной форме и, предпочтительно, компактно и без вырожденности. Для SE(2) это довольно просто, если использовать ξ ∼ (x, y, θ) ∈ �3. Для SE(3) используют ξ ∼ (t, r) ∈ �6, который включает перенос t ∈ �3 и поворот r ∈ �3. Последние могут быть тройными углами (Эйлера или крена-тангажа-рыскания), углами относительно оси, экспоненциальными координатами или векторной частью единичного кватерниона, как обсуждалось в разделе 7.4. Вектор состояния имеет структуру, состоящую из последовательности подвекторов, по одному на положение. Обозначим i-й подвектор x как xi ∈ �Nξ, где Nξ = 3 для SE(2) и Nξ = 6 для SE(3). для определения значимости ребра detΩk по отношению к другим ребрам, а также относительной значимости элементов fk(·). Решение систем уравнений 551 В случае SLAM с графом положений с ориентирами или пакетной подстройки вектор состояния содержит векторы положений и координат x = { ξ1, ξ2 … ξN | P1, P2 … PM} ∈ ℝn, а i-й и j-й подвекторы x обозначаются xi ∈ �Nξ и xj ∈ �NP и соответствуют ξi и Pj соответственно. Внутренняя структура Ключевым является тот факт, что вектор ошибок fk(x) для ребра k зависит только от ассоциированных вершин i и j, а это означает, что якобиан в основном состоит из нулей где Ai ∈ ℝm´Nξ и Bj ∈ ℝm´Nξ или Bj ∈ �m´NP в соответствии со структурой вектора состояния. Эта разреженная блочная структура означает, что вектор bk и гессиан J kTΩk Jk также имеют разреженную блочную структуру, как показано на рис. F.1. Гессиан содержит только четыре небольших ненулевых блока, поэтому вместо вычисления произведения J kTΩk Jk, которое содержит большое количество умножений на ноль, мы можем просто вычислить четыре ненулевых блока и добавить их в гессиан для системы наименьших квадратов. Все блоки в строке имеют одинаковую высоту, а в столбце имеют одинаковую ширину. В случае графа положений SLAM с ориентирами или пакетной подстройки блоки имеют разные размеры, как показано на рис. F.1b. Если значение ребра представляет положение, то уравнение (F.5) следует заменить на fk(x) = êk(x) ⊖ ek#. Мы обобщаем его с по­мощью оператора ⊟, чтобы указать, что следует использовать операторы «–» или «⊖» в зависимости от ситуации. Точно так же при обновлении вектора состояния в конце итерации положения должны быть объединены в композицию x0 ← x0 ⊕ D, и мы обобщаем это действие оператором ⊞. Задача оптимизации графа положений решается итеративным способом в алгоритме F.2. 552 Приложение F a b Рис. F.1. Внутренняя структура вектора ошибок, матрицы Якоби и Гессе для задач наименьших квадратов на основе графов: a) граф положений SLAM с N узлами, представляющими положение робота как ℝNξ; b) пакетная подстройка с N узлами, представляющими положение камеры как ℝNξ, и M узлами, представляющими положение ориентира как ℝNP. Индексы i и j обозначают i-й и j-й блоки, а не i-ю и j-ю строку или столбец. Белый цвет обозначает нулевые значения 1 repeat 2 3 4 H ← 0, b ← 0 for each k do f0,k(x0) = êk(x) ⊟ ek# 5 6 Алгоритм F.2. Оптимизация графа положений. Для оптимизации Левенберга–Марквардта замените строку 14 строками 4–12 из алгоритма F.1 (i, j) = вершины(k) вычисление Ai(xi), Bj(xj) T Ωk Ai bi ← bi + f 0,k 7 T bj ← bj + f 0,k Ω k Bj 8 Hi,i ← Hi,i + AiTΩk Ai 9 Hi,j ← Hi,j + AiTΩk Bj 10 11 12 Hj,i ← Hj,i + BjTΩk Ai Hj,j ← Hj,j + BjTΩk Bj 13 end 14 D = –H –1b 15 x0 ← x0 ⊞ D 16 until ||D|| < ε Проблемы большого масштаба Для SLAM с графом, представляющим тысячи положений или пакетной подстройки с тысячами камер и миллионами ориен- Решение систем уравнений 553 тиров, матрица Гессе будет огромной, что приведет к проблемам с вычислениями и хранением. Общий гессиан представляет собой сумму множества краевых гессианов, структурированных, как показано на рис. F.1, а общий гессиан для обсуждаемой нами задачи показан на рис. F.2. Он имеет четкую структуру, особенностями которой можно воспользоваться. Рис. F.2. Карта разреженности Гессе, созданная с использованием функции spy MATLAB, количество ненулевых элементов показано под графиком. Гессиан для задачи пакетной подстройки с 10 камерами и 110 ориентирами (vision/examples/bademo.m) nz = 20 646 Во-первых, гессиан разреженный, т. е. содержит в основном нули. MATLAB имеет встроенную поддержку таких матриц и вместо хранения всех этих нулей (по 8 байт каждый) просто хранит список ненулевых элементов. Все стандартные матричные операции используют эффективные алгоритмы работы с разреженными матрицами. Во-вторых, в случае пакетной подстройки гессиан имеет две блочно-диагональные подматрицы, поэтому можно разделить систему следующим образом: Блочно-диагональ- где B и C – диагонали блоков . Нижние индексы ξ и P обознаная матрица чают блоки D и b, связанные с положениями камеры и позициобращается простым инвертированием ями ориентиров соответственно. Сначала решим систему для каждого из для обновлений положений камеры Dξ: ненулевых блоков по диагонали. –1 SDξ = bξ – EC bP, 554 Приложение F где S = B − EC −1E T – дополнение Шура, представляющее собой симметричную положительно определенную матрицу, которая также является блочно-диагональной. Затем мы решаем систему для обновлений позиций ориентиров: DP = C –1(bP + E TDξ). Более сложные методы используют мелкомасштабную блочную структуру для дальнейшего сокращения времени вычислений, например GTSAM (https://bitbucket.org/gtborg/gtsam) и SLAM++ (https://sourceforge.net/projects/slam-plus-plus). Закрепление Оптимизация обеспечивает решение, в котором относительные положения и позиции дают наименьшую общую стоимость, и такое решение будет представлять собой произвольное преобразование по отношению к глобальной системе отсчета. Чтобы получить абсолютные положения и позиции, мы должны закрепить или зафиксировать некоторые узлы – присвоить им значения относительно глобальной системы координат и предотвратить их корректировку при оптимизации. Подходящий способ добиться этого – удалить из H и b строки и столбцы, соответствующие закрепленным положениям и позициям. Затем мы решаем задачу более низкой размерности для D¢, которая будет короче, чем x, и требуется тщательный подход, чтобы правильно сопоставить подвекторы D¢ с векторами x для обновления. Приложение G Графы Граф – это абстрактное представление множества объектов, связанных ребрами и изображаемое графически, как показано на рис. G.1. Математически граф обозначается как G(V, E), где V – вершины или узлы, а E – связи, соединяющие пары вершин и называемые ребрами или дугами. Ребра могут быть направленными (стрелки) или ненаправленными, как в данном случае. Ребра могут иметь собственный вес, т. е. стоимость, связанную с перемещением из одной вершины в другую. Последовательность ребер из одной вершины в другую называется путем, а последовательность, начинающаяся и заканчивающаяся в одной вершине, – циклом. Ребро из вершины в себя является петлей. Графы можно использовать для представления маршрутов транспорта, сетей связи или социальных сетей, а соответствующая область математики называется теорией графов. Рис. G.1. Пример графа, сгенерированного классом PGraph Этот класс используется другими Toolbox предоставляет графовый класс MATLAB под названиклассами Toolbox, ем PGraph, поддерживающий встроенные графы, в которых вертакими как PRM, Lattice, RRT, PoseGraph шины связаны с точкой в n-мерном пространстве . Создадим и BundleAdjust. новый граф: В MATLAB 2015b появился встроен- >> g = PGraph() ный класс graph g = для представления 2 dimensions графов. 556 Приложение G 0 vertices 0 edges 0 components По умолчанию узлы графа существуют в двухмерном пространстве. Добавим узлы в граф: >> g.add_node( rand(2,1) ); >> g.add_node( rand(2,1) ); >> g.add_node( rand(2,1) ); >> g.add_node( rand(2,1) ); >> g.add_node( rand(2,1) ); причем каждый узел будет иметь случайные координаты. Метод add_node возвращает целочисленный идентификатор только что добавленного узла. Сводка графа >> g g = 2 dimensions 5 vertices 0 edges 0 components показывает, что граф имеет пять узлов, но не имеет ребер. Узлы пронумерованы от 1 до 5. Добавим ребра между парами узлов: >> g.add_edge(1, 2); >> g.add_edge(1, 3); >> g.add_edge(1, 4); >> g.add_edge(2, 3); >> g.add_edge(2, 4); >> g.add_edge(4, 5); >> g g = 2 dimensions 5 vertices 6 edges 1 components По умолчанию расстояние между узлами равно евклидову расстоянию между вершинами, но это можно переопределить третьим аргументом метода add_edge. Методы add_node и add_edge возвращают целое число, однозначно идентифицирующее только что созданный узел или ребро. Граф имеет одну компоненту, т. е. все узлы объединены в одну сеть. Граф можно построить >> g.plot('labels') как показано на рис. G.1. Вершины отображаются в виде синих кругов, а опция 'labels' отображает индекс вершины рядом с кругом. Ребра показаны черными линиями, соединяющими Графы 557 вершины. Существует множество опций для изменения поведения графа по умолчанию. Обратите внимание, что можно строить только графы, встроенные в двухмерное и трехмерное пространство. Отобразим соседей вершины 2: >> g.neighbours(2) ans = 3 4 1 Это вершины, соединенные ребрами с вершиной 2. Каждое ребро имеет уникальный индекс. Ребра, соединяющие вершину 2, имеют индексы: >> e = g.edges(2) e = 4 5 1 Стоимость или длина этих ребер равна >> g.cost(e) ans = 0.9597 0.3966 0.6878 и очевидно, что ребро 5 имеет меньшую стоимость, чем ребра 4 и 1. Ребро 5 >> g.vertices(5)' ans = 2 4 соединяет вершины 2 и 4, а вершина 4, очевидно, является ближайшим соседом вершины 2. Часто бывает нужно получить соседние вершины узла и расстояния до них одновременно, и это удобно делать так: >> [n,c] = g.neighbours(2) n = 3 4 1 c = 0.9597 0.3966 0.6878 Краткую информацию об узле можно получить с по­мощью следующего кода: >> g.about(1) Node 1 #1@ (0.814724 0.905792 ) neighbours: >-o-> 2 3 4 edges: >-o-> 1 2 3 К любому узлу или ребру можно присоединить произвольные данные с по­мощью методов setvdata и setedata соответственно и извлечь их с по­мощью методов vdata и edata соответственно. 558 Приложение G Вершина, ближайшая к координате (0.5, 0.5): >> g.closest([0.5, 0.5]) ans = 4 а вершина, ближайшая к интерактивно выбранной точке, определяется методом g.pick. Путь с минимальной стоимостью между любыми двумя узлами в графе можно вычислить с по­мощью хорошо известных алгоритмов, таких как A* (Nilsson, 1971) >> g.Astar(3, 5) ans = 3 2 4 5 или с по­мощью более раннего метода Дейкстры (1959). По умолчанию граф рассматривается как неориентированный, т. е. ребра не имеют предпочтительного направления. Опция 'directed' указывает рассматривать ребра как направленные, и путь будет проходить по ребрам только в их указанном направлении, т. е. от первого ко второму аргументу метода add_edge. Существуют методы для вычисления различных других представлений графа, таких как матрицы смежности, инцидентности, степени и матрицы Лапласа. Приложение H Определение пика Часто встречается задача нахождения положения пика некоторого дискретного одномерного сигнала y(k), k ∈ �, например как показано на рис. H.1a: >> load peakf it1 >> plot(y, '-o') Найти пик до ближайшего целого числа очень просто, используя функцию max в MATLAB: >> [ypk,k] = max(y) ypk = 0.9905 k = 8 которая указывает на то, что пик приходится на восьмой элемент и соответствует значению функции 0.9905. В данном случае имеется более одного пика, и вместо функции MATLAB мы можем использовать функцию peak Toolbox: >> [ypk,k] = peak(y) ypk = 0.9905 0.6718 k = 8 25 16 a -0.5799 b Рис. Н.1. Поиск пика: a) сигнал с несколькими локальными максимумами; b) крупный план первых максимумов с аппроксимирующей кривой (красная) и значением пика (красный ромбик ◊) 560 Приложение H которая вернула три максимума по убыванию величины. Обычным критерием качества пика является его величина и отношение высоты второго пика к высоте первого пика: >> ypk(2)/ypk(1) ans = 0.6783 которое называется коэффициентом неоднозначности и в идеале должно быть небольшим. Данный сигнал представляет собой выборочное представление непрерывного базового сигнала y(x), и реальный пик может фактически находиться между выборками. Если мы посмотрим на увеличенный фрагмент сигнала (рис. H.1b), мы увидим, что, хотя восьмая точка является максимальной, девятая точка лишь немного ниже, поэтому пик находится где-то между ними. Обычный подход состоит в подгонке параболы y = aδx2 + bδx + c, δx ∈ ℝ (H.1) к точкам, окружающим вершину. Если рассматривать дискретный пик, который встречается в точке (k, yk), то δx = 0 соответствует k, а дискретные координаты x с обеих сторон – δx = −1 и δx = +1 соответственно. Подставив точки (k − 1, yk−1), (k, yk) и (k + 1, yk+1) в уравнение (H.1), можно написать три уравнения: yk–1 = a – b + c; yk = c; yk+1 = a + b + c, или в компактной матричной форме: а затем найти параболические коэффициенты: (H.2) Максимум параболы достигается в точке, где ее производная равна нулю: 2aδx + b = 0. Определение пика 561 И, подставляя значения a и b из уравнения (H.2), можно найти смещение вершины подогнанной параболы относительно дискретных максимумов: Таким образом, уточненное или интерполированное положение максимума находится в точке x̂ = k + δx ∈ ℝ, и расчетное значение максимума получается путем подстановки δx в уравнение (Н.1). Коэффициент а, отрицательный для максимумов, указывает на резкость пика, что может быть полезно при определении того, является ли пик достаточно острым. Большое значение указывает на четко определенный острый пик, тогда как низкое указывает на очень широкий пик, для которого оценка уточненного пика может быть не такой точной. Продолжая предыдущий пример, мы можем использовать функцию Toolbox peak для оценки уточненных позиций пиков: >> [ymax,xmax] = peak(y, 'interp', 2) ymax = 0.9905 0.6718 -0.5799 xmax = 8.4394 24.7299 16.2438 где аргумент после опции 'interp' указывает, что должен быть подобран полином второго порядка. Подогнанная парабола показана красным цветом на рис. H.1b и будет построена, если задана опция 'plot'. Если сигнал имеет наложенный шум, вероятно, будет несколько пиков, многие из которых весьма незначительны, и от них можно избавиться, указав масштаб пика. Например, пиками, которые превышают все остальные значения в пределах ±5 значений в горизонтальном направлении, являются >> peak(y, 'scale', 5) ans = 0.9905 0.8730 0.6718 В этом случае результат не изменится, так как сигнал достаточно гладкий. Для двухмерного сигнала мы следуем аналогичной процедуре, но вместо этого используем параболоид z = ax2 + by2 + cx + dy + e, (H.3) 562 Приложение H имеющий пять коэффициентов, которые могут быть рассчитаны по центральному значению (дискретному максимуму) и его четырем соседям (север, юг, восток и запад) с использованием процедуры, аналогичной описанной выше. Смещение расчетного пика относительно центральной точки равно В этом случае коэффициенты a и b представляют остроту пика в направлениях x и y, а качество пика можно рассматривать как min(a, b). Двухмерный дискретный сигнал был загружен ранее из peakfit1: >> z z = -0.0696 0.0800 0.0400 0.0002 -0.0400 -0.0800 0.0348 0.2000 0.1717 0.2062 0.0917 0.0400 0.1394 0.3202 0.3662 0.8766 0.2862 0.1602 0.2436 0.4400 0.4117 0.4462 0.3317 0.2800 0.3480 0.5600 0.5200 0.4802 0.4400 0.4000 В этом небольшом примере ясно, что пик находится в элементе (3, 4) с использованием соглашения о координатах изображения, но программно его находят следующим образом: >> [zmax,i] = max(z(:)) zmax = 0.8766 i = 16 Максимум находится в 16-м элементе в порядке убывания Отсчет элементов строк , преобразуем порядковый номер в индексы массива: идет, начиная с 1 >> [y,x] = ind2sub(size(z), i) y = 4 x = 3 Мы можем получить эти данные более удобным способом, используя функцию peak2 Toolbox: >> [zpk,xy]=peak2(z) zpk = 0.8766 0.5600 в левом верхнем углу каждого столбца, затем обратно к началу следующего крайнего правого столбца. Определение пика 563 xy = 3 4 5 2 которая в данном случае вернула два локальных максимума, по одному на столбец возвращаемых переменных. Эта функция вернет все нелокальные максимумы, где размер локальной области задается параметром 'scale'. Что касается одномерного случая, то мы можем уточнить оценку пика: >> [zpk,xy]=peak2(z, 'interp') Warning: Peak at (5,2) too close to edge of image (Предупреждение: пик в (5,2) слишком близко к краю изображения) zpk = 0.8839 xy = 3.1090 3.9637 Здесь пик приходится на элемент с координатами (3.1090, 3.9637). Когда этот процесс применяется к данным изображения, он называется субпиксельной интерполяцией. Литература Achtelik MW (2014) Advanced closed loop visual navigation for micro aerial vehicles. Ph.D. thesis, ETH Zurich. Agrawal M, Konolige K, Blas M (2008) CenSurE: Center surround extremas for realtime feature detection and matching. In: Forsyth D, Torr P, Zisserman A (eds) Lecture notes in computer science. Computer Vision – ECCV 2008, vol 5305. Springer-Verlag, Berlin Heidelberg, pp 102–115. Agarwal P, Burgard W, Stachniss C (2014) Survey of geodetic mapping methods: Geodetic approaches to mapping and the relationship to graph-based SLAM. IEEE Robot Autom Mag 21(3):63–80. Altmann SL (1989) Hamilton, Rodrigues, and the quaternion scandal. Math Mag 62(5):291–308. Andersson RL (1989) Dynamic sensing in a ping-pong playing robot. IEEE T Robotic Autom 5(6): 728–739. Arandjelovio R, Zisserman A (2012) Three things everyone should know to improve object retrieval. In: IEEE Conference on Computer Vision and Pattern Recognition (CVPR). pp 2911–2918. Arun KS, Huang TS, Blostein SD (1987) Least-squares fitting of 2 3-D point sets. IEEE T Pattern Analysis 9(5):699–700. Azarbayejani A, Pentland AP (1995) Recursive estimation of motion, structure, and focal length. IEEE T Pattern Analyze 17(6):562–575. Bakthavatchalam M, Chaumette F, Tahri O (2015) An improved modelling scheme for photometric moments with inclusion of spatial weights for visual servoing with partial appearance/disappearance. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). pp 6037–6043. Baldridge AM, Hook SJ, Grove CI, Rivera G (2009) The ASTER spectral library version 2.0. Remote Sens Environ 113(4):711–715. Ballard DH (1981) Generalizing the Hough transform to detect arbitrary shapes. Pattern Recogn 13(2):111–122. Banks J, Corke PI (2001) Quantitative evaluation of matching methods and validity measures for stereo vision. Int J Robot Res 20(7):512–532. Bauer J, Sunderhauf N, Protzel P (2007) Comparing several implementations of two recently published feature detectors. In: IFAC Symposium on Intelligent Autonomous Vehicles (IAV). Toulouse. Bay H, Ess A, Tuytelaars T, Van Gool L (2008) Speeded-up robust features (SURF). Comput Vis Image Und 110(3):346–359. Benosman R, Kang SB (2001) Panoramic vision: Sensors, theory, and applications. Springer-Verlag, Berlin Heidelberg. Литература 565 Benson KB (ed) (1986) Television engineering handbook. McGrawHill, New York. Besl PJ, McKay HD (1992) A method for registration of 3-D shapes. IEEE T Pattern Analysis 14(2):239–256 . Bhat DN, Nayar SK (2002) Ordinal measures for image correspondence. IEEE T Pattern Analysis 20(4):415–423 . Bishop CM (2006) Pattern recognition and machine learning. Information science and statistics. Springer-Verlag, New York. Bolles RC, Baker HH, Marimont DH (1987) Epipolar-plane image analysis: An approach to determining structure from motion. Int J Comput Vision 1(1):7–55, Mar. Bolles RC, Baker HH, Hannah MJ (1993) The JISCT stereo evaluation. In: Image Understanding Workshop: proceedings of a workshop held in Washington, DC apr 18–21, 1993. Morgan Kaufmann, San Francisco, pp 263. Bouguet J-Y (2010) Camera calibration toolbox for MATLAB®. http://www.vision.caltech.edu/bou- guetj/calib_doc. Brady M, Hollerbach JM, Johnson TL, Lozano-Perez T, Mason MT (eds) (1982) Robot motion: Planning and control. MIT Press, Cambridge, Massachusetts. Broida TJ, Chandrashekhar S, Chellappa R (1990) Recursive 3-D motion estimation from a monocular image sequence. IEEE T Aero Elec Sys 26(4):639–656. Brown MZ, Burschka D, Hager GD (2003) Advances in computational stereo. IEEE T Pattern Analysis 25(8):993–1008. Bukowski R, Haynes LS, Geng Z, Coleman N, Santucci A, Lam K, Paz A, May R, DeVito M (1991) Robot hand-eye coordination rapid prototyping environment. In: Proc ISIR, pp 16.15–16.28. Buttazzo GC, Allotta B, Fanizza FP (1993) Mousebuster: A robot system for catching fast moving objects by vision. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Atlanta, pp 932–937. Calonder M, Lepetit V, Strecha C, Fua P (2010) BRIEF: Binary robust independent elementary features. In: Daniilidis K, Maragos P, Paragios N (eds) Lecture notes in computer science. Computer Vision – ECCV 2010, vol 6311. Springer-Verlag, Berlin Heidelberg, pp 778–792. Canny JF (1983) Finding edges and lines in images. MIT, Artificial Intelligence Laboratory, AI-TR- 720. Cambridge, MA. Canny J (1987) A computational approach to edge detection. In: Fischler MA, Firschein O (eds) Readings in computer vision: Issues, problems, principles, and paradigms. Morgan Kaufmann, San Francisco, pp 184–203. Chahl JS, Srinivasan MV (1997) Reflective surfaces for panoramic imaging. Appl Optics 31(36):8275–8285. Chatfield K, Lempitsky VS, Vedaldi A, Zisserman A (2011) The devil is in the details: An evaluation of recent feature encoding me­ 566 Литература thods. In: Proceedings of the British Machine Vision Conference 2011. 12 p. Chaumette F (1990) La relation vision-commande: Theorie et application et des taches robotiques. Ph.D. thesis, Universite de Rennes 1. Chaumette F (2004) Image moments: A general and useful set of features for visual servoing. IEEE T Robotic Autom 20(4):713–723. Chaumette F, Hutchinson S (2006) Visual servo control 1: Basic approaches. IEEE Robot Autom Mag 13(4):82–90. Chaumette F, Rives P, Espiau B (1991) Positioning of a robot with respect to an object, tracking it and estimating its velocity by visual servoing. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Seoul, pp 2248–2253. Chesi G, Hashimoto K (eds) (2010) Visual servoing via advanced numerical methods. Lecture notes in computer science, vol 401. Springer-Verlag, Berlin Heidelberg. Chiuso A, Favaro P, Jin H, Soatto S (2002) Structure from motion cau­ sally integrated over time. IEEE T Pattern Analysis 24(4):523–535. Colicchia G, Waltner C, Hopf M, Wiesner H (2009) The scallop’s eye – A concave mirror in the context of biology. Physics Education 44(2):175–179. Collewet C, Marchand E, Chaumette F (2008) Visual servoing set free from image processing. In: Proceedings of IEEE International Conference on Robotics and Automation (ICRA). pp 81–86. Commission Internationale de l’Eclairage (1987) Colorimetry, 2nd ed. Commission Internationale de L’Eclairage, CIE No 15.2. Corke PI (1994) High-performance visual closed-loop robot control. University of Melbourne, Dept. Mechanical and Manufacturing Engineering. http://eprints.unimelb.edu.au/archive/00000547/01/ thesis.pdf. Corke PI (1996b) Visual control of robots: High-performance visual servoing. Mechatronics, vol 2. Research Studies Press (John Wiley). Out of print and available at http://www.petercorke.com/ bluebook. Corke PI, Good MC (1992) Dynamic effects in high-performance visual servoing. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Nice, pp 1838–1843. Corke PI, Good MC (1996) Dynamic effects in visual closed-loop systems. IEEE T Robotic Autom 12(5):671–683. Corke PI, Dunn PA, Banks JE (1999) Frame-rate stereopsis using non-parametric transforms and programmable logic. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Detroit, pp 1928–1933. Corke PI, Strelow D, Singh S (2004) Omnidirectional visual odometry for a planetary rover. In: Proceedings of the International Conference on Intelligent Robots and Systems (IROS). Sendai, pp 4007–4012. Литература 567 Corke P, Lobo J, Dias J (2007) An introduction to inertial and visual sensing. Int J Robot Res 26(6): 519–535. Corke PI, Paul R, Churchill W, Newman P (2013) Dealing with shadows: Capturing intrinsic scene appearance for image-based outdoor localisation. In: Proceedings of the IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). pp 2085– 2092. Craig JJ (2005) Introduction to robotics: Mechanics and control, 3rd ed. Pearson/Prentice Hall, Upper Saddle River, New Jersey. Crone RA (1999) A history of color: The evolution of theories of light and color. Kluwer Academic, Dordrecht. Cummins M, Newman P (2008) FAB-MAP: Probabilistic localization and mapping in the space of appearance. Int J Robot Res 27(6):647. Cutting JE (1997) How the eye measures reality and virtual reality. Behav Res Meth Ins C 29(1):27–36. Daniilidis K, Klette R (eds) (2006) Imaging beyond the pinhole camera. Computational Imaging, vol 33. Springer-Verlag, Berlin Heidelberg. Dansereau DG (2014) Plenoptic signal processing for robust vision in field robotics. Ph.D. thesis, The University of Sydney. Davison AJ, Reid ID, Molton ND, Stasse O (2007) MonoSLAM: Realtime single camera SLAM. IEEE T Pattern Analysis 29(6):1052– 1067. Dellaert F, Seitz SM, Thorpe CE, Thrun S (2000) Structure from motion without correspondence. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. Hilton Head Island, SC, pp 557–564. DeMenthon D, Davis LS (1992) Exact and approximate solutions of the perspective-three-point problem. IEEE T Pattern Analysis 14(11):1100–1105. Deriche R, Giraudon G (1993) A computational approach for corner and vertex detection. Int J Comput Vision 10(2):101–124. DeWitt BA, Wolf PR (2000) Elements of photogrammetry (with applications in GIS). McGraw-Hill, New York. Dickmanns ED, Graefe V (1988a) Applications of dynamic monocular machine vision. Mach Vision Appl 1:241–261. Dijkstra EW (1959) A note on two problems in connexion with graphs. Numer Math 1(1):269–271. Dougherty ER, Lotufo RA (2003) Hands-on morphological image processing. Society of Photo-Optical Instrumentation Engineers (SPIE). Duda RO, Hart PE (1972) Use of the Hough transformation to detect lines and curves in pictures. Commun ACM 15(1):11–15. Espiau B, Chaumette F, Rives P (1992) A new approach to visual servoing in robotics. IEEE T Robotic Autom 8(3):313–326. Faugeras OD (1993) Three-dimensional computer vision: A geometric viewpoint. MIT Press, Cambridge, Massachusetts. 568 Литература Faugeras OD, Lustman F (1988) Motion and structure from motion in a piecewise planar environment. Int J Pattern Recogn 2(3): 485–508. Faugeras O, Luong QT, Papadopoulou T (2001) The geometry of multiple images: The laws that govern the formation of images of a scene and some of their applications. MIT Press, Cambridge, Massachusetts. Feddema JT (1989) Real time visual feedback control for hand-eye coordinated robotic systems. Purdue University. Feddema JT, Mitchell OR (1989) Vision-guided servoing with featu­ re-based trajectory generation. IEEE T Robotic Autom 5(5):691– 700. Feddema JT, Lee CSG, Mitchell OR (1991) Weighted selection of image features for resolved rate visual feedback control. IEEE T Robotic Autom 7(1):31–47. Felzenszwalb PF, Huttenlocher DP (2004) Efficient graph-based image segmentation. Int J Comput Vision 59(2):167–181. Fischler MA, Bolles RC (1981) Random sample consensus: A paradigm for model fitting with applications to image analysis and automated cartography. Commun ACM 24(6):381–395. Flusser J (2000) On the independence of rotation moment invariants. Pattern Recogn 33(9):1405–1410. Forstner W (1994) A framework for low level feature extraction. In: Ecklundh J-O (ed) Lecture notes in computer science. Computer Vision – ECCV 1994, vol 800. Springer-Verlag, Berlin Heidelberg, pp 383–394. Forstner W, Gulch E (1987) A fast operator for detection and precise location of distinct points, corners and centres of circular features. In: ISPRS Intercommission Workshop. Interlaken, pp 149– 155. Forsyth DA, Ponce J (2011) Computer vision: A modern approach, 2nd ed. Pearson, London. Fraundorfer F, Scaramuzza D (2012) Visual odometry: Part II – Matching, robustness, optimization, and applications. IEEE Robot Autom Mag 19(2):78–90. Freeman H (1974) Computer processing of line-drawing images. ACM Comput Surv 6(1):57–97. Friedman DP, Felleisen M, Bibby D (1987) The little LISPer. MIT Press, Cambridge, Massachusetts. Funda J, Taylor RH, Paul RP (1990) On homogeneous transforms, quaternions, and computational efficiency. IEEE T Robotic Autom 6(3):382–388. Geiger A, Roser M, Urtasun R (2010) Efficient large-scale stereo matching. In: Kimmel R, Klette R, Sugimoto A (eds) Computer vision - ACCV 2010: 10th Asian Conference on Computer Vision, Queenstown, New Zealand, November 8-12, 2010, revised selected papers, part I. Springer-Verlag, Berlin Heidelberg, pp 25–38. Литература 569 Gevers T, Gijsenij A, van de Weijer J, Geusebroek J-M (2012) Color in computer vision: Fundamentals and applications. John Wiley & Sons, Inc., Chichester. Geyer C, Daniilidis K (2000) A unifying theory for central panoramic systems and practical implications. In: Vernon D (ed) Lecture notes in computer science. Computer vision – ECCV 2000, vol 1843. Springer-Verlag, Berlin Heidelberg, pp 445–461. Glover A, Maddern W, Warren M, Reid S, Milford M, Wyeth G (2012) OpenFABMAP: An open source toolbox for appearance-based loop closure detection. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). pp 4730–4735. Gonzalez R, Woods R (2008) Digital image processing, 3rd ed. Prentice Hall, Upper Saddle River, New Jersey. Gonzalez R, Woods R, Eddins S (2009) Digital image processing using MATLAB, 2nd ed. Gatesmark Publishing. Gregory R (1997) Eye and brain, 5th ed. Princeton Science Library, Princeton University Press, Princeton, New Jersey, 296 p. Groves PD (2013) Principles of GNSS, inertial, and multisensor in­ tegrated navigation systems, 2nd ed. Artech House, Norwood, USA. Hager GD, Toyama K (1998) X Vision: A portable substrate for realtime vision applications. Comput Vis Image Und 69(1):23–37. Hansen P, Corke PI, Boles W (2010) Wide-angle visual feature matching for outdoor localization. Int J Robot Res 29(1-2):267–297. Harris CG, Stephens MJ (1988) A combined corner and edge detector. In: Proceedings of the Fourth Alvey Vision Conference. Manchester, pp 147–151. Hart PE (2009) How the Hough transform was invented [DSP history]. IEEE Signal Proc Mag 26(6):18–22. Hartley R, Zisserman A (2003) Multiple view geometry in computer vision. Cambridge University Press, New York. Harvey P (n.d.) ExifTool. http://www.sno.phy.queensu.ca/~phil/ exiftool. Hashimoto K (ed) (1993) Visual servoing. In: Robotics and automated systems, vol 7. World Scientific, Singapore. Hashimoto K, Kimoto T, Ebine T, Kimura H (1991) Manipulator control with image-based visual servo. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Seoul, pp 2267–2272. Herschel W (1800) Experiments on the refrangibility of the invisible rays of the sun. Phil Trans R Soc Lond 90:284–292. Hill J, Park WT (1979) Real time control of a robot with a mobile camera. In: Proceedings of the 9th ISIR, SME. Washington, DC. Mar, pp 233–246. Hirschmuller H (2008) Stereo processing by semiglobal matching and mutual information. IEEE Transactions on Pattern Analysis and Machine Intelligence 30(2):328–341. 570 Литература Horaud R, Canio B, Leboullenx O (1989) An analytic solution for the perspective 4-point problem. Comput Vision Graph 47(1):33–44. Horn BKP (1987) Closed-form solution of absolute orientation using unit quaternions. J Opt Soc Am A 4(4):629–642. Horn BKP, Hilden HM, Negahdaripour S (1988) Closed-form solution of absolute orientation using orthonormal matrices. J Opt Soc Am A 5(7):1127–1135. Hosoda K, Asada M (1994) Versatile visual servoing without knowledge of true Jacobian. In: Proceedings of the International Conference on Intelligent Robots and Systems (IROS). Munich, pp 186–193. Hu MK (1962) Visual pattern recognition by moment invariants. IRE T Inform Theor 8:179–187. Hua M-D, Ducard G, Hamel T, Mahony R, Rudin K (2014) Implementation of a nonlinear attitude estimator for aerial robotic vehicles. IEEE T Contr Syst T 22(1):201–213. Huang TS, Netravali AN (1994) Motion and structure from feature correspondences: A review. P IEEE 82(2):252–268. Humenberger M, Zinner C, Kubinger W (2009) Performance evaluation of a census-based stereo matching algorithm on embedded and multi-core hardware. In: Proceedings of the 19th International Symposium on Image and Signal Processing and Analysis (ISPA). pp 388–393. Hunt RWG (1987) The reproduction of colour, 4th ed. Fountain Press, Tolworth. Hunter RS, Harold RW (1987) The measurement of appearance. John Wiley & Sons, Inc., Chichester. Hutchinson S, Hager G, Corke PI (1996) A tutorial on visual servo control. IEEE T Robotic Autom 12(5):651–670. Ings S (2008) A natural history of seeing: The art and science of vision, 1st ed. W. W. Norton & Company, New York, 322 p. Jagersand M, Fuentes O, Nelson R (1996) Experimental evaluation of uncalibrated visual servoing for precision manipulation. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Albuquerque, NM, pp 2874–2880. Jazwinski AH (2007) Stochastic processes and filtering theory. Dover Publications, Mineola. Jebara T, Azarbayejani A, Pentland A (1999) 3D structure from 2D motion. IEEE Signal Proc Mag 16(3):66–84. Julier SJ, Uhlmann JK (2004) Unscented filtering and nonlinear estimation. P IEEE 92(3):401–422. Kaehler A, Bradski G (2016) Learning OpenCV: Computer vision in C++ with the OpenCV library. O’Reilly & Associates, Koln. Kelly R (1996) Robust asymptotically stable visual servoing of planar robots. IEEE T Robotic Autom 12(5):759–766. Kelly A (2013) Mobile robotics: Mathematics, models, and methods. Cambridge University Press, New York. Литература 571 Kelly R, Carelli R, Nasisi O, Kuchen B, Reyes F (2002a) Stable visual servoing of camera-in-hand robotic systems. IEEE-ASME T Mech 5(1):39–48. Kelly R, Shirkey P, Spong MW (2002b) Fixed-camera visual servo control for planar robots. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Washington, DC, pp 2643–2649. Klette R, Kruger N, Vaudrey T, Pauwels K, van Hulle M, Morales S, Kandil F, Haeusler R, Pugeault N, Rabe C (2011) Performance of correspondence algorithms in vision-based driver assistance using an online image sequence database. IEEE T Veh Technol 60(5):2012–2026. Koenderink JJ (1984) The structure of images. Biol Cybern 50(5):363– 370. Koenderink JJ (2010) Color for the sciences. MIT Press, Cambridge, Massachusetts. Kriegman DJ, Hager GD, Morse AS (eds) (1998) The confluence of vision and control. Lecture notes in control and information sciences, vol 237. Springer-Verlag, Berlin Heidelberg. Kuipers JB (1999) Quaternions and rotation sequences: A primer with applications to orbits, aeroespace and virtual reality. Princeton University Press, Princeton, New Jersey. Kummerle R, Grisetti G, Strasdat H, Konolige K, Burgard W (2011) g2o: A general framework for graph optimization. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). pp 3607–3613. Lam O, Dayoub F, Schulz R, Corke P (2015) Automated topometric graph generation from floor plan analysis. In: Proceedings of the Australasian Conference on Robotics and Automation. Australasian Robotics and Automation Association (ARAA). Lamport L (1994) LATEX: A document preparation system. User’s guide and reference manual. Addison-Wesley Publishing Company, Reading. Land EH, McCann J (1971) Lightness and retinex theory. J Opt Soc Am A 61(1):1–11. Land MF, Nilsson D-E (2002) Animal eyes. Oxford Animal Biology Series, Oxford University Press, Oxford, 234 p. Laussedat A (1899) La metrophotographie. Enseignement superieur de la photographie. Gauthier-Villars, 52 p. Leavers VF (1993) Which Hough transform? Comput Vis Image Und 58(2):250–264. Lepetit V, Moreno-Noguer F, Fua P (2009) EPnP: An accurate O(n) solution to the PnP problem. Int J Comput Vision 81(2):155–166. Li H, Hartley R (2006) Five-point motion estimation made easy. In: 18th International Conference on Pattern Recognition ICPR 2006. Hong Kong, pp 630–633. Li Y, Jia W, Shen C, van den Hengel A (2014) Characterness: An indicator of text in the wild. IEEE T Image Process 23(4):1666–1677. 572 Литература Lin Z, Zeman V, Patel RV (1989) On-line robot trajectory planning for catching a moving object. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). pp 1726– 1731. Lindeberg T (1993) Scale-space theory in computer vision. SpringerVerlag, Berlin Heidelberg. Lloyd J, Hayward V (1991) Real-time trajectory generation using blend functions. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Seoul, pp 784–789. Longuet-Higgins H (1981) A computer algorithm for reconstruction of a scene from two projections. Nature 293:133–135. Lowe DG (1991) Fitting parametrized three-dimensional models to images. IEEE T Pattern Analysis 13(5): 441–450. Lowe DG (2004) Distinctive image features from scale-invariant keypoints. Int J Comput Vision 60(2): 91–110. Lowry S, Sunderhauf N, Newman P, Leonard J, Cox D, Corke P, Milford M (2015) Visual place recognition: A survey. Robotics, IEEE Transactions on (99):1–19. Lucas SM (2005) ICDAR 2005 text locating competition results. In: Proceedings of the Eighth International Conference on Document Analysis and Recognition, ICDAR05. pp 80–84. Lucas BD, Kanade T (1981) An iterative image registration technique with an application to stereo vision. In: International joint conference on artificial intelligence (IJCAI), Vancouver, vol 2. http://ijcai.org/Past%20Proceedings/IJCAI-81-VOL-2/PDF/017. pdf, pp 674–679. Luong QT (1992) matrice fondamentale et autocalibration en vision par ordinateur. Ph.D. thesis, Universite de Paris-Sud, Orsay, France. Lynch KM, Park FC (2017) Modern robotics: Mechanics, planning, and control. Cambridge University Press, New York. Ma Y, Kosecka J, Soatto S, Sastry S (2003) An invitation to 3D. Sprin­ ger-Verlag, Berlin Heidelberg. Maimone M, Cheng Y, Matthies L (2007) Two years of visual odometry on the Mars exploration rovers. J Field Robotics 24(3):169–186. Makhlin AG (1985) Stability and sensitivity of servo vision systems. In: Proc 5th International Conference on Robot Vision and Sensory Controls - RoViSeC 5. IFS (Publications), Amsterdam, pp 79–89. Malis E (2004) Improving vision-based control using efficient second-order minimization techniques. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). pp 1843–1848. Malis E, Vargas M (2007) Deeper understanding of the homography decomposition for vision-based control. Research Report, RR-6303, Institut National de Recherche en Informatique et en Auto­matique (INRIA), 90 p, https://hal.inria.fr/inria-00174036v3/ document. Литература 573 Marey M, Chaumette F (2008) Analysis of classical and new visual servoing control laws. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Pasadena, pp 3244–3249. Mariottini GL, Prattichizzo D (2005) EGT for multiple view geometry and visual servoing: Robotics vision with pinhole and panoramic cameras. IEEE T Robotic Autom 12(4):26–39. Marr D (2010) Vision: A computational investigation into the human representation and processing of visual information. MIT Press, Cambridge, Massachusetts. Martin D, Fowlkes C, Tal D, Malik J (2001) A database of human segmented natural images and its application to evaluating segmentation algorithms and measuring ecological statistics. Proceedings of the 8th International Conference on Computer Vision, vol 2. pp 416–423. Matas J, Chum O, Urban M, Pajdla T (2004) Robust wide-baseline stereo from maximally stable extremal regions. Image Vision Comput 22(10):761–767. Matthies L (1992) Stereo vision for planetary rovers: Stochastic modeling to near real-time implementation. Int J Comput Vision 8(1):71–91. McLauchlan PF (1999) The variable state dimension filter applied to surface-based structure from motion. University of Surrey, VSSPTR-4/99. Miausi’k B, Pajdla T (2003) Estimation of omnidirectional camera model from epipolar geometry. In: IEEE Conference on Computer Vision and Pattern Recognition, vol 1. Madison, pp 485–490. Mikolajczyk K, Schmid C (2004) Scale and affine invariant interest point detectors. Int J Comput Vision 60(1):63–86. Mikolajczyk K, Schmid C (2005) A performance evaluation of local descriptors. IEEE T Pattern Analysis 27(10):1615–1630. Mindell DA (2008) Digital Apollo. MIT Press, Cambridge, Massachusetts. Molton N, Brady M (2000) Practical structure and motion from stereo when motion is unconstrained. Int J Comput Vision 39(1):5–23. Moravec H (1980) Obstacle avoidance and navigation in the real world by a seeing robot rover. Ph.D. thesis, Stanford University. Nayar SK (1997) Catadioptric omnidirectional camera. In: Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. Los Alamitos, CA, pp 482–488. Neilson S (2011) Robot nation: Surviving the greatest socio-economic upheaval of all time. Eridanus Press, New York, 124 p. Newcombe RA, Lovegrove SJ, Davison AJ (2011) DTAM: Dense tracking and mapping in real-time. In: Proceedings of the International Conference on Computer Vision, pp 2320–2327. Niblack W (1985) An introduction to digital image processing. Strandberg Publishing Company Birkeroed, Denmark. 574 Литература Nilsson NJ (1971) Problem-solving methods in artificial intelligence. McGraw-Hill, New York. Nister D (2003) An efficient solution to the five-point relative pose problem. In: IEEE Conference on Computer Vision and Pattern Recognition, vol 2. Madison, pp 195–202. Nister D, Naroditsky O, Bergen J (2006) Visual odometry for ground vehicle applications. J Field Robotics 23(1):3–20. Nixon MS, Aguado AS (2012) Feature extraction and image processing, 3rd ed. Academic Press, London Oxford. Noble JA (1988) Finding corners. Image Vision Comput 6(2):121-128. Okutomi M, Kanade T (1993) A multiple-baseline stereo. IEEE T Pattern Analysis 15(4):353–363. Ollis M, Herman H, Singh S (1999) Analysis and design of panoramic stereo vision using equi-angular pixel cameras. Robotics Institute, Carnegie Mellon University, CMU-RI-TR-99-04, Pittsburgh, PA. Otsu N (1975) A threshold selection method from gray-level histograms. Automatica 11:285–296. Papanikolopoulos NP, Khosla PK (1993) Adaptive robot visual tracking: Theory and experiments. IEEE T Automat Contr 38(3):429– 445. Papanikolopoulos NP, Khosla PK, Kanade T (1993) Visual tracking of a moving target by a camera mounted on a robot: A combination of vision and control. IEEE T Robotic Autom 9(1):14–35. Parker A (2004) In the blink of an eye: How vision sparked the big bang of evolution. Basic Books, New York, 336 p. Paul R (1972) Modelling, trajectory calculation and servoing of a computer controlled arm. Ph.D. thesis, technical report AIM-177, Stanford University. Paul R (1979) Manipulator Cartesian path control. IEEE T Syst Man Cyb 9:702–711. Paul RP (1981) Robot manipulators: Mathematics, programming, and control. MIT Press, Cambridge, Massachusetts. Piepmeier JA, McMurray G, Lipkin H (1999) A dynamic quasi-Newton method for uncalibrated visual servoing. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Detroit, pp 1595–1600. Pilu M (1997) A direct method for stereo correspondence based on singular value decomposition. In: Proceedings of the Computer Vision and Pattern Recognition, IEEE Computer Society, San Juan, pp 261–266. Pock T (2008) Fast total variation for computer vision. Ph.D. thesis, Graz University of Technology. Pollefeys M, Nister D, Frahm JM, Akbarzadeh A, Mordohai P, Clipp B, Engels C, Gallup D, Kim SJ, Merrell P, et al. (2008) Detailed realtime urban 3D reconstruction from video. Int J Comput Vision 78(2):143–167, Jul. Литература 575 Posner I, Corke P, Newman P (2010) Using text-spotting to query the world. In: IEEE/RSJ International Conference on Intelligent Robots and Systems (IROS). IEEE, pp 3181–3186. Poynton CA (2012) Digital video and HD algorithms and interfaces. Morgan Kaufmann, Burlington. Press WH, Teukolsky SA, Vetterling WT, Flannery BP (2007) Numerical recipes, 3rd ed. Cambridge University Press, New York. Prince SJ (2012) Computer vision: Models, learning, and inference. Cambridge University Press, New York. Pynchon T (2006) Against the day. Jonathan Cape, London. Rives P, Chaumette F, Espiau B (1989) Positioning of a robot with respect to an object, tracking it and estimating its velocity by visual servoing. In: Hayward V, Khatib O (eds) Lecture notes in control and information sciences. Experimental robotics I, vol 139. Springer-Verlag, Berlin Heidelberg, pp 412–428. Rizzi AA, Koditschek DE (1991) Preliminary experiments in spatial robot juggling. In: Chatila R, Hirzinger G (eds) Lecture notes in control and information sciences. Experimental robotics II, vol 190. Springer-Verlag, Berlin Heidelberg, pp 282–298. Rosenfield GH (1959) The problem of exterior orientation in photogrammetry. Photogramm Eng 25(4):536–553. Rosten E, Porter R, Drummond T (2010) FASTER and better: A machine learning approach to corner detection. IEEE T Pattern Analysis 32:105–119. Russell S, Norvig P (2009) Artificial intelligence: A modern approach, 3rd ed. Prentice Hall Press, Upper Saddle River, NJ. Sakaguchi T, Fujita M, Watanabe H, Miyazaki F (1993) Motion planning and control for a robot performer. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Atlanta, May, pp 925–931. Salvi J, Matabosch C, Fofi D, Forest J (2007) A review of recent range image registration methods with accuracy evaluation. Image Vision Comput 25(5):578–596. Samson C, Espiau B, Le Borgne M (1990) Robot control: The task function approach. Oxford University Press, Oxford. Scaramuzza D, Fraundorfer F (2011) Visual odometry [tutorial]. IEEE Robot Autom Mag 18(4):80–92. Scharstein D, Pal C (2007) Learning conditional random fields for stereo. In: IEEE Computer Society Conference on Computer Vision and Pattern Recognition (CVPR 2007). Minneapolis, MN. Scharstein D, Szeliski R (2002) A taxonomy and evaluation of dense two-frame stereo correspondence algorithms. Int J Comput Vision 47(1):7–42. Shi J, Tomasi C (1994) Good features to track. In: Proceedings of the Computer Vision and Pattern Recognition. IEEE Computer Society, Seattle, pp 593–593. 576 Литература Shih FY (2009) Image processing and mathematical morphology: Fundamentals and applications, CRC Press, Boca Raton. Shirai Y (1987) Three-dimensional computer vision. Springer-Verlag, New York. Shirai Y, Inoue H (1973) Guiding a robot by visual feedback in assembling tasks. Pattern Recogn 5(2):99–106. Shoemake K (1985) Animating rotation with quaternion curves. In: Proceedings of ACM SIGGRAPH, San Francisco, pp 245–254. Siciliano B, Sciavicco L, Villani L, Oriolo G (2009) Robotics: Modelling, planning and control. SpringerVerlag, Berlin Heidelberg. Sivic J, Zisserman A (2003) Video Google: A text retrieval approach to object matching in videos. In: Proceedings of the Ninth IEEE International Conference on Computer Vision. pp 1470–1477. Skaar SB, Brockman WH, Hanson R (1987) Camera-space manipulation. Int J Robot Res 6(4):20–32. Skofteland G, Hirzinger G (1991) Computing position and orientation of a freeflying polyhedron from 3D data. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Seoul, pp 150–155. Smith R (2007) An overview of the Tesseract OCR engine. In: 9th International Conference on Document Analysis and Recognition (ICDAR). pp 629–633. Spong MW, Hutchinson S, Vidyasagar M (2006) Robot modeling and control, 2nd ed. John Wiley & Sons, Inc., Chichester. Srinivasan VV, Venkatesh S (1997) From living eyes to seeing machines. Oxford University Press, Oxford. Steinvall A (2002) English colour terms in context. Ph.D. thesis, Ume Universitet. Stone JV (2012) Vision and brain: How we perceive the world, 1st ed. The MIT Press, Cambridge, 264 p. Strasdat H (2012) Local accuracy and global consistency for efficient visual SLAM. Ph.D. thesis, Imperial College London. Strelow D, Singh S (2004) Motion estimation from image and inertial measurements. Int J Robot Res 23(12):1157–1195. Sunderhauf N (2012) Robust optimization for simultaneous localization and mapping. Ph.D. thesis, Technische Universitat Chemnitz. Sussman GJ, Wisdom J, Mayer ME (2001) Structure and interpretation of classical mechanics. MIT Press, Cambridge, Massachusetts. Sutherland IE (1974) Three-dimensional data input by tablet. P IEEE 62(4):453–461. Svoboda T, Pajdla T (2002) Epipolar geometry for central catadioptric cameras. Int J Comput Vision 49(1):23–37. Szeliski R (2011) Computer vision: Algorithms and applications. Springer-Verlag, Berlin Heidelberg. Tahri O, Chaumette F (2005) Point-based and region-based image moments for visual servoing of planar objects. IEEE T Robotic Autom­21(6):1116–1127. Литература 577 Taylor RA (1979) Planning and execution of straight line manipulator trajectories. IBM J Res Dev 23(4):424–436. ter Haar Romeny BM (1996) Introduction to scale-space theory: Multiscale geometric image analysis. Utrecht University. Tissainayagam P, Suter D (2004) Assessing the performance of corner detectors for point feature tracking applications. Image Vision Comput 22(8):663–679. Titterton DH, Weston JL (2005) Strapdown inertial navigation technology. IEE Radar, Sonar, Navigation and Avionics Series, vol 17, The Institution of Engineering and Technology (IET), 576 p. Tomasi C, Kanade T (1991) Detection and tracking of point features. Carnegie Mellon University, CMU-CS-91-132. Triggs B, McLauchlan P, Hartley R, Fitzgibbon A (2000) Bundle adjustment - A modern synthesis. Lecture notes in computer science. Vision algorithms: theory and practice, vol 1883. SpringerVerlag, Berlin Heidelberg, pp 153–177. Valgren C, Lilienthal AJ (2010) SIFT, SURF & seasons: Appearancebased long-term localization in outdoor environments. Robot Auton Syst 58(2):149–156. Warren M (2015) Long-range stereo visual odometry for unmanned aerial vehicles. Ph.D. thesis, Queensland University of Techno­ logy. Weiss LE (1984) Dynamic visual servo control of robots: An adaptive image-based approach. Ph.D. thesis, technical report CMURI-TR-84-16, Carnegie-Mellon University. Weiss L, Sanderson AC, Neuman CP (1987) Dynamic sensor-based control of robots with visual feedback. IEEE T Robotic Autom 3(1):404–417. Westmore DB, Wilson WJ (1991) Direct dynamic control of a robot using an end-point mounted camera and Kalman filter position estimation. In: Proceedings of the IEEE International Conference on Robotics and Automation (ICRA). Seoul, Apr, pp 2376–2384. Wilburn B, Joshi N, Vaish V, Talvala E-V, Antunez E, Barth A, Adams A, Horowitz M, Levoy M (2005) High performance imaging using large camera arrays. ACM Transactions on Graphics (TOG) - Proceedings of ACM SIGGRAPH 2005 24(3):765–776. Wolf PR (1974) Elements of photogrammetry. McGraw-Hill, New York. Woodfill J, Von Herzen B (1997) Real-time stereo vision on the PARTS reconfigurable computer. In: Proceedings of the IEEE Symposium on FPGAs for Custom Computing Machines, Grenoble. pp 201–210. Xu G, Zhang Z (1996) Epipolar geometry in stereo, motion, and object recognition: A unified approach. Springer-Verlag, Berlin Heidelberg. Ying X, Hu Z (2004) Can we consider central catiodioptric cameras and fisheye cameras within a unified imaging model. In: Pajdla T, 578 Литература Matas J (eds) Lecture notes in computer science. Computer vision – ECCV 2004, vol 3021. Springer-Verlag, Berlin Heidelberg, pp 442–455. Zabih R, Woodfill J (1994) Non-parametric local transforms for computing visual correspondence. In: Ecklundh J-O (ed) Lecture notes in computer science. Computer Vision - ECCV 1994, vol 800. Springer-Verlag, Berlin Heidelberg, pp 151–158. Zhang Z, Faugeras O, Kohonen T, Hunag TS, Schroeder MR (1992) Three D-dynamic scene analysis: A stereo based approach. Springer-Verlag, New York. Предметный указатель А Аберрация сферическая, 334 хроматическая, 334 Аккомодация, 321 Алгоритм Левенберга–Марквардта, 548 Ниблэка, 258 MSER, 259 Анаглифное изображение, 434 Апертура, 323 Астигматизм, 334 Б Балансировка белого, 158 Блоб, 265 Блокировка подвеса, 83 Восприятие, 38 Входной зрачок, 339 Вычислительная фотография, 379 Г Гамма-коррекция, 162 Гессиан, 538 Гистограмма, 190 кумулятивная, 190 Глубина резкости, 324 Гомография, 404 Градиентный спуск, 546 Граф, 555 вершина, 555 ориентированный, 57 ребро, 555 Д В Вектор, 53 единичный, 500 координатный, 53, 500 Плюккера, 510 нормали, 86 ориентации, 86 подхода, 86 связанный, 53 смещения, 527 собственный, 504 состояния, 550 Векторное пространство, 499 Видение, 124 Визуальное слово, 464 Винтовое движение, 97 момент, 97 ось винта, 104 шаг, 97 Дальтонизм, 138 Движение твердого тела, 67 Действие, 37 Дескриптор признака, 385 Детектор Нобля, 297 Харриса, 296 Ши–Томаси, 296 Деформация изображения, 239 Диафрагма, 323 Дилатация, 226 Диспаратность, 418 Дисторсия, 334 бочкообразная, 335 геометрическая, 334 подушкообразная, 335 радиальная, 334 тангенциальная, 335 Дополнение Шура, 554 580 Предметный указатель Е Единичный поворот, 72 З Закон Бера, 129 Грассмана, 141 смещения Вина, 127 Стефана–Больцмана, 127 Зарядовый колодец, 182 Зрение компьютерное, 33 машинное, 33 роботизированное, 33 Зрительная ямка, 31 И Идеальная точка, 524 Извлечение признаков, 124 Именованное число, 53 Инерциальный измерительный блок, 84 Исправление изображения, 435 Итерация Гаусса–Ньютона, 547 К Калибровка камеры, 337 Камера гиперспектральная, 169 инфракрасная, 169 катадиоптрическая, 349 светового поля, 362 ультрафиолетовая, 169 Камера-обскура, 320 Касательное пространство, 531 Квадрика, 365, 526 Клейна, 525 Кватернион, 91 произведение Гамильтона, 92 Кембрийский взрыв, 30 Классификация, 254 бинарная, 254 Код зазоров, 280 Коллинеация, 527 Колориметрия, 170 Компетенции, 32 Коника, 323, 514 Координаты однородные, 324 плоскости изображения сетчатки, 324 Корреляция, 201 Краевой сегмент, 292 Круглость, 282 Круг нерезкости, 324 Кручение, 71, 534 Кубикс, 540 Л Левообобщенное обращение, 543 Линия, 287 каустическая, 351 фронто-параллельная, 323 Локальная аппроксимация, 537 М Манхеттенское расстояние, 500 Математическая морфология, 225 Матрица автокорреляции, 296 взаимодействия, 369 калибровочная, 329 кососимметричная, 502 кофакторов, 502 неполного ранга, 506 нормальная, 503 нуль-пространство, 506 определитель, 63 ортогональная, 503 ортонормированная, 63, 503 особое значение, 507 проекции, 325 проекционная, 329 след, 505 сопряженная, 502 спектр, 504 существенная, 396 фундаментальная, 393 чувствительности, 369 ядро, 506 Якоби, 539 Метамеры, 137 Метод Ньютона, 547 Предметный указатель 581 Ньютона–Рафсона, 545 Мешок слов, 463 Мозаика, 459 Момент, 72 прямой, 510 Н Насыщенность, 142, 148 Начало координат, 53, 60 Нуль-пространство, 373 О Облако точек, 447 Обработка изображений, 32, 174 Обратная проекция, 438 ошибка, 438 Одометрия, 471 визуальная, 471 Окклюзия, 265 Окружение, 37 Оператор края Кэнни, 211 Моравека, 294 Операции с изображениями диадические, 195 монадические, 192 Опорная область, 305 точка, 294 Опсин, 134 Оптический поток, 372, 472 Ортогональная группа, 503 Ортофотоплан, 462 Ортофотоснимок, 462 Отражательная способность, 34, 125 Отражение зеркальное, 130 ламбертово, 130, 161 френелевское, 161 Оттенок, 148 П Пакетная подстройка, 438 Параболоид, 561 Перемещение вращательное, 71 твердого тела, 94 Планковский источник. См. Черное тело Поле зрения, 330 Положение, 49, 53 композиция, 55 Полосовой фильтр, 211 Полюс трансформации, 72 Пороговая бинаризация, 255 Правило правой руки, 73 Преобразование аффинное, 527 евклидово, 528 подобия, 504 проективное, 527 прокрустово, 528 Хафа, 289 Признаки, 251 извлечение, 251 Проекция перспективная, 319 слабая, 368 Производная гауссиана, 210 Прямая, 509 идеальная, 510 Прямое линейное преобразование, 377 Псевдообращение, 543 Р Раксель, 363 Ранг столбцовый, 506 строковый, 506 Распознавание образов, 33 Расстояние евклидово, 55 Махалонобиса, 508 Реконструкция аффинная, 446 метрическая, 446 проективная, 446 пространственная, 430 Ретиналь, 134 Робот, 37 мобильный, 40 полевой, 40 производственный, 39 сервисный, 40 582 Предметный указатель телеробот, 40 человекоподобный, 40 Робототехника, 37 С Свертка, 201 Светимость, 132 Световая мощность, 133 Сегментация изображения, 252 Сенсор активный, 37 динамический диапазон, 184 квантовая эффективность, 182 пассивный, 37 проприоцептивный, 38 экстероцептивный, 38 Сингулярность, 83 Система координат, 49 декартова, 53 правая, 73 Скаляр, 53 Совмещение признаков, 384 Согласование тона, 462 Спекл-проектор, 455 Спектральное распределение мощности, 171 Стабилизированный элемент, 84 Стандартная выходная чувствительность, 183 Стандартный дневной свет, 155 Стереографическая проекция, 356 Стереозрение, 34, 383, 411 плотное, 416 разреженное, 411 Стереопсис, 416 Стимул равной энергии, 155 Стоп-слово, 466 Структурированный свет, 453 Структурирующий элемент, 225 Субпиксельная интерполяция, 563 Сумма абсолютных разностей, 216 квадратов разностей, 216 Сферическая камера, 352 Теорема вращения Эйлера, 74 Теория интромиссии, 336 Паркера, 30 противоположных цветов, 135 ретинекса, 156 трехкомпонентного цвета, 135 экстроэмиссии, 125 эмиссии, 336 Точка, 509 главная, 322 привязки, 460 сопряженная, 391 схода, 322 Трехмерная реконструкция. См. Триангуляция Триангуляция, 383 Трилобит, 30 Тристимулус, 136 Трихроматический баланс, 140 У Углы Кардано, 81 морские, 82 Тейта-Брайана, 82 Уравнение тонкой линзы, 321 Ф Формула вращения Родригеса, 89 Ху, 281 Фотограмметрия, 376 Фотометрия, 169 Фототопическая яркость, 132 Фотоячейка, 134, 326 аддитивный шум, 182 коэффициент заполнения, 182 темновой ток, 182 Функция пленоптическая, 362 цветового баланса, 140 Т Х Тензор структуры, 296 Хромакей, 196 Предметный указатель 583 Ц Э Цвет, 132 Цветность, 149 Цветовая палитра, 144 Цветовая температура, 155 Цель, 37 Цепной код, 280 Фримена, 280 Эквивалентный эллипс, 274 Эпиполярная плоскость, 391 Эрозия, 226 Эффект частокола, 422 Ч Черное тело, 126 Ш Шаблон Байера, 136 Я Якобиан. См. Матрица Якоби изображения, 369 Книги издательства «ДМК ПРЕСС» можно купить оптом и в розницу в книготорговой компании «Галактика» (представляет интересы издательств «ДМК ПРЕСС», «СОЛОН ПРЕСС», «КТК Галактика»). Адрес: г. Москва, пр. Андропова, 38, оф. 10; тел.: (499) 782-38-89, электронная почта: [email protected]. При оформлении заказа следует указать адрес (полностью), по которому должны быть высланы книги; фамилию, имя и отчество получателя. Желательно также указать свой телефон и электронный адрес. Эти книги вы можете заказать и в интернет-магазине: http://www.galaktika-dmk.com/. Питер Корк Машинное зрение. Основы и алгоритмы с примерами на Matlab Главный редактор Мовчан Д. А. [email protected] Зам. главного редактора Перевод Корректор Верстка Дизайн обложки Сенченкова Е. А. Яценков В. С. Абросимова Л. А. Чаннова А. А. Мовчан А. Г. Гарнитура PT Serif. Печать цифровая. Усл. печ. л. 47,45. Тираж 200 экз. Веб-сайт издательства: www.dmkpress.com