Код осуществляет вращение вокруг центра изображения. Поскольку координаты в пределах изображения (индексы) начинаются с 1 в MATLAB, естественное начало вращения происходит вокруг пикселя, находящегося за верхним левым углом изображения. Согласно моему ответу на ваш предыдущий вопрос , такой поворот включает в себя смещение координат, применение матрицы вращения, а затем смещение их назад.
Код использует в качестве источника поворота центр изображения, x=n/2
, y=m/2
, с m
и n
размерами входного изображения. Затем он сдвигает повернутые координаты назад немного дальше, поэтому центр нового изображения находится в (mm/2
, nn/2
), с mm = m*sqrt(2)
и nn = n*sqrt(2)
размером выходного изображения. (Обратите внимание, что если мы поворачиваем на 45 градусов, нам нужно, чтобы выходное изображение было в sqrt(2)
раз больше входного размера, чтобы не потерять какие-либо данные, для меньших вращений мы могли бы сделать с меньшим выходным размером).
Если вы поместите все эти значения в матрицы, которые я показал в предыдущем ответе, вы должны (надеюсь) добраться до уравнений, показанных в коде.
Наконец, в коде есть условный оператор, позволяющий избежать чтения вне области входного изображения (индексирование за пределами границ приводит к ошибке). При повороте изображения и создании большего выходного изображения некоторые выходные пиксели будут отображаться в области за пределами входного изображения. Они оставлены в 0 в коде.
Обратите внимание, что код, связанный с, совсем не эффективен Он не выделяет выходную матрицу и, следовательно, многократно изменяет размер выходного массива при записи в него, что очень дорого. Это также может предварительно вычислить некоторые вычисления, выполненные в цикле, такие вещи, как cos(thet)
не меняются между итерациями цикла.