Как мы можем повернуть RGB-изображение, используя алгоритм интерполяции ближайшего соседа вокруг пользовательской точки вращения? - PullRequest
1 голос
/ 24 июня 2019

Я пытаюсь понять алгоритмы интерполяции изображений в компьютерном зрении. Я понимаю, что существует тонна методов интерполяции, таких как линейный, бикубический, ближайший сосед и т. Д. Для поворота изображения. Кажется, что метод ближайшего соседа является самым простым алгоритмом в этой области. Я понимаю основные понятия, например, когда мы поворачиваем изображение с матрицей вращения, новые строки и столбцы изображения переходят в значения с плавающей запятой из-за операций косинуса и синуса. Таким образом, мы должны усечь значения с плавающей запятой и выполнить интерполяцию для прогнозирования данных по отсутствующим координатам изображения ... Мне известны три сообщения, которые очень важны для этого вопроса: Пост 1 ; Пост 2 и Пост 3

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

Lena Sample Image

1 Ответ

2 голосов
/ 24 июня 2019

Простое вращение всегда о происхождении.Простое вращение (в 2D) задается следующей матрицей преобразования (здесь я использую однородные координаты ):

    ⎡ r1 -r2 0 ⎤
R = ⎢ r2  r1 0 ⎥
    ⎣ 0   0  1 ⎦

r1 и r2 связаны в том, чтовместе они образуют единичный вектор (r1^2 + r2^2 = 1).При вводе координат через это преобразование они вращаются вокруг начала координат.Например, учитывая вектор p, мы поворачиваем его, умножая влево на R.

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

         ⎡ 1 0 c1 ⎤  ⎡ r1 -r2 0 ⎤  ⎡ 1 0 -c1 ⎤
T' R T = ⎢ 0 1 c2 ⎥  ⎢ r2  r1 0 ⎥  ⎢ 0 1 -c2 ⎥
         ⎣ 0 0 1  ⎦  ⎣ 0   0  1 ⎦  ⎣ 0 0  1  ⎦

Умножение этого дает:

         ⎡ r1 -r2 -r1*c1+r2*c2+c1 ⎤   ⎡ 1 0 -r1*c1+r2*c2+c1 ⎤  ⎡ r1 -r2 0 ⎤
T' R T = ⎢ r2  r1 -r2*c1-r1*c2+c2 ⎥ = ⎢ 0 1 -r2*c1-r1*c2+c2 ⎥  ⎢ r2  r1 0 ⎥
         ⎣ 0   0   1              ⎦   ⎣ 0 0  1              ⎦  ⎣ 0   0  1 ⎦

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

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

...