Масштабирование, вращение и перевод с помощью матриц преобразования для компьютерного зрения

В Computer Vision часто необходимо масштабировать, переводить или поворачивать изображение. Библиотеки, такие как OpenCV, позволяют легко выполнять эти действия, однако понимание того, как эти преобразования работают на низком уровне, жизненно важно для возможности применения более сложных преобразований, а также для возможности оптимального использования библиотек компьютерного зрения. Поэтому в этой статье объясняются три простейших типа 2D-преобразования твердого тела: масштабирование, вращение и перемещение, а также а также примеры их применения.

Введение

Когда вы хотите масштабировать, поворачивать или переводить изображение, немедленным решением является применение преобразований к каждому из его пикселей по отдельности. Применяя одно и то же преобразование ко всем пикселям, преобразованные пиксели создадут новое изображение, которое будет исходным преобразованным изображением.

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

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

Чтобы узнать это, вы должны сначала понять, как представлено изображение. Двумерное изображение представляется в виде двумерной матрицы, так что пиксель в верхнем левом углу соответствует элементу с индексами (0, 0) матрицы. Точно так же пиксель в правом нижнем углу будет иметь индексы (n, m), что составляет nxm размер изображения. Следовательно, индексы каждого элемента матрицы представляют положение пикселя в изображении. Значение каждого матричного элемента, в свою очередь, представляет собой интенсивность цвета соответствующего пикселя и обычно находится в диапазоне от 0 до 255, где 0 соответствует черному цвету, а 255 — белому.

Индексы, которые каждый пиксель имеет в матрице, очень важны, поскольку они сообщают, какую позицию они занимают на изображении. Следовательно, поскольку преобразования состоят в изменении положения пикселей, задача будет состоять в том, чтобы отобразить пиксель из его исходных индексов в матрице (original_x, original_y) в новые индексы (new_x, new_y), как показано ниже.

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

Масштабирование

Под масштабированием понимается увеличение или уменьшение заданного твердого 2D-тела по оси x, оси y или по обоим направлениям. Матрица преобразования для масштабирования имеет следующий вид:

Измененное изображение будет увеличено по оси X в соответствии с масштабным коэффициентом s_x и по оси Y в соответствии с масштабным коэффициентом s_y. .

Вращение

Неудивительно, что вращение относится к вращению данного двумерного твердого тела вокруг начала координат. Матрица преобразования для поворота имеет следующий вид:

Измененное изображение повернется на θ градусов против часовой стрелки относительно исходной точки.

Перевод

Перевод относится к перемещению данного твердого 2D-тела в другое положение.

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

К счастью, перевода можно добиться с помощью матриц преобразования благодаря однородным координатам. При работе с однородными координатами любая n-мерная точка представляется в n+1-мерном пространстве, как показано на рисунке. Координата в дополнительном измерении, w,, обычно имеет значение 1.

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

Теперь, когда мы работаем с однородными координатами, матрица преобразования для перевода будет выглядеть так:

Измененное изображение будет преобразовано в единицы t_x по оси x и в единицы t_y по оси y.

Примеры трансформации

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

Пример масштабирования

Для этого примера мы будем использовать квадрат, показанный на изображении ниже, который образован четырьмя вершинами, расположенными в точках (0, 0), (0, 1), (1, 0) и (1, 1), и мы применим масштабирование 2 по оси x и 3 по оси y.

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

Теперь, когда у нас есть новые вершины, квадрат реконструируется. Как видно, новый квадрат вдвое длиннее первого по оси x и в три раза длиннее по оси y, что соответствует примененному нами масштабированию.

Ниже показано еще несколько примеров, чтобы показать эффект масштабирования по каждой оси независимо.

Пример вращения

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

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

Теперь, когда у нас есть новые вершины, квадрат реконструируется. Как видно, новый квадрат повернут на 45 градусов против часовой стрелки.

Пример перевода

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

Чтобы применить перенос к этому квадрату, мы применим перенос к каждой из вершин и заново сформируем квадрат из новых позиций вершин. Следовательно, первым шагом является вычисление новых позиций вершин путем применения трансляционного преобразования. Обратите внимание, что перемещение будет выполняться с использованием однородных координат, как объяснялось ранее, где w установлено в 1.

Теперь, когда у нас есть новые вершины, квадрат реконструируется. Как видно, новый квадрат сдвинут на 2 единицы по оси x и на 3 единицы по оси y.

Заключение

Как мы видели, матрицы преобразования — очень полезный инструмент при изменении изображений, поскольку они позволяют применять преобразования простым и автоматическим способом.

Однако применение этих матриц преобразования к реальным изображениям не так просто, как повторение и применение преобразования к каждому из пикселей изображения, поскольку, если, например, вы хотите применить вращение, могут быть некоторые пиксели, новое положение которых находится вне области изображения. Этот тип проблемы решается с помощью таких методов, как прямое отображение, обратное отображение или обратное отображение с билинейной интерполяцией, методы, которые будут объяснены и применяется в следующей статье Computer Vision.