Как можно выровнять изображение страницы, чтобы оно выглядело так, как если бы оно было отсканировано?

Я видел приложения и задавался вопросом, как я могу программно сфотографировать изображение. Определите, как его нужно преобразовать, чтобы он выглядел параллельно камере и не перекашивался в перспективе.

Затем объедините несколько фотографий, чтобы создать файл PDF. Например, это приложение делает это: https://play.google.com/store/apps/details?id=com.appxy.tinyscan&hl=en


person Muhammad Umer    schedule 09.02.2017    source источник
comment
docs.opencv.org/trunk/da/d6e/   -  person Muhammad Umer    schedule 09.02.2017
comment
см. представление OpenCV Birdseye без потери данных, поэтому найдите краевые точки и используйте билинейную или бикубическую интерполяцию для выпрямления изображения   -  person Spektre    schedule 10.02.2017
comment
это было так высоко над моей головой, визуально я могу сказать, что происходит, но довольно потерян. Любая книга, которую вы порекомендуете, введет меня в курс дела.   -  person Muhammad Umer    schedule 11.02.2017


Ответы (1)


Я не использую книги для таких тривиальных вещей, поэтому, к сожалению, не могу ничего порекомендовать (особенно на английском языке). Что вам нужно сделать, так это:

контрольные точки

  1. введите изображение
  2. найти основные контуры

    в идеале целая сетка, но будет достаточно даже внешнего контура (в случае отсутствия сетки). Вам нужно разделить контур на горизонтальные (красные) и вертикальные (зеленые) кривые (или набор точек).

  3. примеры контурных кривых по 4 "равноудаленным" точкам

    так как изображение искажено (а не просто повернуто), то нам нужно использовать как минимум бикубическую интерполяцию. Для этого нам нужно 16 очков (Аква) на патч.

  4. добавьте зеркальные точки, чтобы покрыть всю сетку

    на изображении зеркальные (Желтые) точки только для горизонтальных контуров это надо сделать и для вертикальных контуров (мне не подошло по изображению и не хотел увеличивать разрешение только из-за этого) а также для угловых точек так что получилось 6x6 контрольные точки. Зеркало можно сделать линейным (как это сделал я).

Теперь преобразование выполняется следующим образом:

  1. Обработать все пиксели dst(x0,y0) целевого изображения
  2. Обрабатывать x,y как параметр кубической интерполяции

    если xs,ys является целевым разрешением изображения, то:

    u=(3.0*x)/xs
    v=(3.0*y)/ys
    

    Теперь кубическая интерполяция обычно выполняется по параметру t=<0.0,1.0), поэтому
    если u=<0.0,1.0> используйте t=u и контрольные точки 0,1,2,3.
    если u=<1.0,2.0) используйте t=u-1.0 и контрольные точки 1,2,3,4
    если u=<2.0,3.0> используйте t=u-2.0 и контрольные точки 2,3,4,5

    То же самое касается вертикальных контуров и v. Вычислите xi,yi как бикубическую интерполяцию (u,v). И копируем пиксель:

    dst(x,y)=src(xi,yi);
    

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

    Идея бикубической интерполяции проста. вычислить точку, соответствующую параметру u, на 4-х горизонтальных контурах. Это даст вам 4 контрольные точки для окончательной кубической интерполяции в вертикальном направлении и v в качестве параметра. Полученная координата — это ваша исходная позиция в пикселях.

Для получения дополнительной информации см.:

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

person Spektre    schedule 11.02.2017
comment
Я вернусь с любым вопросом через 2 дня, это много для меня, так что терпите меня. - person Muhammad Umer; 11.02.2017
comment
Я уже задавал этот вопрос, и никто не мог на него ответить. Это не тривиально, я бы прошел 6-месячный курс, а потом почувствовал бы себя комфортно. - person Muhammad Umer; 11.02.2017
comment
Я веб-разработчик, если вы написали об этом книгу, я куплю ее. Что-то, что переводит начинающего программиста с простого английского на продвинутые концепции обработки изображений, подобные этому. - person Muhammad Umer; 11.02.2017
comment
@MuhammadUmer Это не продвинутый материал, а сочетание основ CV / DIP и графических принципов низкого уровня. Проблема в том, что большинство программистов в этой области специализируются в своей узкой области и поэтому не видят связи с другими... даже если у них есть базовые знания. Написание такой книги заняло бы от 6 до 12 месяцев, у меня нет на это ни времени, ни желания, ни настроения, не говоря уже о необходимых средствах. Я перестал публиковаться некоторое время назад. Также должно быть много таких книг, некоторые даже онлайн, так что просто погуглите для Компьютерного зрения и Компьютерной графики. - person Spektre; 12.02.2017