Ответ 1
Вы видели это очень подробное объяснение алгоритмов искажения ImageMagick? Он также содержит немало иллюстраций.
От взгляда на образ вашего примера, я предполагаю, что вы доберетесь туда, используя Метод четырехточечного искажения.
Конечно, пример, который вы указали с параметром 0,0 0,0 0,0 0,0
, не делает того, что вы хотите.
Многие из методов искажения, доступных в ImageMagick, работают следующим образом:
- В методе используется набор пар контрольных точек.
- Значения представляют собой числа (могут быть плавающей точкой, а не только целыми).
- Каждая пара контрольных точек представляет координату пикселя.
- Каждый набор из четырех значений представляет собой координату исходного изображения, а затем сразу же координату целевого изображения.
- Передайте координаты для каждой контрольной точки исходного изображения в соответствующую контрольную точку целевого изображения точно так же, как заданные соответствующими параметрами.
- Перенести все остальные пиксельные координаты в соответствии с заданным методом искажения.
Пример:
S x1, S y1 D x1, D y1 S x2, S y2 D x2, D y2 S x3, S y3 D x3, D y3 ... S xn, S yn D xn, D yn
x
используется для представления координаты X. y
используется для представления координаты Y. 1
, 2
, 3
,... n
используется для представления первого, второго, третьего,... n-го пикселя. S
используется здесь для исходного пикселя. D
используется здесь для целевого пикселя.
Сначала: метод -distort perspective
Метод искажения perspective
гарантирует, что прямые линии в исходном изображении останутся прямыми линиями в целевом изображении. Другие методы, такие как barrel
или bilinearforward
, не имеют: они будут искажать прямые линии на кривые.
Для -distort perspective
требуется набор из не менее 4 предварительно вычисленных пар координат пикселей (где последний может быть равен нулю). Более 4 пар пиксельных координат обеспечивают более точные искажения. Итак, если вы использовали, например:
-distort perspective '1,2 3,4 5,6 7,8 9,10 11,12 13,14 15,16'
(для удобства чтения с использованием более {необязательных} пробелов между парами отображения, чем требуется) будет означать:
- Из исходного изображения возьмите пиксель в координате (1,2) и нарисуйте его по координате (3,4) в целевом изображении.
- Из исходного изображения возьмите пиксель в координате (5,6) и нарисуйте его по координате (7,8) на целевом изображении.
- Из исходного изображения возьмите пиксель в координате (9,10) и нарисуйте его по координате (11,12) в целевом изображении.
- Из исходного изображения возьмите пиксель в координате (13,14) и нарисуйте его по координате (15,16) в целевом изображении.
Возможно, вы видели фотоизображения, где вертикальные линии (например, углы строительных стен) не выглядят вертикально (из-за некоторого наклона камеры при съемке). Метод -distort perspective
может исправить это.
Он может даже достичь таких вещей, как "выпрямление" или "исправление" одного лица здания, которое появляется в "правильной" перспективе исходной фотографии:
==>
Контрольные точки, используемые для этого искажения, обозначаются углами красного (элементы управления источником) и синими прямоугольниками (элементами управления назначения), нарисованными над исходным изображением:
==>
Это конкретное искажение, используемое
-distort perspective '7,40 4,30 4,124 4,123 85,122 100,123 85,2 100,30'
Заполните команду для вашего удовольствия от копирования:
convert \
-verbose \
http://i.stack.imgur.com/SN7sm.jpg \
-matte \
-virtual-pixel transparent \
-distort perspective '7,40 4,30 4,124 4,123 85,122 100,123 85,2 100,30' \
output.png
Второе: метод -distort perspective-projection
Метод -distort perspective-projection
получен из более понятного метода perspective
. Он достигает точно такого же результата искажения, что и -distort perspective
, но не использует (по крайней мере) 4 пары значений координат (не менее 16 целых чисел) в качестве параметра, но 8 коэффициентов с плавающей запятой.
Он использует...
- Набор из ровно 8 предварительно вычисленных коэффициентов;
- Каждый из этих коэффициентов является значением с плавающей запятой (в отличие от
-distort perspective
, где для значений допускаются только целые числа); -
Эти 8 значений представляют собой матрицу вида
s x r y t x
r x s y t y
р <суб> хсуб> р <суб> усуб>который используется для вычисления целевых пикселей из исходных пикселей в соответствии с этой формулой:
X-of-destination = (sx*xs + ry+ys +tx) / (px*xs + py*ys +1) Y-of-destination = (rx*xs + sy+ys +ty) / (px*xs + py*ys +1) (TO BE DONE -- I've no time right now to find out how to properly format + put formulas into the SO editor)
Чтобы избежать (более сложного) вычисления 8 требуемых коэффициентов для повторно используемого метода -distort perspective-projection
, вы можете...
- ПЕРВЫЙ (проще) вычислить координаты для
-distort perspective
, - SECOND, запустите этот
-distort perspective
с добавленным параметром-verbose
, - ПОСЛЕДНИЕ, прочитайте 8 коэффициентов с выхода, напечатанного на stderr .
Приведенный выше пример команды (выше приведенный) выплевывает эту информацию:
Perspective Projection:
-distort PerspectiveProjection \
'1.945622, 0.071451, -12.187838, 0.799032,
1.276214, -24.470275, 0.006258, 0.000715'