19 апреля 2017 мы выпустили обновление PhotoScan, нашего мобильного приложения для iOS и Android, позволяющего оцифровывать бумажные фотографии одним только смартфоном. Одна из ключевых особенностей PhotoScan – возможность удалять блики с фотографий (их часто печатают на глянцевой, хорошо отражающей свет бумаге), а также со страниц пластиковых альбомов или фотографий под стеклом. Для этого мы разработали уникальное сочетание компьютерного зрения и технологии обработки изображений, которые могут точно совместить и скомбинировать несколько немного отличающихся снимков фотографии и отделить блик от самого изображения на фото.
По одному снимку очень сложно автоматически определить, какие участки изображения – это оригинальное фото, а какие – блик. Более того, блик может засветить участки фото, из-за чего будет невозможно восстановить ту его часть, что скрыта под бликом. Но если сделать несколько снимков фотографии, передвигая камеру, расположение блика меняется – он перемещается по разным участкам фото. В большинстве случаев каждый отдельный пиксель окажется не под бликом хотя бы на одном из снимков. И хотя ни один из снимков не будет лишён блика, мы можем скомбинировать несколько снимков распечатанного фото, сделанных под разными углами, и таким образом удалить блик. Сложность в том, что изображения необходимо очень точно совместить, чтобы они правильно комбинировались, и эта обработка должна выполняться на смартфоне достаточно быстро, чтобы получить эффект почти мгновенного результата.
Наша технология вдохновлялась нашей предыдущей работой, опубликованной на SIGGRAPH 2015, которую мы назвали «фотографированием без помех» [obstruction-free photography]. Она использует схожие принципы для удаления различных помех из поля зрения. Но первоначальный алгоритм был основан на порождающей модели, в которой оценивались движение и внешний вид основной сцены и помехи. Возможности этой модели велики, и она способна удалять самые разные помехи – но она слишком затратна с вычислительной точки зрения, чтобы её можно было использовать на смартфонах. Поэтому мы разработали упрощённую модель, относящуюся к блику как к некоей аномалии, и пытающуюся распознать лежащее под ним изображение. И хотя модель упрощена, это всё ещё очень сложная задача – распознавание должно быть точным и надёжным.
Как это работает
Мы начинаем с набора снимков фотографии, сделанных пользователем, передвигавшим камеру. Первый снимок – «опорный кадр» – определяет желаемый конечный вид снимка. Затем пользователю рекомендуют сделать четыре дополнительных снимка. В каждом кадре мы определяем ключевые точки (подсчитываем свойства ORB на углах, определённых при помощи алгоритма Харриса) и используем их для определения гомографий, сопоставляющих каждый последующий кадр с опорным.
Технология кажется прямолинейной, но у неё есть подвох – гомографии способны сопоставлять только плоские изображения. Но бумажные фотографии часто не плоские (как в примере вверху). Мы используем оптический поток – фундаментальное представление движения в компьютерном зрении, устанавливающее попиксельное соответствие между двумя изображениями, корректирующее отклонения от плоскости. Мы начинаем с кадров, выровненных при помощи гомографии, и подсчитываем «поля потоков» для выпрямления изображений и дальнейшей корректировки. Обратите внимание, как в примере ниже углы левой фотографии немного «двигаются» после определения кадров при помощи одной лишь гомографии. Справа видно, как фото лучше выровнялось после применения оптического потока.
Разница не сильно бросается в глаза, но ощутимо влияет на конечный результат. Обратите внимание, как небольшие несоответствия проявляют себя в виде дублированных фрагментов изображения, и как эти огрехи устраняются путём дополнительного уточнения при помощи потоков.
И в данном случае сложность была в том, чтобы заставить изначально медленно работающий алгоритм оптического потока быстрее работать на смартфоне. Вместо традиционного подсчёта потока для каждого пикселя (количество векторов равно количеству пикселей), мы строим поле потока по меньшему количеству контрольных точек, и записываем движение каждого пикселя в изображении как функцию движения контрольных точек. А именно, мы делим каждое изображение на непересекающиеся ячейки, формирующие крупнозернистую решётку, и представляем поток пикселя в отдельной ячейке как билинейную комбинацию потока и четырёх углов ячейки, его содержащей.
Тогда остаётся решить более простую задачу, поскольку количество векторов потока теперь равно количеству точек решётки, которых обычно сильно меньше, чем пикселей. Этот процесс схож с обработкой изображений при помощи сплайнов. С этим алгоритмом мы смогли уменьшить время вычисления оптического потока на телефоне Pixel примерно в 40 раз!
Наконец, чтобы создать итоговое изображение без блика, для каждого участка кадра мы берём значения пикселей и вычисляем «мягкий минимум», чтобы найти самый тёмный из вариантов. Конкретно, мы вычисляем ожидаемую минимальную яркость по имеющимся кадрам, и назначаем меньшие веса пикселям, находящимся ближе к изогнутым краям изображений. Мы используем этот метод вместо прямого вычисления минимума из-за того, что у одних и тех же пикселей в разных кадрах яркость может различаться. Попиксельный минимум может привести к появлению видимых стыков из-за резких изменений интенсивности на границах накладывающихся изображений.
Алгоритм способен работать в различных условиях сканирования – матовые и глянцевые фотографии, фотографии в альбомах и без них, обложки журналов.
Для подсчёта итогового результата наша команда разработала метод, автоматически определяющий границы изображения и приводящий его к прямоугольному виду. Из-за искажений перспективы отсканированное прямоугольное фото обычно превращается в непрямоугольный четырёхугольник. Метод анализирует сигналы изображений, цвет, края, чтобы выяснить, где проходят точные границы оригинального фото, а затем применяет геометрические преобразования для выпрямления изображения. В результате получается высококачественная цифровая версия бумажной фотографии без бликов.
В общем, много чего происходит под капотом, и всё это почти мгновенно работает на вашем телефоне! Попробовать PhotoScan можно, скачав версию приложения для Android или iOS.
Автор: SLY_G