2017-02-17 15 views
1

Возьмем следующий отсканированное изображение в качестве примера:Как найти поворот документа?

enter image description here

Глядя на границах, вы можете ясно видеть, что она слегка повернута влево. Как определить количество этого вращения? (Чтобы исправить его)

Обнаружение края «выделит» границу, но, кроме попыток многократного вращения и построения x-/y-гистограммы, я не знаю, как использовать эту информацию. Итеративный подход, по-видимому, является более вычислительным, чем это необходимо для такой простой задачи.

Я ищу псевдокод/​​алгоритмическую идею. Поэтому я не задавал этот вопрос языком программирования. Однако, если вы хотите дать код, я предпочитаю Python.

ответ

1

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

  1. извлечь все (параметрические) строки в документе с помощью Hough transform ,
  2. Классифицируйте линии как по горизонтали, так и по вертикали (и просто отбросьте те, которые не могут быть классифицированы до некоторого допуска),
  3. Прочно установите поворот, чтобы минимизировать отклонение линий от их ожидаемой ориентации (RANSAC вариант с решателем вращения).

Для 3., можно начинать без какого-либо RANSAC (просто установите наилучшее вращение на все горизонтальные/вертикальные линии) и добавьте его только в том случае, если есть заметные ошибки, о которых нужно позаботиться.

Что касается установки вращения к линиям, каждая строка может быть параметризована блоком 2D-вектором n и скаляром d s.t. 2D-точка M относится к строке iff n . M + d = 0. Вектор n дает ориентацию линии и на основании классификации ожидается, что она будет близка к эталонному вектору n_0 (e_x, -e_x, e_y или -e_y в зависимости от фактической классификации). Таким образом, возможной целевой функцией будет F(theta) = argmax_theta 1/2 sum_i | (R(theta) n^i) . n_0^i |^2, где theta - угол поворота 2D для применения, R(theta) - соответствующая матрица вращения 2 x 2. Эта целевая функция находит вращение, которое максимизирует выравнивание между повернутыми линейными векторами и ожидаемыми линейными векторами. Если квадрат выпадает из целевой функции, то целевая функция фактически сводится к упрощенной Kabsch algorithm/абсолютной ориентации в 2D без перевода/масштаба, которая может быть решена с помощью SVD.