Деформирует изображение так, чтобы изогнутые линии становились прямыми - PullRequest
2 голосов
/ 26 сентября 2011

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

У меня уже есть координаты всех точек отрезка, которые хранятся отдельно, поэтому их не нужно извлекать из изображения. Я ищу подходящий метод деформации изображения, чтобы эти линии были деформированы в прямые.

спасибо

Ответы [ 2 ]

1 голос
/ 22 июля 2014

Вы можете использовать методы, аналогичные разработанным здесь: http://www -ui.is.su-tokyo.ac.jp / ~ takeo / research / hard /

Что выdo, вы определяете сетку контрольных точек MxN, которая покрывает ваше исходное изображение.Затем вам нужно определить, как изменить каждую из ваших контрольных точек так, чтобы конечное изображение минимизировало некоторую энергетическую функцию (минимальную кривизну или что-то в этом роде).

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

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

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

После решения этих линейных уравнений вы получаете конечные точки сетки, а затем просто визуализируете свою 2D-сетку с позициями новых вершин.

0 голосов
/ 26 сентября 2011

Вам необходимо начать с формулы отображения, которая при заданной выходной координате будет предоставлять соответствующую координату из входного изображения.В зависимости от искажения, которое вы пытаетесь исправить, это может быть чрезвычайно сложным;Ваш вопрос не определяет проблему достаточно подробно.Например, совпадают ли кривые вверху изображения с кривыми снизу и такими же, как в середине?Сжимаются ли горизонтальные расстояния в зависимости от угла линии?Давайте предположим простейший случай, когда горизонтальная координата вообще не нуждается в коррекции, а вертикальная просто нуждается в постоянной коррекции на основе горизонтали.Здесь x,y - координаты на входном изображении, x',y' - координаты на выходном изображении, а f() - это разница между нарисованным отрезком линии и вашей идеальной прямой линией.

x = x'
y = y' + f(x')

Теперь вы просто просматриваете все пиксели выходного изображения, вычисляете соответствующую точку на входном изображении и копируете пиксель.Проблема заключается в том, что ваша формула, скорее всего, даст вам точки, которые лежат между входными пикселями, например y=4.37.В этом случае вам нужно будет интерполировать, чтобы получить промежуточное значение из входных данных;Есть много методов интерполяции для изображений, и я не буду пытаться вникнуть в это здесь.Самым простым будет «ближайший сосед», где вы просто округляете координату до ближайшего целого числа.

...